关系:集合三大分支 List(接口)、Set(接口)、Map(接口),其中List与Set都是Collection的子接口,Map是单独的一个接口。
特点:
List家族都是有序可重复(这里的有序并非集合本身的存储顺序,而是指存入与取出的顺序),下面都是List的实现类:
ArrayList:底层用动态数组实现,更适合遍历,不适合插入删除(性能低);
遍历方式:1.存储的形式就是数组,可以跟数组一样直接使用for循环
/* ArrayList遍历 */ List<String> list=new ArrayList<>(); list.add("111"); list.add("222"); list.add("333"); for(int i=0;i<list.size();i++){ System.out.println(list.get(i)); } System.out.println(list);
输出:
111
222
333
[111, 222, 333]
2.增强for循环
/* ArrayList遍历 */ List<String> list=new ArrayList<>(); list.add("111"); list.add("222"); list.add("333"); for(String str:list){ System.out.println(str); } System.out.println(list);
3.Iterator迭代器,说白了就是通过List接口里的一个方法返回一个名字叫迭代器的东东,需要用到它的几个方法
想过一个问题没有,for循环其实足够了,为啥还搞个什么迭代器,有啥意义?意义不是装逼,而是为了性能,几百几千条或许差别不大,但百万级数据性能差异就出来了。后边或许会写一篇专门讲性能差别的底层逻辑
/* ArrayList遍历 */ List<String> list=new ArrayList<>(); list.add("111"); list.add("222"); list.add("333"); Iterator<String> it=list.iterator(); //迭代器就是一个集装箱,里面很黑只能用手摸,集装箱里有三个小箱子,工人按照某种次序(先最近)一个一个的搬出来, //摸到一个,就喊一声true,直到三个搬完摸第四个的时候摸空了,喊一声false while(it.hasNext()){//摸到就喊true System.out.println(it.next());//把现在摸到的箱子打开看看是什么 } System.out.println(list);
//有没有更多的呢遍历方式呢,应该有,不过没啥意思了,常用的会了就行了,有需要再去搞其它
Vector:跟ArrayList一模一样啊,区别是这个是早期版本,线程安全,效率较低。
//Vector跟ArrayList差不多,不解释直接上代码看看就完事了 /* Vector遍历 */ List<String> vector=new Vector<>(); vector.add("111"); vector.add("222"); vector.add("333"); for(String str:vector){ System.out.println(str); } System.out.println(vector); /* Vector遍历 */ List<String> vector=new Vector<>(); vector.add("111"); vector.add("222"); vector.add("333"); for(int i=0;i<vector.size();i++){ System.out.println(vector.get(i)); } System.out.println(vector); /* Vector遍历 */ List<String> vector=new Vector<>(); vector.add("111"); vector.add("222"); vector.add("333"); Iterator<String> it=vector.iterator(); //迭代器就是一个集装箱,里面很黑只能用手摸,集装箱里有三个小箱子,工人按照某种次序(先最近)一个一个的搬出来, //摸到一个,就喊一声true,直到三个搬完摸第四个的时候摸空了,喊一声false while(it.hasNext()){//摸到就喊true System.out.println(it.next());//把现在摸到的箱子打开看看是什么 } System.out.println(vector);
LinkedList:底层采用链表形式,插入删除性能更高,遍历性能较低。
遍历方式一样的:1.for 2.for each 3.Iterator
Stack:是Vector的子类,压栈的存储特点,先进后出,类似子弹弹夹
遍历方式一样的:1.for 2.for each 3.Iterator
总结:List接口家族下的子实现类遍历记住这三种ok了1.for 2.for each 3.Iterator
Set家族无序无重复(相同的元素,只存储第一个,后边的就不再存入):
HashSet:底层采用hashMap的存储方式,性能更高,非线程安全
遍历:2.for each 3.Iterator
TreeSet:存入取出的是无序的,但是存入后会根据某种机制自动排序,性能更低。
遍历:2.for each 3.Iterator
总结;Set集合特点是无序,无重复,无索引,由于无序没得索引,也就没有提供通过索引获取值的方法
Map家族,键值对的存储方式(Key-Value):通过唯一的k快速寻找value
HashMap:性能更高,线程非安全,多个线程操作一个HashMap时容易遭
HashTable:用法跟HashMap差不多,线程安全,多线程的时候可以用它
TreeMap:希望存入的key自动排序用它。
遍历:map类型的遍历有所不同,1.Map.Entry ,大概是把map打包成一个Set<Map.Entry<类型,类型>>这玩意,这玩意把所有的key-value合成一个整体装在一个箱子里,然后利用它自带的getKey,getValue获得值
/*
Map.Entry
*/
Map<String,String> hashMap=new HashMap();
hashMap.put("1","111");
hashMap.put("2","222");
hashMap.put("3","333");
Set<Map.Entry<String, String>> entrySet=hashMap.entrySet();
for(Map.Entry<String,String> entry:entrySet){
System.out.println(entry.getKey()+"="+entry.getValue());
}
System.out.println(hashMap);
2.keySet() 自带的方法,可以把所有的key取出来存到一个Set集合,然后再用foreach遍历
Map<String,String> hashMap=new HashMap();
hashMap.put("1","111");
hashMap.put("2","222");
hashMap.put("3","333");
Set<String> keys=hashMap.keySet();
for(String key:keys){
System.out.println(hashMap.get(key));
}
System.out.println(hashMap);
3.Iterator 主要是hashMap.entrySet().iterator()返回一个迭代器,然后就
Map<String,String> hashMap=new HashMap();
hashMap.put("1","111");
hashMap.put("2","222");
hashMap.put("3","333");
Iterator<Map.Entry<String, String>> iterator=hashMap.entrySet().iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println(hashMap);