List arr1 = Arrays.asList(new int[]{12,33});
arr1.size() //1
List arr2 = Arrays.asList(new Integer[]{12,33})
arr2.size() //2
ArrayList LinkedList Vector的异同:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ilNG2f8D-1592220099106)(E:\笔记\Pictures\QQ图片20200605212557.png)]
ArrayList源码分析:
JDK7:
初始10,扩容1.5倍
结论:在知道大概范围的时候,建议采用带参构造器。
JDK8:
初始{},第一次add()时才创建长度10的数组,后续与JDK7无异
小结:JDK7中类似创建单例的饿汉式,而JDK8类似于单例的懒汉式,延迟了数组的创建,节省内存。
LikedList源码分析:
创建时,内部声明了Node类型的first和last属性,默认值是null。
Vector源码分析:
创建长度10的数组,默认扩容为原来的2倍。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HWH08dKs-1592220099111)(E:\笔记\Pictures\QQ图片20200605235102.png)]
这个输出为 [1,2]
HashSet: 内部结构:数组+链表
- 无序性
- 不可重复性
添加元素a时,首先调用a的hashCode()方法,计算其哈希值,判断数组在此位置上是否已经有元素,若没有,则添加成功,。。。。。
JDK7:元素a放到数组中,指向原来的元素。
JDK8:原来的元素在数组中,指向元素a
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VYfCa058-1592220099114)(E:\笔记\Pictures\QQ图片20200606002708.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uZl2Gz72-1592220099117)(E:\笔记\Pictures\QQ图片20200606011532.png)]
要求:
- 向Set添加的数据,其所在的类一定要重写hashcode()和equals()方法
- 重写的hashCode()和equals()尽可能保持一致性。
即相等的对象必须具有相等的散列码(hashcode)
重写hashCode()方法的基本原则
- 同一个对象多次调用hashCode()应该返回相同的值
- 当两个对象的equals()方法比较返回true时,其hashCode()也应相等
- 对象中用作equals()方法比较的Field,都应该用来计算hashCode的值。
无序指放置的位置无序,按照(hashcode)
LinkedHashSet
作为HashSet的子类,在添加数据的同时,每个数据还维护了两个引用,用来记录次数据的前数据和后数据。
优点:对于频繁的遍历操作,此效率高于HashSet
TreeSet : 可以按照添加对象的指定属性,进行排序
1.添加的数据,要求是相同类的对象。
2.两种排序方式:自然排序(实现Comparable接口) 、 自订排序
3.自然排序中,比较两个对象是否相同的标准为compareTo()返回0,不再是equals()。
TreeSet和TreeMap采用红黑树的存储结构,特点是有序,查询速度比List快。
自订排序:
Comparator com = new Comparator(){…}
TreeSet set = new TreeSet(com)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sgzVGZvC-1592220099119)(E:\笔记\Pictures\QQ图片20200606021356.png)]
--------------------------------------------------------------------------------------------------------------------Map:
KeySet —— Values Entry
JDK7:
在实例化之后,底层创建了长度16的一维数组Entry[] table
。。。。。。。可能已执行多次put…
map.put(key1,value1):
首先,调用key1所在类的hashCode()计算key1哈希值,得到在Entry数组中的存放位置
如果此位置为空,则添加成功。
如果不为空,比较与已经存在的一个或多个数据,比较其哈希值。
如果都不相同,则添加成功。
如果相同,继续比较,通过equals比较。
如果返回false,此时添加成功。
如果返回true,使用value1替换原来的value。
补充:
- 新加数据和原来的数据以链表的方式存储。
- 默认的扩容方式:扩容为原来的2倍,并将原有的数据复制过来
JDK8:
new HashMap()的时候底层不创建长度为16的数组。首次创建时才创建长度16的数组。
底层的数组是Node[],而非Entry[]。
jdk7:数组+链表 jdk8:数组+链表+红黑树
某一位置链表数据个数>8,且当前数组长度>64,此时此索引位置上的所有数据改为使用红黑树。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CymaBDaI-1592220099121)(E:\笔记\Pictures\QQ图片20200606101946.png)]
Map获取数据:
Map map = new HashMap();
map.put("chinese",88);
map.put("math",99);
map.put("english",77);
map.put("esle",82);
Set set = map.keySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
Collection collection = map.values();
Iterator iterator1 = collection.iterator();
while (iterator1.hasNext()){
System.out.println(iterator1.next());
}
Set set1 = map.entrySet();
Iterator iterator2 = set1.iterator();
while (iterator2.hasNext()){
System.out.println(iterator2.next());
}
Properties
Properties pros = new Properties();
FileInputStream fis = new FileInputStream("yorumi.txt");
pros.load(fis);
String math = pros.getProperty("math");
System.out.println(math);
Collections工具类:操作Collection 、Map 的工具类
Collections.copy(dest,src)
List list = new ArrayList();
list.add(11);
list.add(22);
list.add(16);
list.add(56);
List dest = Arrays.asList(new Object[list.size()]);
Collections.copy(dest,list);
System.out.println(dest);
Collections里的线程安全方法。
List list1 = Collections.synchronizedList(list);