- 集合中存储的都是引用。集合在java中就是一个容器,是一个对象,集合中任何时候都是‘引用’;
- 所有的集合类和集合接口都在 java.util.* 里面。
- 集合分单元素集合和双元素集合
单元素集合
超级父类接口是 Itreable 可迭代的,再往下是 Collection 接口,所有的单元素集合实现了 Iterable 接口都有 iterator()方法,获得迭代器对该集合进行迭代。
Collection 接口下面是 List 和 Set,都是单元素,List 里面元素有序可重复,有下标,下标从0开始,进去什么顺序出来就什么顺序。Set 里面无序不可重复,没下标。
List 的常用实现类有 ArratList, LinkedList, Vector, LinkedList 是双向链表实现。ArratList,Vector,底层都是数组,ArratList 是非线程安全的,Vector是线程安全的。Vector线程安全但效率较低,现在使用较少,有别的方法保证线程安全。
java双向队列 Deque的主要实现类就是 LinkedList,双向队列可以代替单向队列,Stack 使用。
Set 集合的实现类常用的有 HashSet 和 TreeSet ,Set和TreeSet中间还有一个SortedSet 接口,HashSet 底层是 HashMap, TreeSet 底层是 TreeMap。
注意: sortedSet 接口和其实现类 TreeSet 是可排序集合,放入其中的元素自动排序。HashSet不排序
双元素集合
Map集合和Set集合没有关系,Map的key和value存储的都是引用,
Map下面有HashMap,HashTable,TreeMap,HahMap 和 hashTable底层都是Hash表,HashTable是线程安全的,效率低已不怎么使用。Map下面有SortedMap接口,他有实现类 TreeMap,里面的元素的键是可以排序的。
java属性类 Properties 就是继承自HashTable,是线程安全的。键值对都必须是String。
SortedSet, SortedMap集合特定,无序不可重复但是可排序。无序指的是进出顺序不一致,且没有下标。
单元素集合总接口Collection常用方法
其中的 contains 的判断依据是比较集合类元素的equals方法返回的结果,具体得看元素有没有重写equals方法,要是没有重写则比较的是哈希地址,重写了则比较的是内容。
双元素集合MAP常用方法
keySet方法可以返回集合的 keyset, values就所有的值以Collection的形式返回。
HashMap 底层代码
hashmap底层是哈希表,哈希表是数组和链表的结合,结合了数组和链表的优点。Node结点数组,数组里的每个Node是个链表,Node结点有个属性是哈希值,是key的hashcode()方法的执行结果,哈希值通过哈希算法可以获得数组下标。
map.put(k,v)方法执行的过程,先会将key value封装到 node 里,算出key的哈希值即数组下标,按照链表往里插,已经有的元素则覆盖,没有则插到链表底部。
map.gut(k)方法执行的过程,先获得key的哈希值,通过哈希算法转换成数组下标,在该下标的链表上和每个key进行equals比较,知道true时返回,否则返回null。
hashmap重点:
hashcode方法 和 equals 方法都得重写。和HashSet 一样。
同一个链表上的node结点的哈希值一样,因为他们的数组下标一样。但key不一样,因为不可重复,否则覆盖。
还要注意散列分布均匀,初始化容量要是2的倍数,更容易达到散列均匀。
终极结论:放在hashMap的key部分,和放在hashSet中的元素,需要重写hashcode方法和equals方法。用IDEA直接生成就行啦