JAVA中常见容器类总结

Collection中有两个常用子接口List和Set。
我们常说的容器中的元素是有序的,这里的有序指的是指存入的顺序和取出的顺序一致,下面比较一下这两个子接口的异同。

元素是否有序
是否允许重复元素
有无索引操作(如add(index),get(index))
List
有序
Set
无序
根据对数据的存储方式(数据结构)不同每个子接口又有不同的具体实现类。
List常用的实现类有ArryList,LinkedList,Vector。
Set常用的实现类有HashSet,TreeSet。
先说一下共同之处,遍历容器中的元素标准的方式是用Iterator迭代器进行遍历,如:
List<String> ls=new ArrayList<String>();
ls.add("aa"); 
ls.add("bb");
 ls.add("cc");
Iterator<String> it=ls.iterator();
while(it.hasNext()){
   String s=it.next(); 
}
迭代器就是集合的取出元素的方式。因为每种容器都有自己的存储数据的方式,所以就都有自己的取数据的方式,这样每个容器内部就定义了一个取数据的类(因为取数据涉及到一系列的操作),把取出方式定义在集合内部方便可以直接访问集合的内部元素了。虽然每个取出方式的细节不同,但是都有共性的内容——判断是否存在下一个元素 有则取出,那么就可以将共性抽取出,形成一个规则,这里该规则就是Iterator——都实现该接口(接口就是一种规则)。如何获取集合的取出对象呢?通过一个对外提供的方法——iterator()

List的常用具体实现类:Arraylist,LinkedList和Vector
ArrayList:底层的数据结构是数组,查询速度快,但是增删慢。
LinkedList:底层数据结构式链表结构,增删快,查询慢。
Vector:底层的数据结构也是数组结构,和ArrayList类似,但是它是同步的,效率慢,被ArrayList取代了。Vector中有一个特有的取出元素的方式那就是枚举,其实枚举和迭代器是一样。因为枚举的名称以及方法名都过长,所以被迭代器取代了。
Set的常用具体实现类:HashSet,TreeSet
HashSet:底层数据结构是哈希表。
TreeSet:底层数据结构式二叉树。
个人理解:Hash结构的查找过程是先计算散列码,将散列码按照某种规则映射成数组下标查询数组,而数组中的每个元素师一个链表结构的。

判断元素是否相同在或是否重复(如何判断都是由各自的数据结构决定的)
1.List
List集合判断元素是否相同依靠的是元素的equals()方法。如果元素师自定义类型,那么它的默认的equals方法是继承自object,而object的equals方法比较的是两个对象是否指向同一个引用——比较的是地址值。若要按照想要的方式比较就要覆写object的equals方法
如:
……
public boolean equals(object o){
    customtype ct=(customtype  ) o;
    this.attribute?ct.attribute;
}
……
2.Set
(1)HashSet 如何保证元素唯一性,是通过 元素的两个方法——HashCode()和equals()来完成的,如果hashcode相同才会判断元素的equals()是否为true。注意:对于判断元素是否存在及添加、删除等操作都是依赖元素的hashcode()和equals()的。所以自定义类型要覆写这两个方法。
(2)TreeSet:会对元素进行排序。(如add的是ac,ab,输出的是ab,ac 按照自然顺序排序);保证元素唯一性的依据是compareTo()的返回值是否为0.
TreeSet会将存入的对象进行排序,所以要求对象要具备可比较性。
TreeSet排序的第一种方式:让元素自身具有比较性,这时元素需要实现Comparable接口,覆盖CompareTo()方法。所以没有实现Comparable接口的类型会报类型转换错误。
TreeSet排序的第二种方式:是在new TreeSet对象时传递进Comparator比较器。
//按字符串的长度的大小排序,当长度相同比较两个字符串的ASCII码
例如:public class StringLengthComparator implements Comparator{
 @Override
 public int compare(Object o1, Object o2) {
  String s1=(String)o1;
  String s2=(String)o2;
     int num= new Integer(s1.length()).compareTo(new Integer(s2.length()));
     if(num==0){
      return s1.compareTo(s2);      
     }
     return num;
 }
 
 }
TreeSet<String> ts=new TreeSet<String>(new StringLengthComparator  ());
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值