《2022年2022年集合框架的各自区别 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年集合框架的各自区别 .pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Collection:List 、Set 、Map 、HashMap 、HashTable 区别和联系如何在它们之间选择一、 Array ,Arrays Java所有 “ 存储及随机访问一连串对象” 的做法, array 是最有效率的一种。1、效率高,但容量固定且无法动态改变。array 还有一个缺点是, 无法判断其中实际存有多少元素,length 只是告诉我们array 的容量。2、Java中有一个 Arrays 类,专门用来操作array。arrays 中拥有一组static 函数,equals():比较两个array 是否相等。 array 拥有相同元素个数,且所有对应元素两两相等。fi
2、ll():将值填入array 中。sort():用来对array 进行排序。binarySearch():在排好序的array 中寻找元素。System.arraycopy():array 的复制。二、 Collection ,Map 若撰写程序时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库, array 不适用。1、Collection 和 Map 的区别容器内每个为之所存储的元素个数不同。Collection 类型者,每个位置只有一个元素。Map 类型者,持有key-value pair,像个小型数据库。2、各自旗下的子类关系Collection -List:将
3、以特定次序存储元素。所以取出来的顺序可能和放入顺序不同。 -ArrayList / LinkedList / Vector -Set : 不能含有重复的元素 -HashSet / TreeSet Map -HashMap -HashTable -TreeMap 3、其他特征* List,Set,Map 将持有对象一律视为Object 型别。* Collection 、List、Set、Map 都是接口,不能实例化。继承自它们的ArrayList, Vector, HashTable,HashMap 是具象 class,这些才可被实例化。* vector 容器确切知道它所持有的对象隶属什么型别。
4、vector 不进行边界检查。三、 Collections Collections 是针对集合类的一个帮助类。提供了一系列静态方法实现对各种集合的搜索、排序、线程完全化等操作。相当于对Array 进行类似操作的类Arrays。如, Collections.max(Collection coll); 取 coll 中最大的元素。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - Collections.sort(List list);
5、 对 list 中元素排序四、如何选择?1、容器类和Array 的区别、择取* 容器类仅能持有对象引用(指向对象的指针),而不是将对象信息copy 一份至数列某位置。* 一旦将对象置入容器内,便损失了该对象的型别信息。2、* 在各种 Lists中,最好的做法是以ArrayList 作为缺省选择。当插入、删除频繁时,使用LinkedList(); Vector总是比 ArrayList 慢,所以要尽量避免使用。* 在各种 Sets中, HashSet通常优于HashTree(插入、查找) 。只有当需要产生一个经过排序的序列,才用TreeSet 。 HashTree存在的唯一理由:能够维护其内元素
6、的排序状态。* 在各种 Maps 中HashMap 用于快速查找。* 当元素个数固定,用Array,因为 Array 效率是最高的。结论:最常用的是ArrayList,HashSet,HashMap, Array。注意:1、Collection 没有 get()方法来取得某个元素。只能通过iterator() 遍历元素。2、Set 和 Collection 拥有一模一样的接口。3、 List, 可以通过get()方法来一次取出一个元素。使用数字来选择一堆对象中的一个,get(0).。(add/get) 4、一般使用ArrayList。用 LinkedList 构造堆栈stack、队列 queu
7、e。5、Map 用 put(k,v) /get(k) ,还可以使用containsKey()/containsValue() 来检查其中是否含有某个 key/value。HashMap 会利用对象的hashCode 来快速找到key。 * hashing 哈希码就是将对象的信息经过一些转变形成一个独一无二的int 值,这个值存储在一个array 中。我们都知道所有存储结构中,array 查找速度是最快的。所以,可以加速查找。发生碰撞时,让array 指向多个values。即,数组每个位置上又生成一个梿表。6、Map 中元素,可以将key 序列、 value 序列单独抽取出来。使用 keySet
8、()抽取 key 序列,将map 中的所有keys生成一个Set。使用 values()抽取 value 序列,将 map 中的所有values 生成一个Collection 。为什么一个生成Set, 一个生成 Collection?那是因为, key 总是独一无二的, value 允许重复。- 特别介绍 1:HashTableVS HashMap HashTable的应用非常广泛,HashMap 是新框架中用来代替HashTable 的类,也就是说建议使用 HashMap,不要使用HashTable。这里简单分析他们的区别。名师资料总结 - - -精品资料欢迎下载 - - - - - - -
9、 - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 6 页 - - - - - - - - - 1.HashTable的方法是同步的,HashMap 未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector 和 ArrayList 一样。 (最主要的区别)2.HashTable不允许 null 值(key 和 value 都不可以 ),HashMap 允许 null 值(key 和 value 都可以,只容许有一个null 值的 key,可以有多个null 值的 value)。3.HashTable有一个 contains(
10、Object value) ,功能和containsValue(Object value) 功能一样。4.HashTable使用 Enumeration,HashMap 使用 Iterator 。以上只是表面的不同,它们的实现也有很大的不同。5.HashTable中 hash 数组默认大小是11,增加的方式是 old*2+1 。HashMap 中 hash 数组的默认大小是 16,而且一定是2 的指数。6.哈希值的使用不同,HashTable 直接使用对象的hashCode,代码是这样的:int hash = key.hashCode(); int index = (hash & 0 x7FF
11、FFFFF) % tab.length; 而 HashMap 重新计算hash 值,而且用与代替求模:int hash = hash(k); int i = indexFor(hash, table.length); static int hash(Object x) int h = x.hashCode(); h += (h 14); h += (h 10); return h; static int indexFor(int h, int length) return h & (length-1); 以上只是一些比较突出的区别,当然他们的实现上还是有很多不同的,比如HashMap 对 nu
12、ll 的操作。特别介绍 2:ArrayList VS Vector VS LinkList VECTOR 是每个操作都同步的,如果你觉得集合中的数据安全性要求很高那就用VECTOR ARRAYLIST 并不是线程安全的,除了这点,跟VECTOR没什么差别,都是通过数组的方式来实现一个集合LINKLIST跟 ARRAYLIST 的区别是, LINKLIST是用链表的方式实现的集合,所以在LIST的增、删、迭代等几个操作上,与 ARRAYLIST 速度有所差别。如果一个LIST需要频繁做删除操作的话应该选择LINKLIST ,ArrayList 适合随机访问名师资料总结 - - -精品资料欢迎下载
13、 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 6 页 - - - - - - - - - LinkedList 才是适合顺序访问的链但是其元素的增减比ArrayList 高. 特别介绍 3:HashSet VSTreeSet 两者区别的形象展示:假设输入值的顺序为:1,4,3,1,用 HashSet 输出的顺序为: 1,4,3(可能 );用 TreeSet输出的顺序为:1,3,4(如 Windows 的文件夹,不能重复,且有顺序)。HashSet 此类实现Set 接口,由哈希表(实际上是一个HashMap 实
14、例)支持。它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null 元素。此类为基本操作提供了稳定性能,这些基本操作包括add、remove、contains 和 size,假定哈希函数将这些元素正确地分布在桶中。对此集合进行迭代所需的时间与HashSet 实例的大小(元素的数量)和底层HashMap 实例(桶的数量)的“ 容量 ” 的和成比例。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。注意: HashSet要重写 hashCode和 equals 方法。我们应该为要存放到散列表的各个对象定义hashCode()和 equals(); i
15、mport java.util.HashSet; import java.util.Iterator; public class HashSetTest public static voidmain(String args) HashSet hs=new HashSet(); hs.add(new Student(1,zhangsan); hs.add(new Student(2,lishi); hs.add(new Student(3,wangwu); hs.add(new Student(1,zhangsan); Iterator it=hs.iterator(); while(it.ha
16、sNext() System.out.println(it.next(); class Student /HashSet 要重写 hashCode 和 equals 方法 int num; String name; Student(intnum,String name) this.num=num; this.name=name; public StringtoString() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 6 页 - - - - - - - - - re
17、turn num :+num+name:+name; public inthashCode() return num*name.hashCode(); public booleanequals(Object o) Student s=(Student)o; return num=s.num &name.equals(s.name); TreeSet 此类实现Set 接口,该接口由TreeMap 实例支持。 此类保证排序后的set 按照升序排列元素,根据使用的构造方法不同,可能会按照元素的自然顺序进行排序,或按照在创建set时所提供的比较器进行排序。是一个有序集合,元素中安升序排序,缺省是按照自
18、然顺序进行排序,意味着TreeSet 中元素要实现 Comparable 接口 ; 我们可以构造TreeSet对象时 ,传递实现了Comparator 接口的比较器对象. import java.util.*; public class TreeSetTest public static voidmain(String args) /TreeSet ts=new TreeSet(); TreeSet ts=new TreeSet(new SpareToStudent(); ts.add(new Students(2,zhangshan); ts.add(new Students(3,lishi
19、); ts.add(new Students(1,wangwu); ts.add(new Students(4,maliu); Iterator it=ts.iterator(); while(it.hasNext() System.out.println(it.next(); class Students implements Comparable int num; String name; Students(int num,String name) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - -
20、 - - - 第 5 页,共 6 页 - - - - - - - - - this.num=num; this.name=name; static classcompareToStudent implementsComparator / 定义一个内部类来实现比较器 public int compare(Object o1, Object o2) Students s1=(Students)o1; Students s2=(Students)o2; int rulst= s1.num s2.num ? 1 :(s1.num=s2.num ? 0 :-1); if(rulst=0) rulst=p
21、areTo(s2.name); return rulst; public intcompareTo(Objecto) / 写具体的比较方法 int result; Students s=(Students)o; result=num s.num ? 1:(num=s.num ?0 : -1); if(result=0) result=pareTo(s.name); return result; public StringtoString() return num+:+name; 总结HashSet是基于 Hash算法实现的 ,其性能通常优于TreeSet,我们通常都应该使用HashSet,在我们需要排序的功能时,我门才使用TreeSet。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 6 页 - - - - - - - - -