浅谈Java容器

1、Java容器

在Java中,一切皆对象,容器就是能保存Java对象的类。数组需要提前确定大小,而容器较为灵活。Java容器是Java API提供的一系列类的实例。由于在程序中存放对象,主要位于java.util中,其程度不受限制,类型不受限制。

 

2、Java容器的作用

(1)保存对象。

(2)容器中存放了对象引用,能提供方便的查询、遍历、修改等基本接口。

 

3、Java容器的分类

(1)Collection接口:存放独立元素的序列,包含List和Set接口。最基本的集合接口,一个Collection代表一组Object,即Collection的元素。Java SDK不提供直接继承Collection的类,其提供的类都是继承自Collection的子接口如List和Set。

---List接口:有序,利用索引定位位置来访问元素,类似于Java的数组。和Set不同,List允许有相同的元素。List接口包含LinkedList类、ArrayList类、Vector类和Stack类。

——LinkedList:链式存储,数据结构采用链表,每一个节点都包含前一个节点的引用、后一个节点的引用和节点存储的值。(双向链表)。删除和添加效率高,但随机访问元素效率低。

——ArrayList:顺序存储,数据结构采用线性表,随机访问元素效率高,但删除和添加效率低。


---Set接口:不包含重复元素。包含HashSet类、TreeSet类和LinkedHashSet类。

——HashSet:不能保证元素的顺序,集合元素可以是null但只允许放入一个null。当向HashSet结合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值来决定该对象在HashSet中存储位置。HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相等。注意,如果要把一个对象放入HashSet中,重写该对象对应类的equals方法,也应该重写其hashCode()方法。其规则是如果两个对象通过equals方法比较返回true时,其hashCode也应该相同。另外,对象中用作equals比较标准的属性,都应该用来计算hashCode的值。

——TreeSet:可以确保集合元素处于排序状态。支持自然排序和定制排序,自然排序使用Comparable接口里面的obj1.CompareTo(obj2)实现升序排序,定制排序使用Comparator接口,实现 int compare(T obj1,T obj2)方法。TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0。

——LinkedHashSet:同样是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素顺序,元素是以插入顺序保存的,遍历该集合时,LinkedHashSet将会以元素的添加顺序访问集合的元素。LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但插入时性能稍微逊色于HashSet。


(2)Map接口:存放键值对对象,包含Hashtable类、HashMap类、TreeMap类。使用键查找值,一个Map中不可包含相同的key,每个key只能映射一个value,即一一映射。Map集合的内容可以被当做一组key集合,value集合,或一组key-value映射。

——HashTable:以哈希表数据结构实现,解决冲突时与HashMap一样采用散列链表,但性能比HashMap低。

——HashMap:以哈希表数据结构实现,查找对象时通过哈希函数计算其位置,能快速查询,其内部定义了一个hash表数组,元素会通过哈希函数将元素的哈希地址转换成数组中存放的索引,如果有冲突,则使用散列链表将所有相同哈希地址的元素串起来。允许null,即null key和null value。

——TreeMap:键以某种排序规则排序,以红-黑树数据结构实现,实现了SortedMap接口。

 

4、哈希表

对象的存储位置和对象的关键属性(设为k)之间建立一个特定的对象关系(设为f),是每个对象与一个唯一的存储位置相对应。查找时,只需根据待查对象的关键属性k计算f(k)的值即可。

数组和向量都可以存储对象,但对象的存储位置是随机的,当要查找一个对象时,只能以某种顺序(如顺序/二分查找)与各元素进行比较,当元素较多时,效率较低。哈希表能够快速定位想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查询,采用函数映射的思想将记录的存储位置与记录的关键字关联。

Java使用哈希表类(Hashtable)来实现哈希表,相关概念如下:

(1)容量capacity:Hashtable的容量不是固定的,随对象的加入其容量也可自动增长。

(2)关键字key:每个存储的对象都需有一个关键字,一个Hashtable中所有关键字唯一。

(3)哈希码Hash Code:若要将对象存储在Hashtable上,就需将其关键字映射到一个整型数据,成为key的哈希码。

(4)项Item:Hashtable中每一项都有两个域,关键字域key和value域,均不可为空。

(5)装填因子Load Factor:哈希表的装满程度,其值=元素数/哈希表的长度。

判断哈希表中是否包含某元素:boolean contains(Object value);

可以根据HashCode的值判断两个对象是否相等吗?不可以。不同的对象可能生成相同的Hash Code值,但可以根据Hash Code判断两个对象不相等。若Hash Code值不同,必为两个不同的对象。要判断两个对象相等,必须通过equals方法。

三种构造方法:

(1)Hashtable();//默认构造函数

(2)Hashtable(int capacity);

(3)Hashtable(int capacity,float loadFactor);

常见方法:

(1)void clear();

(2)boolean contains(Object value);

(3)boolean containsKey(Object key);

(4)boolean isEmpty();

(5)Object get(Object key);

(6)void rehash();

(7)Object put(Object key,Object value);

(8)Object remove(Object key);

(9)int size();

(10)String toString();

 

5、Map

获取Map的视图,有三种可能的视图:

(1)所有键值对entrySet(),返回Set对象。Set中的每一个元素都是一个Map.Entry对象,可以使用getKey()和getValue()方法访问key和value,还有一个setValue()方法。迭代Map元素的代码如下:

Iterator keyValuePairs=map.entrySet().iterator();
while(keyValuePairs.hasNext()){
	Map.Entry entry=(Map.Entry)keyValuePairs.next();
	Object key=entry.getKey();
	Object value=entry.getValue();
}

(2)所有键keySet(),返回Set对象。删除Set中的元素还将删除Map中的映射(键和值)。迭代Map元素的代码如下:

Iterator keys=map.keySet().iterator();

(3)所有值valueSet(),返回Collection对象。删除Collection中的元素还将删除Map中的映射(键和值)。迭代Map元素的代码如下:

Iterator values=map.valueSet().iterator();

Map访问、测试方法:

(1)boolean contains(Object value);

(2)boolean containsKey(Object key);

(3)boolean isEmpty();

(4)Object get(Object key);

(5)int size();

Map冲突处理:

在索引位置处插入一个链接对象。

 

6、总结

(1)List的选择:ArrayList由数组提供底层支持,LinkedList由双向链表实现。所以若经常向List插入或删除,LinkedList较好;否则要选取存取速度较快的ArrayList。

(2)Set的选择:HashSet总是比TreeSet性能要好。后者存在的理由就是它可以维持元素的排序状态。所以若需要一个排好序的Set才应用TreeSet。

(3)Map的选择:同上,尽量选用HashMap。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值