单值类型集合总结:
不同 | 添加 | 删除(下标) | 删除元素 | 包含元素 | 数据结构 | 构造方法 |
---|---|---|---|---|---|---|
List (ArrayList) | (不唯一) | list.remove(下标) | list.remove(元素)/迭代器 元素为基本数据类型时需要区别于下标 比较机制:equals() | list.contains(元素) 比较机制:equals() | 数组 | a.()[默认开辟10块空间] b.(int) |
Set (HashSet) | (唯一) hashCode() == equals() | 无 | set.remove(元素)/迭代器 比较机制:hashCode() == equals() | set.contains(元素) 比较机制:hashCode() == equals() | 哈希表 | a.()[默认开辟16块空间] b.(int,float) 阈值:int*float【每个小组最多承载量】 |
SortedSet (TreeSet) | (唯一) compareTo()/compare()[比较器] | 无 | set.remove(元素)/迭代器 比较机制:compareTo()/compare()[比较器] | set.contains(元素) 比较机制:compareTo()/compare()[比较器] | 二叉树 | a.()[默认开辟16块空间] b.(比较器) |
Collections:父接口 | ||
---|---|---|
共有的方法 | 共有的遍历方式 | 共有的特点 |
add(元素) clear() remove(元素) size() addAll(集合) iterator() contains(元素) removeAll(集合)retainAll(集合) (9个) | foreach + 迭代器 | 当我们使用迭代器遍历集合的过程中 不允许对集合的整体进行添加、删除操作 否则触发CME异常 如果在遍历的时候想要删除的话:ite.remove() |
(1)List:[有序 不唯一] | ||
特有的方法 | get(下标) remove(下标) | |
特有的遍历 | for + 下标 | |
特点 | 1.当我们想要往List集合里面添加元素的时候:list.add(元素) -》 不需要做比较 2.当我们想要从List集合里面删除元素的时候: list.remove(下标) -》 不需要做比较 list.remove(元素) -》 需要做equals()比较 3.当我们想要判断List集合里面是否存在某个元素的时候: list.contains(元素) -》 需要做equals()比较 | |
实现类 | 数据结构 | 构造方法 |
ArrayList | 数组 | ArrayList()/ArrayList(int 空间大小)/ArrayList(单值集合) |
Vector | 数组 | Vector(int 空间)/Vector(int 空间,int 步长) |
LinkedList | 链表 | LinkedList()/LinkedList(单值集合) |
Stack | 栈 | Stack() |
(2)Set:[无序 唯一] | ||
特有的方法 | 无 | |
特有的遍历 | 无 | |
特点 | 1.当我们想要往Set集合里面添加元素的时候:set.add(元素) -》 需要hashCode() == equals() 2.当我们想要从Set集合里面删除元素的时候:set.remove(元素) -》 需要hashCode() == equals() 3.当我们想要判断Set集合里面是否存在某个元素: set.contains(元素) -》 需要hashCode() == equals() | |
实现类 | 数据结构 | 构造方法 |
HashSet | 哈希表 | HashSet()/HashSet(int 分组,float 加载因子) |
SortedSet:[有序 唯一] | ||
特有的方法 | first() last() pollFirst() pollLast() | |
特有的遍历 | 无 | |
特点 | 1.当我们想要往SortedSet集合里面添加元素的时候: set.add(元素) -》 需要compareTo()/compare() 2.当我们想要从SortedSet集合里面删除元素的时候: set.remove(元素) -》 需要compareTo()/compare() 3.当我们想要判断SortedSet集合里面是否存在某个元素: set.contains(元素) -》 需要compareTo()/compare() | |
实现类 | 数据结构 | 构造方法 |
TreeSet | 二叉树 | TreeSet()/TreeSet(比较器) |
注意 | 注意:当一个对象已经添加进TreeSet集合之后,不要随意的修改那些参与排序的属性值,如果在添加之后想要修改的话:删除 + 修改 + 添加 | 注意:当一个对象已经添加进HashSet集合之后,不要随意的修改那些参与生成哈希码值的属性值,如果在添加之后想要修改的话:删除 + 修改 + 添加 |
面试题
-
List Set Map属于同一个等级吗?不是
List Set属于Collection的子接口
Collection和Map属于同一个等级 -
2.Collection和Collections之间的区别?
Collection是单值类型集合统一的父接口
Collections是集合的工具类 -
Collections.addAll()底层实现 元素个数为什么可以随意?可变参
-
ArrayList和Vector之间的区别?
1):同步特性不同
ArrayList同一时间允许多个线程访问 效率较高
但是可能会出现并发错误 Vector同一时间允许一个线程进行访问 效率较低
但是不会出现并发错误 2):扩容机制不同
ArrayList
jdk6.0及之前 x*3/2+1
jdk7.0及之后 x+(x>>1) Vector
Vector(int)
Vector(int,int) 3):出现的版本不同
ArrayList since jdk1.2
Vector since jdk1.0 -
如何将线程不安全的ArrayList变成线程安全的List集合?
List x = Collections.synchronizedList(ArrayList对象)
-
CME检测原理?
计数器的原理
每一个集合都有一个modCount遍历 用来记录对集合的
处理次数[添加 、 删除 修改…]
当通过集合得到迭代器的时候 底层会自动的将集合的modCount的
值拷贝到迭代器自己的属性里面
每一次car.next()触发两个值的比较
如果两个值不同步了 那么出现CME异常 -
ArrayList和LinkedList之间的区别?
ArrayList底层基于数组实现的
优点:随机访问 遍历查找
缺点:添加、删除效率低 LinkedList底层基于链表实现的
优点:添加 删除效率高
缺点:随机访问 遍历查找效率低 -
List Set存取元素特性有什么不同?
List存的时候不需要作比较 直接添加
List取的时候
remove(下标) 不需要比较
remove(元素) 需要比较equals Set存的时候需要做hashCode() == equals()
Set取的时候需要做hashCode() == equals()