TestCollection.java
package com.jhy.www.test; import sun.security.util.AuthResources_it; import javax.sound.midi.Soundbank; import java.util.*; public class TestCollection { public static void main(String[] args) { //测试集合 //常用的实现类如下6种,至于接口Collection下的Queue,再研究 //Collection(ArrayList LinkedList HashSet LinkedHashSet) Map(HashMap LinkedHashMap) /* * 1. List 接口 List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。 List 接口存储一组不唯一,有序(插入顺序)的对象。 * */ ArrayList<Integer> arrayList = new ArrayList(); arrayList.add(72); arrayList.add(22); arrayList.add(32); arrayList.add(42); arrayList.add(52); arrayList.add(52); arrayList.add(null); arrayList.add(null); //System.out.println(arrayList.get(0)); //72 //System.out.println("arrayList:"+arrayList); //[72, 22, 32, 42, 52, 52, null, null] LinkedList<String> linkList = new LinkedList<String>(); linkList.add("ab"); linkList.add("bc"); linkList.add("cd"); linkList.add("de"); linkList.add("ef"); linkList.add("ef"); //linkList.remove("ef"); //linkList.remove(linkList.size()-1); //linkList.remove(1); //linkList.removeLast(); //linkList.remove(); //如果只调用 .remove()方法,那么会删除目前list的第一个,再调用,再删除第一个 //linkList.remove(); //System.out.println(linkList.get(0)); //ab //System.out.println("linkList:"+linkList); //[ab, bc, cd, de, ef, ef] /* * 2.Set Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素。 Set 接口存储一组唯一,无序的对象。 * */ HashSet<Integer> hashSet = new HashSet(); HashSet<Integer> hashSet3 = new HashSet(); hashSet3.add(12); hashSet3.add(32); hashSet3.add(42); hashSet.add(12); hashSet.add(22); hashSet.add(32); hashSet.add(null); hashSet.add(32); hashSet.add(null); //hashSet.remove(12); //hashSet.removeAll(hashSet3); //[null, 22] // hashSet.removeAll(new HashSet<Integer>(22)); // HashSet<Integer> hashSet4 = new HashSet<>(22); //这么写没有什么卵用,想知道为什么再看看源码 // System.out.println("hashSet4:"+hashSet4); //hashSet4:[] //System.out.println(hashSet); //[32, null, 22, 12] 结果不变,确实没有添加了重复的元素 HashSet<String> hashset2 = new HashSet(); hashset2.add("aa"); hashset2.add("bb"); hashset2.add("cc"); hashset2.remove(1); //这里API 没有传入下标数字的这个方法,应该是将1识别为Object了,结果是没有效果 //System.out.println(hashset2); /* * 备注: * Set和List的区别 1). Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。 2). Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。 3). List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector> 。 * */ /* * 3.Map Map 接口存储一组键值对象,提供key(键)到value(值)的映射。 * */ HashMap<String,String> hashMap = new HashMap<>(); hashMap.put("b","bb"); hashMap.put("a","aa"); hashMap.put("c","cc"); hashMap.put("c","c4"); //后面的覆盖前面的 hashMap.put(null,null); hashMap.put(null,"woshi null"); //System.out.println(hashMap.get("a")); //aa //System.out.println(hashMap.get("null")); //null //System.out.println(hashMap.get(null)); //woshi null 这里需要理解下 字符串null 和 null对象本身 //System.out.println(hashMap); //{null=woshi null, a=aa, b=bb, c=c4} 也证明了Map的key是唯一的 LinkedHashMap<String,String> lHashmap = new LinkedHashMap<>(); lHashmap.put("b","b1"); lHashmap.put("a","a1"); lHashmap.put("c","c1"); //System.out.println(lHashmap); //{b=b1, a=a1, c=c1} 这个要注意下: 继承于HashMap,使用元素的自然顺序对元素进行排序. // TreeSet treeSet = new TreeSet(); //实现的一个借口里有接口 Comparator 所以可以比较 /* * 4.List 和 Map 的遍历 * */ // 4.1 遍历 List // 4.1.1 增强for(foreach) // System.out.println("增强for:"); // for(Integer num : arrayList){ // System.out.println("num:"+num); // } // 4.1.2 基本for循环 // System.out.println("基本for循环:"); // for(int i=0; i<arrayList.size(); i++){ // System.out.println(arrayList.get(i)); // } // 4.1.3 迭代器循环 // System.out.println("迭代器循环:"); // Iterator<Integer> ite = arrayList.iterator(); // while(ite.hasNext()){ // System.out.println(ite.next()); // } /* * 备注: 三种方法都是用来遍历ArrayList集合,第三种方法是采用迭代器的方法,该方法可以不用担心在遍历的过程中会超出集合的长度。 * */ // 4.2 遍历 Map // 4.2.1 foreach 遍历 key(普遍使用,二次取值) // System.out.println("foreach 遍历 key:"); // for(String key : hashMap.keySet()){ // System.out.println("key:"+key+",value:"+hashMap.get(key)); // // } // 4.2.2 遍历所有的value,但不能遍历 key // for(String value : hashMap.values()){ // System.out.println("value:"+value); // } // 4.2.3 推荐使用,容量大时效率较快 // for(Map.Entry<String,String> entry : hashMap.entrySet()){ // System.out.println("key:"+entry.getKey()+",value:"+entry.getValue()); // } // 4.2.4 迭代器遍历(因为 .iterator()这个方法是 AbstractCollection抽象类的,所以Map里是没有这个方法,所以需要将map.entrySet()获取到) Iterator<Map.Entry<String,String>> iterator = hashMap.entrySet().iterator(); System.out.println(hashMap.entrySet()); while(iterator.hasNext()){ Map.Entry<String, String> entry = iterator.next(); //写出来便于理解 //System.out.println("key:"+iterator.next().getKey()+",value:"+iterator.next().getValue()); //这里这么写会有个错误,需要仔细点(iterator.next()调用了2次,导致遍历出来的key是当前的,value是下一次的) System.out.println("key:"+entry.getKey()+",value:"+entry.getValue()); } } }
----------------------------------------------------------------------------------------------------------------------
附图一:
附图二:
注意:
1. 1)集合框架的类和接口均在java.util包中。
2)任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换。
2.如何使用比较器(Comparator)
TreeSet和TreeMap的按照排序顺序来存储元素. 然而,这是通过比较器来精确定义按照什么样的排序顺序。
这个接口可以让我们以不同的方式来排序一个集合。