集合概述
分为两大类,单类集合Collection和双列集合Map。
一、Collection接口
Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是List和Set。
1.List接口
List的特点是元素有序、元素可重复,所有的元素是以一种线性方式进行存储的,元素的存入顺序和取出顺序一致。List接口的主要实现类有ArrayList和LinkedList。
List实现类
1.1 ArrayList
ArrayList集合是一个长度可变的数组。在ArrayList内部封装一个长度可变的数组对象,当存入的元素超过数组的长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素。
ArrayList的增删
ArrayList list = new ArrayList();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
System.out.println(list.size());//4
System.out.println(list.get(1));//李四
由于ArrayList集合的底层是使用一个数组来保存元素,在增加或删除指定位置的元素时,会导致创建新的数组,效率比较低,因此不适合做大量的增删操作,也因此对于查询元素很方便。
1.2 LinkedList
LinkedList集合解决了ArrayList集合增删效率低的局限。ListedList集合内部维护了一个双向循环来链表,通过前后的指向将所有的元素连接起来,使其具备很高的效率。
集合方法
代码
LinkedList linkedList = new LinkedList();
linkedList.add("张三");
linkedList.add("李四");
linkedList.add("王五");
linkedList.add("赵六");
System.out.println(linkedList);//[张三, 李四, 王五, 赵六]
linkedList.add(3,"student");
System.out.println(linkedList);//[张三, 李四, 王五, student, 赵六]
linkedList.addFirst("First");
System.out.println(linkedList);//[First, 张三, 李四, 王五, student, 赵六]
System.out.println(linkedList.getFirst());//First
linkedList.removeFirst();
System.out.println(linkedList);//[李四, 王五, student, 赵六]
Iterator接口
像数组一样,我们经常需要遍历集合中的所有元素,因此提供了一个Iterator接口,主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。
ArrayList list = new ArrayList();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
Iterator it = list.iterator();
while (it.hasNext()){
Object next = it.next();
System.out.println(next);
}
//张三 李四 王五 赵六
如果在使用迭代器的过程中移除某个元素,会导致出现异常。
解决的方法:
第一种:只要找到想移除的元素,用break跳出即可。
第二种:直接使用迭代器it。remove()的方法既可。
遍历改进:foreach
for(容器中元素类型 临时变量 :容器变量) { 执行语句 }
2.Set接口
Set的特点是元素无序不可重复。Set接口的主要实现类有HashSet和TreeSet。
2.1HashSet
HashSet是根据对象的哈希值来确定元素在集合中的存储位置,具有良好的存取和查找性能。
HashSet hashSet = new HashSet();
hashSet.add("张三");
hashSet.add("李四");
hashSet.add("王五");
hashSet.add("赵六");
hashSet.add("李四");
Iterator iterator = hashSet.iterator();
while (iterator.hasNext()){
Object next = iterator.next();
System.out.print(next + " ");
}//李四 张三 王五 赵六
可以看出HashSet确实是无序不重复的集合,当调用add()方法时,首先调用hashCode()获得对象的哈希值,继而通过哈希值计算除一个存储位置。如果在计算出来的存储位置上没有元素,则直接将元素存入该位置。若是有元素,则调用equals()方法让当前存入元素在该存储位置的元素进行比较,若是返回false就将该元素存入集合,若是true,则说明元素重复,将该元素舍弃。
LinkedHashSet
HashSet集合存储的元素是无序的,如果想让元素的存取顺序一致,可以使用Java中提供的LinkedHashSet类,LinkedHashSet类是HashSet的子类。
2.2TreeSet
TreeSet则是以二叉树的方式来存储元素,它可以实现对集合中的元素进行排序。
TreeSet treeSet = new TreeSet();
treeSet.add(3);
treeSet.add(2);
treeSet.add(4);
treeSet.add(1);
treeSet.add(1);
System.out.println(treeSet);//[1 2 3 4]
实现有序排列,是因为元素的类都实现了Comparable接口,Comparable接口强行对实现它的类的对象进行整体排序。
Comparable接口的 compareTo() 方法被称为自然比较方法。当一个自定义的类中没有重写compareTo()方法,则没有办法实现对存入对象的有序排列。
二、Map接口
Map:双列集合类的根接口,用于存储具有键(Key)、值(Value)映射关系的元素,每个元素都包含一对键值,其中键值不可重复并且每个键最多只能映射到一个值,在使用Map集合时可以通过指定的Key找到对应的Value。
2.1HashMap
HashMap集合是Map接口的一个实现类,用于存储键值映射关系,但HashMap集合没有重复的键并且键值无序。
HashMap hashMap = new HashMap();
hashMap.put("1","张三");
hashMap.put("2","李四");
hashMap.put("3","王五");
hashMap.put("4","赵六");
System.out.println(hashMap.get("1"));//张三
System.out.println(hashMap.get("2"));//李四
System.out.println(hashMap.get("3"));//王五
System.out.println(hashMap.get("4"));//赵六
System.out.println(hashMap.get(1));//null
//注意要与key值相同,存放的是 "1"
遍历Map,获取键值对
HashMap hashMap = new HashMap();
hashMap.put("1","张三");
hashMap.put("2","李四");
hashMap.put("3","王五");
hashMap.put("4","赵六");
Set keyset = hashMap.keySet();//获取键集合
Iterator iterator = keyset.iterator();
while (iterator.hasNext()){
Object key = iterator.next();
Object value = hashMap.get(key);
System.out.print(key + ":" + value + " ");
} //1:张三 2:李四 3:王五 4:赵六
hashMap方法
HashMap map = new HashMap(); // 创建Map集合
map.put("1", "张三");
map.put("3", "李四");
map.put("2", "王五");
map.put("4", "赵六");
System.out.println("集合大小为:" + map.size());//4
System.out.println("判断是否包含传入的键:" + map.containsKey("2"));//true
System.out.println("判断是否包含传入的值:" + map.containsValue("王五"));//true
System.out.println("移除键为1的值是:" + map.remove("1"));//张三
Collection values = map.values();//获取值
Iterator it = values.iterator();
while (it.hasNext()) {
Object value = it.next();
System.out.println(value);
}//王五 李四 赵六
LinkedHashMap类
从上面可以看出,HashMap集合迭代出来的元素的顺序和存入的顺序是不一致的,想要一致,可以使用LinkedHashMap类,它是HashMap的子类。
2.2TreeHash类
HashMap集合存储的元素的键值是无序的和不可重复的,为了对集合中的元素的键值进行排序,Map接口提供了另一个可以对集合中元素键值进行排序的类TreeMap。
TreeMap map = new TreeMap();// 创建Map集合
map.put("3", "张三");
map.put("2", "李四");
map.put("3", "王五");
map.put("4", "赵六");
Set keySet = map.keySet();
Iterator iterator = keySet.iterator();
while (iterator.hasNext()){
Object key = iterator.next();
Object value = map.get(key);
System.out.println(key + ":" + value);
}//2:李四
//3:王五
// 4:赵六
不仅有序排列,同时后面的覆盖前面的,打印出来的是 王五 ,说明第一个张三被覆盖。因此,reeMap中的键必须是唯一的,不能重复并且有序,如果存储了相同的键,后存储的值则会覆盖原有的值。
2.3Hashtable类
和HashMap十分相似,区别在于Hashtable是线程安全的。Hashtable存取元素时速度很慢,目前基本上被HashMap类所取代。
2.4Properties
Hashtable类的子类Properties。
Properties主要用来存储字符串类型的键和值,在实际开发中,经常使用Properties集合来存取应用的配置项。
Properties properties = new Properties();
properties.setProperty("color", "green");
properties.setProperty("language", "Chinese");
Enumeration names = properties.propertyNames();//获取Enumeration对象所有键枚举
while (names.hasMoreElements()) {
String key = (String) names.nextElement();
String value = properties.getProperty(key);// 获取对应键的值
System.out.println(key + " = " + value);
}
//color = green
//language = Chinese