黑马程序员技术交流社区
标题:
个人集合总结
[打印本页]
作者:
qiuyou
时间:
2016-9-18 18:48
标题:
个人集合总结
请你介绍一下集合?
答:集合体系分为单列集合和双列集合,其中单列集合的根类是Collection,双列集合的根类是Map,它们两个都是接口,在Collection
下面有两个子接口,是Set和List,List是有序的,可以存储重复的值,并且是有索引的,Set是无序的,不可以存储重复的值,没有索引,
List的实现类有ArrayList,LinkedList,Vector,它们都有List集合的特点,并且它们还有一些自己的拓展功能,ArrayList底层是数组存储
的数据结构,当存满了这个数组,集合长度会增长为原来数组的1.5倍,把旧数组里的内容拷贝到一个扩充的新的数组里去,集合的长度就
扩充了,根据它的这个特点我们可以知道,ArrayList具有增删慢,查询快的特点,LinkedList底层是链表型的数据结构来存储数据的,
链表的特点就是后面的记住前面对象的地址值,这个特点可以知道LinkedList具有增删快的特点,查看源代码我们知道,这个容器是从
两边向中间靠拢来逐一询问查询的,所以查询速度会比较慢,Vector是jdk1.0版本的,它具有ArrayList的一些特点,现在用的比较少,
它和ArrayList比较的话,ArrayList是线程不安全的,效率会更高一点,Vector是线程安全的,效率会慢一点,开发建议使用ArrayList
,介绍完List接口下的一些实现子类,下面介绍一下Set集合下的一些实现类,它下面常用的实现类有HashSet,LinkedHashSet,TreeSet,
逐一介绍它们,HashSet底层是哈希算法,这个容器要保证存储的对象唯一,如果存储一个自定义对象,就要这个自定义对象重写hashCode()
和equals()方法,为什么要存储这两个方法呢?这就要说到我们是怎样判断两个对象是否相等的,我们认为哈希值不同,并且equals()方法
比较不相同才是两个不同的对象,重写hashCode()方法是因为我们要根据对象的一些属性来算出对象的哈希值,尽可能在equals()方法之前
确定这是不是相同的对象,如果是相同的对象就不存储进集合里去,如果不是相同的对象,就存储进集合里去,重写equals()方法就是尽最大可能
的少调用equals()方法,提高性能,如果hashCode()方法比较相等就比较,就来比较equals()方法,equals()方法判断出两个对象不同就存储
进集合里去,这两个方法一般都是要一起重写的。LinkedHashSet是HashSet集合的子类,它的底层是链表,其实从表面上我们也可以看出,它是对
HashSet集合的进一步加强,因为是链表结构,所以可以保证怎么存就怎么取,有一点List集合的特点,TreeSet的底层是二叉树的存储结构
,具体来说,二叉树就是根据compareTo()方法和比较器compare()方法的返回值进行存储的,第一个元素是存储在二叉树的根,返回值如果是
小于0就存储在左边,返回值如果大于0就存储在二叉树的右边,TreeSet是一个可以排序的容器,有两种排序方式,第一种是自然排序,实现
Compareable接口,重写CompareTo方法,还有一种就是比较器排序,所谓比较器排序就是给TreeSet传递一个实现了匿名内部类,这个匿名内部类实现
了Comparetor接口,重写了里面的方法。介绍完单列结合,下面就来介绍一下双列集合,有一些比较常见的双列集合容器,例如hashMap,
LinkHashMap,HashTable,TreeMap,下面一一介绍这些集合,Map集合的键是唯一的,值可以不同,如果在一个Map集合里put了两个相同键的东西,‘
那么会覆盖值,新值覆盖旧的值,键不变。hashMap底层是哈希算法,如果我们要把自定义对象作为键存储在HashMap集合中,那么应该重写该对象
的hashCode()和equals()方法,LinkHashMap是链表数据结构的,它保证怎么存就怎么取,HashTable是jdk1.0的,它和HashTable是很相似的
,不同就是,HashMap是线程不安全的,效率高,HashTable是线程安全的,效率低。TreeMap底层是二叉树结构,也可以使用比较器排序,这都是
相对于键来说的。介绍完集合体系比较常用的容器,下面来讲一讲这些容器的遍历方式。
//下面来介绍各种容器的遍历方式
//第一个是ArrayList的遍历方式,因为ArrayList底层是数组,有索引,索引可以使用for循环,另外它也可以使用迭代器迭代可和
//增强for循环的方式进行遍历
ArrayLust<String> arrayList = new ArrayList<>();
arrayList.add("a");
arrayList.add("b");
arrayList.add("c");
01:普通的for循环遍历
for(int i =0 ;i<arrayList.size();i++){
System.out.println(arrayList.get(i));
}
02: 迭代器的方式遍历
//Iterator<String> iterator = arrayList.iterator(); 两个迭代器都可以,但是下面的这个迭代器可以一边迭代一边删除
ListIterator<String> iterator = arrayList.listIterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
03:增强for循环
for(String str : arrayList){
System.out.println(str);
}
//同样的Linklist也可以采用上面的方式来遍历,这里省略
//下面介绍Vector的遍历方式
Vector v = new Vector();
v.addElement("a");
v.addElement("b");
v.addElement("c");
v.addElement("d");
Enumeration en = v.elements(); //获取枚举
while(en.hasMoreElements()) { //判断集合中是否有元素
System.out.println(en.nextElement()); //获取集合中的元素
}
//介绍完List集合中一些常用容器的遍历,就来介绍Set集合一些常用容器的遍历
HashSet<String> hashset = new HashSet<>();
hashset.add("a");
hashset.add("b");
hashset.add("c");
01:迭代器的方式迭代
Iterator iterator = hashse.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
02:增强for循环的方式遍历
for(String str : hashset){
System.out.println(str);
}
//同样,LinkedhashSet,TreeSet也可以采用上面两种的遍历方式
//介绍完单列集合的遍历方式下面来介绍双列集合的遍历方式
HashMap<Integer,String> hashmap = new HashMap<>();
hashmap.put(1,"a");
hashmap.put(2,"b");
hashmap.put(3,"c");
//传统方式,也就是迭代器方式来遍历,其一是keySet()方法
Set<Integer> set = hashmap.keySet();
Iterator<Integer> iterator = set.iterator();
while(iterator.hasNext()){
Integer key = iterator.next();
String value = hashmap.get(key);
}
//其二entrySet方法
Set<Entry<Integer,String>> set = hashmap.entrySet();
Iterator<Entry<Integer,String>> iterator = set.iterator();
while(iterator.hasNext()){
Entry entry = iterator.next();
Integer key = entry.getKey();
String value = entry.getValue();
}
//增强for循环,keySet()方法的
for(Integer key : hashmap.keySet()){
String value = hashmap.get(key);
}
//增强for循环,entrySet()方法的
for(Entry entry : hashmap.entrySet()){
Integer key = entry.getKey();
String value = entry.getValue();
}
//同样的,LinkHashMap,TreetMap也都是适用上面这种遍历方式的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2