迪杰斯特拉算法解决的问题是:
在一个有向图中,求图中一个节点到其他所有节点的最短距离
分析这几种情况(jdk 1.8):
情况一:1
2
3
4
5
6String str1 = new String("hel") + new String("lo");
// 并没有在常量池里创建 "hello"
String str2 = new String("ja") + new String("va");
// 虽然这条语句没有在常量池创建 "java",但常量池之前已经存在 "java"
System.out.println(str1.intern() == str1);
System.out.println(str2.intern() == str2);
ArrayMap 是 Android 的 API,它和 Java 的 HashMap 相比,虽然在查找效率上不如 HashMap(HashMap 查找的时间复杂度是 O(1), ArrayMap 查找的时间复杂度是 O(logn)),但是 ArrayMap 的空间消耗更小,它内部使用数组存储 hash 和键值对,不用花费多余的指针维护链表或树结构,扩容的时候只扩容 1.5 倍,并且元素小于一定量后还会收缩数组来回收空间。所以在数据量不大并且需要节省空间的时候可以考虑 ArrayMap。
下面就从源码的角度看下 ArrayMap 的实现原理,主要看它的增删查方法。
ConcurrentHashMap 是一个加强版的 HashMap,它支持并发操作。比起 HashTable 直接锁住整个数组,ConcurrentHashMap 锁的粒度更细,锁的是单个数组元素,而且有些操作例如初始化,对数组元素赋值等使用的是 CAS 方法。并且在扩容的时候支持并发扩容,速度更快。
下面就来看下 ConcurrentHashMap 的源码,主要分析它的初始化、扩容、put、get 操作及相关延伸。
LinkedList 底层的实现是双向链表,因而它改查的效率较低,而在增删方面,由于不用进行数据的整体移动,所以在中间进行增删时具有较高的效率。
下面就从源码入手,对 LinkedList 的增删改查作进一步的了解。
1 | public void selectionSort(int[] a) { |
1 | public void bubbleSort(int[] a) { |