学习笔记
Collection和Collections的区别
- Collection是一个集合接口,提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如List、Set等
- Collections是一个包装类,包含了很多静态方法,不能被实例化,像是一个工具类,比如提供排序的方法:
Collections.sort(list)
HashMap和Hashtable的区别
- HashMap允许key和value为null,Hashtable不允许
- Hashtable是线程安全的,HashMap不是
- 单线程下HashMap 多线程下ConcurrentHashMap
ArrayList和LinkedList
在需要频繁读取集合中的元素时,更推荐使⽤ ArrayList,⽽在插⼊和删除操作较多时,更推荐
使⽤ LinkedList
实现数组和List 之间的转换
-
数组转 List:使⽤ Arrays.asList(array) 进⾏转换
-
List 转数组:使⽤ List ⾃带的 toArray() ⽅法
Vector和ArrayList
- Vector使用
synchronized
进行同步,线程安全,ArrayList线程不安全 - Vector扩容每次扩充1倍,ArrayList每次扩充50%
Queue中poll()和remove()
-
相同点:都是返回第⼀个元素,并在队列中删除返回的对象。
-
不同点:如果没有元素 poll()会返回 null,⽽ remove()会直接抛出`NoSuchElementException``异常。
迭代器Iterator
迭代器Iterator提供遍历任何Collection的接口
List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while(it.hasNext()){
String obj = it.next();
System.out.println(obj);
}
更加安全,因为可以确保在当前遍历的集合被修改的时候,会抛出异常
-
Iterator可以遍历Set和List集合,单项遍历
-
ListIterator只能遍历List,双向遍历
previous()
+next()
,迭代器默认的初始地址为首个元素,此时调用previous()
是不能获取到元素的,当调用过next()
后才可以获取到。可以添加一个元素、替换一个元素、获取前面或者后面元素的索引位置。注意此时添加替换元素是不会抛出异常的,添加的元素位置在此次迭代的it的后一个,添加后it指向的是添加元素的下一个,比如:
List<String> list = new ArrayList<>(); list.add("1111"); list.add("22222"); ListIterator<String> it = list.listIterator(); while(it.hasNext()){ String obj = it.next(); System.out.println(obj); it.add("12345"); //it.set("12345"); }
此时执行完1111后,迭代器内部是1111,12345,2222。此时it指向的是2222,而不是12345。
确保集合不被修改
使用Collections.unmodifiableCollection(Collection c)
来创建一个只读集合,改变这个集合的任何操作都会抛出异常。
List<String> list = new ArrayList<>();
list.add("x");
List<String> clist = Collections.unmodifiableList(list);
//运行时报错
clist.add("y");
System.out.println(clist.size());