赞
踩
Java 的集合类很多,主要分为两大类,如图 :
1.List的集合类中的元素是有序的,添加和取出顺序是一致的,并且元素可以重复。
2.List的集合类中的每个元素都有对应的顺序索引,即支持索引获取元素,类似数组。
ArrayList可以加入null,并且多个
ArrayList是由数组来实现数据存储的。底层维护了一个Object类型的数组elementData。
transient Object[] elementData;
transient表示瞬间,短暂的,表示该属性不会被序列号
Vector基本等同于ArrayList,除了ArrayList是线程不安全(执行效率高).在多线程情况下,不建议使用ArrayList
Vector底层也是一个对象数组,protected Object[] element Date;
Vector是线程安全的,即线程同步。Vector的操作方法都有synchronized修饰。
当创建Vector对象时,如果使用无参构造器,则数组初始化容量是10,如果指定大小,则初始值为指定大小,满后按2倍扩容。
由于底层是双向链表,所以LinkedList的元素的添加和删除,相对数组来说效率较高。
LinkedList没有实现同步,是线程不安全的
注
:可以先了解HashMap集合。
如图,LinkedHashSet底层维护了一个数组+双向链表,在添加元素时,先求hash值,然后求索引,确定元素在数组中的位置。
如果该位置上没有元素,直接放到该位置上。如果该位置上有元素,则需要通过equals方法进行判断,如果相等,则不添加。如果不相等,则添加到双向链表中。
这样我们在遍历LinkedHashSet时,可以确保插入顺序和取出顺序是一致的。
注
:这里讲的是JDK8的Map接口特点
存储元素时先通过hashCode方法获取到元素的哈希值。
对哈希值进行计算,得到一个索引值,确定在数组中的位置。
如果该位置上没有元素,直接放到该位置上。如果该位置上有元素,则需要通过equals方法进行判断,如果相等,则不添加。如果不相等,则以链表的方式添加。
在java8中,如果一条链表元素个数达到8,并且数组容量达到64(默认,可以修改),就会进化成红黑树结构。
第一次添加元素时,table数组扩容到16,并且有一个临界值=当前容量*加载因子(默认0.75),所以一开始临界值为12,当数组使用到了12时,就会进行2倍扩容,不需要到16等数组满。
注
:可以配合HashSet中的图进行理解。
存放的元素是键值对:即K-V
hashtable的键和值都不能为null,否则会抛出NullPointerException
hashTable使用方法基本上和HashMap一样
hashTable是线程安全的(synchronized),所以效率较低
均为 static 方法
reverse(List)
: 反转 List中元素的顺序shuffle(List)
: 对List集合元素进行随机排序sort(List)
: 根据元素的自然顺序对指定List集合元素按升序排序sort(List, Comparator)
: 根据指定的Comparator产生的顺序对 List集合元素进行排序swap(List,int,int)
: 将指定list集合中的i处元素和j处元素进行交换Object max(Collection)
:根据元素的自然顺序,返回给定集合中的最大元素Object max(Collection, Comparator)
:根据Comparator指定的顺序,返回给定集合中的最大元素Object min(Collection)
;根据元素的自然顺序,返回给定集合中的最小元素Object min(Collection,Comparator)
;根据Comparator指定的顺序,返回给定集合中的最小元素int frequency(Collection,object)
:返回指定集合中指定元素的出现次数void copy(List dest,List src)
:将src中的内容复制到dest中boolean replaceAll(List list,Object oldVal, Object newVal)
:使用新值替换List 对象的所有旧值更多内容请移步个人博客:乌托邦
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。