集合:
用来表示一组被称为元素的对象,一些集合允许数据重复,一些集合不允许数据重复
集合与数组的区别:
1:数组的长度固定,而集合的长度可变
2:数组的存储类型单一,而集合并不单一。
Collection接口:
是所有集合的根元素继承与Iterable。
Iterable接口:是一个迭代器,里面有默认增强for循环的实现,也可以返回Iterator迭代器。
Iterator: 就是一个最原生迭代器。
List接口,集合的一种:
ArrayList:
使用动态数组实现,初始容量是10,每次扩容1.5,有序,元素可重复,线程不安全由于数组是Java底层自带的数据结构,有下标的存在,所以查询的速度较快,对于更改以及删除较慢。
LinkedList:
双向链表的结构,里面有一个Node类用来充当节点,由于链表不牵扯扩容,所以不牵扯到长度限制以及扩容,链表中不存在真实的下标,每一次操作几乎都要通过迭代,所以其查询速度较慢,但是由于不需要维护下标所以更改与删除较快,
线程不安全。
Vector :
底层使用动态数组实现,由于大部分方法都被synchronized实现所以线程是安全的,但是速度较慢。
Map:
虽然map是我们集合框架的一部分,但是其并没有继承我们的collection接口,Map里面需要传入两个泛型,是一个key value键值对存在。
HashMap与HashTable的区别:
1:作者不同
2:诞生时间不同HashTable诞生于JDK1.0,HashMap诞生于JDK1.2
3:继承父类不同HashTable继承于Dictionary,HashMap继承于AbstractMap
4:对外提供的方法不一样,HashTable比HashMap多了两个方法,elements与contains方法。
5: key与value对null的支持不一样,HashTable不支持,HashMap支持。
6:线程安全不同HashTable安全,HashMap不安全
7:计算hash值的方式不同
8:初始容量不同HashTable的初始容量是11,每次扩容是2n+1,HashMap是16,每次扩容是2n(2倍)
如何解决HashMap线程安全问题:
1:ConcurrentHashMap 是HashMap的代替品,由于里面用了同步代码块所以线程是安全的。
2:使用同步代码块对 map加锁。
set:
继承于Collection接口,但是其底层是使用map的key来实现的,所以没有下标的存在,值无序并且值不能重复。由于set需要使用hashCode算法与equals方法来对比元素是否重复,所以我们写的类需要重写这两个方法。
set如何保证value不重复:
1:对比value的hash值(是否发生了hash碰撞)是否相同,如果hash值相同就用equals方法对比值是否相同
因为如果两个对象的hash值相同的话,有可能值是不同的(Aa与BB),如果hash值不同代表肯定值不同。
TreeSet与HashSet的区别:
…
Comparable接口,用来定义排序的接口,实现这个接口需要重写compareTo方法,我们可以在方法内对比对象的属性,如果返回1代表排后面,如果返回-1代表排在前面,当我们的类实现了这个接口后,就可以使用TreeSet自然排序以及使用Collections.sort(list)方法对集合排序。
Comparator接口,用来定义排序的接口,实现这个接口需要重写compare方法,我们可以在方法内对比对象的属性,如果返回1代表排后面,如果返回-1代表排在前面,当我们的类实现了这个接口后,就可以使用Collections.sort(list,接口实现类对象)方法对集合排序。