Java中集合的原理以及差别
java中的集合类实现collection接口,collection接口继承iterator。
collections是对集合操作的一个工具类。
List集合
ArrayList:继承AbstractArrayList类,是一个对象数据,达到上限时扩大到当前的1.5倍。线程不安全。
LinkedList:是一个双向列表,header的前驱表为最后一个元素,后驱表为第一个元素。新增和删除数据快,查询数据慢。
Vector:继承AbstractArrayList类,是一个对象数组,有同步锁,线程安全。初始大小为10。类似于ArrayList。超过大小,增加 为原来的2倍。
map集合
Hash Map:通过key的hashCode和key的hashCode右移16位的异或运算获得hashCode;是一个数组列表。hashCode()方法, 是将迭代器遍历过程中所有经过的node的hashCode()相加,node中hash()的计算方法为key的hashCode异或value 的hashCode。
HashTable:类似于hashMap,是线程安全的。key和value不能为null。当数据量变大时,ConcurrentHashMap效率更高,因为 Hashtable锁定整个Map,而ConcurrentHashMap采用分割(锁定当前正在使用的对象),只锁定部分Map。(扩 展:hashMap不能存放null是因为他是线程安全的,查询过程中不知道是因为没有key为空还是value本来就是空, containsKey()方法调用查询是否存在key时,可能map已经被修改。)
TreeMap:是一个红黑树。是有序的。排序快。hashMap在插入,删除和定位数据更快。
set集合
HashSet:是基于hashMap实现,hashCode取所有对象的HashCode值相加。equals方法比较集合中是否包含key。hashMap需 要比较key和value。
LinkedHashSet:继承HashSet,无特别重写方法。
array和ArrayList的区别:array是一个数组,array的长度是固定的,只能存储同一类型数据。arrayList是一个动态数据,长度是可变的,不指定泛型的情况下,可以存储任何类型数据。
将集合设置为不可修改:使用Collections的unmodifiedXXX()方法。
Collections中的SynchronizedXXX()方法可以将不是线程安全的集合转化为线程安全的集合。代理原有的方法加入同步锁,属于静态代理。
iterator是一个提供迭代遍历集合方法的接口。
iterator可以在遍历过程中对集合进行修改,但是删除数据可能会导致遍历丢失数据。next()通过游标返回下一个元素。不过只能重头遍历。for遍历性能最好,iterator次之,foreach最差。
iterator和listIterator:listIterator只有list集合拥有,且在执行过程中可以向list中增加数据,可以实现向前(previous()方法)和向后遍历,可以定位当前索引的位置nextIndex()和previousIndex()。iterator所有对象都有,执行过程中不能增加元素,只能向后遍历,无法定位索引位置。都可以实现对元素的删除和修改。
Java集合详解
本文详细解析了Java中List、Map和Set等集合类的原理及差异,包括ArrayList、LinkedList、HashMap、TreeMap等的具体实现特点,并对比了array与ArrayList的区别。
1252

被折叠的 条评论
为什么被折叠?



