1.1集合类的概述
Java.util包中提供了一些集合类,这些集合类右被称为容器。
提到容器不难想到数组,集合类与数组不同之处是:
数组的长度是固定长度,集合的长度是可变的;
数组是用来存放基本数据类型,集合是用来存放对象的引用。
常用的集合有List集合、Set集合和Map集合,其中List和Set继承了Collection接口,各接口还提供了不同的实现类。上述集合类的继承关系如图14.1所示:
1.1Collection接口
Collection接口是层次结构中的根接口。构成Collection的单位元素。Collection接口通常不能直接使用,但该接口提供了添加元素、删除元素、管理数据的方法。由于List接口与Set接口都继承了Collection接口,因此这些方法对List和Set是通用的。
package jihelei; import java.util.*; public class Muster {//创建类 public static void main(String args[]){ Collection<String> list = new ArrayList<>(); //实例化集合对象 list.add("a");//向集合添加元素 list.add("b"); list.add("c"); Iterator<String> it = list.iterator();//创建迭代器 while(it.hasNext()){//判断是否有下一个元素 String str= (String)it.next();//获取集合中的元素 System.out.println(str); } } }
注意:Iterator的next()方法返回的是Object
2.List集合
List集合包括List接口以及List接口的实现类。List集合中的元素允许重复,各元素的顺序就是对象插入的顺序。类似于Java数组,用户可通过索引来访问集合中的元素。
2.1List接口
List接口除了继承了Collection接口的方法外,还定义了两个重要的方法。
get(int index):获得指定索引位置的元素;
set(int index,Object obj):将集合中指定索引位置的对象修改为指定对象。
2.1.1List接口的实现类
List接口的常用实现类有ArrayList与LinkedList。
1.ArrayList类实现了可变的数组,允许保存所有值,包括null,可根据指定索引位置对集合快速访问,缺点是向指定索引位置插入或者删除对象的速度慢。
2.LinkedList类采用链表结构保存对象。优点是便于向集合中插入和删除对象 ,但是对于随机访问集合中的对象,使用LinkedList实现List集合的效率低。
package jihelei; import java.util.*; public class Gather { public static void main(String[] args){ List<String> list = new ArrayList<>();//创建集合对象 list.add("a");//向集合中添加元素 list.add("b"); list.add("c"); int i = (int)(Math.random()*list.size()); System.out.println("随机获取数组中的元素:"+list.get(i)); list.remove(2);//将指定索引位置的元素从集合中移出 System.out.println("将索引为‘2’的元素从数组移除后,数组中的元素是:"); for(int j=0;j<list.size();j++){ System.out.println(list.get(j)); } } }
3.Set集合
.Set集合中的对象不按特定的方式排序,只是简单的添加到集合中,但set集合中不包括重复的对象,Set接口继承了Collection接口,所以包含了Collection的所有方法。
Set接口的常用的实现类有Hash Set类和TreeSet类
1.Hash Set类实现了Set接口,由哈希表支持,实际上是一个Hash Map实例,不保证迭代顺序,特别是不保证该顺序恒久不变,此类允许为null元素。
2.TreeSet类不仅实现了Set接口,还实现了Java.util.SortedSet接口,在遍历集合时按照自然顺序递增排序,也可以按照比较器顺序递增排序。
package jihelei; import java.util.Iterator; import java.util.TreeSet; public class UpdateStu implements Comparable<Object>{ String name; long id; public UpdateStu(String name,long id){//构造方法 this.id=id; this.name=name; } public int compareTo(Object o) { UpdateStu upstu = (UpdateStu) o; int result = id > upstu.id ? 1 : (id == upstu.id ?0:-1); return result; } public String getName(){ return name; } public void setName(String name){ this.name=name; } public long getId(){ return id; } public void setId(long id){ this.id=id; } public static void main(String[] args){ UpdateStu stu1 = new UpdateStu("李同学",01011);//创建UpdateStu对象 UpdateStu stu2 = new UpdateStu("陈同学",01021); UpdateStu stu3 = new UpdateStu("王同学",01051); UpdateStu stu4 = new UpdateStu("马同学",01012); TreeSet<UpdateStu> tree = new TreeSet<>(); tree.add(stu1); tree.add(stu2); tree.add(stu3); tree.add(stu4); Iterator<UpdateStu> it = tree.iterator();//set集合中的所有的对象的迭代器 System.out.println("Set集合中所有的元素:"); while(it.hasNext()){//遍历 UpdateStu stu = (UpdateStu)it.next(); System.out.println(stu.getId()+" "+stu.getName()); } it = tree.headSet(stu2).iterator(); System.out.println("截取前面部分的集合:"); while(it.hasNext()){ UpdateStu stu = (UpdateStu)it.next(); System.out.println(stu.getId()+" "+ stu.getName()); } it = tree.subSet(stu2,stu3).iterator();//截取stu2到stu3之间的对象 System.out.println("截取中间部分的集合:"); while(it.hasNext()){ UpdateStu stu = (UpdateStu)it.next(); System.out.println(stu.getId()+" "+stu.getName()); } } }
代码说明:存入TreeSet类实现的Set集合必须实现Comparable接口,该接口的compareTo(Object o)方法比较此对象与指定对象顺序。如果该对象小于、等于、或大于指定对象,则返回负整数数、0或正整数。
4.Map集合
Map集合没有继承Collection接口,其提供的是key到value的映射,但是不能有相同的key,每个key只能对应一个value。key还决定了存储对象在映射中的存储位置,但是不由key对象本身决定的,而是通过一种“散列技术”进行处理,产生一个散列码的整数值。
4.1Map接口
package jihelei; import java.util.HashMap; import java.util.Map; import java.util.*; public class map_UpdateStu { public static void main(String[] args) { Map<String,String> map = new HashMap<>(); map.put("01", "李同学"); map.put("02", "魏同学"); Set<String> set = map.keySet(); Iterator<String> it = set.iterator(); System.out.println("key集合中的元素:"); while (it.hasNext()) System.out.println(it.next()); Collection<String> coll = map.values(); it = coll.iterator(); System.out.println("values集合中的元素是:"); while (it.hasNext()) { System.out.println(it.next()); } } }
注意:Map集合中允许值对象是null,而且没有个数限制。例如,可通过“map.put("05",null)”,语句向集合中添加对象。
4.2Map接口的实现类
1.首先创建emp类
package jihelei; public class map_emp { private String e_id; private String e_name; public map_emp(String e_id,String e_name){ this.e_id=e_id; this.e_name=e_name; } public void sete_id(String e_id) { this.e_id = e_id; } public String gete_id() { return e_id; } public void sete_name(String e_name) { this.e_name = e_name; } public String gete_name() { return e_name; } }
2.创建一个测试的主类,首先创建一个Map集合,并向其添加对象,分别遍历由两个类实现的map集合观察不同。(一个无序,一个有序)
package jihelei; import java.util.*; public class map_map { public static void main(String[] args) { //由HashMap实现的Map对象 Map<String, String> map = new HashMap<>(); map_emp emp1 = new map_emp("351", "张三");//创建emp对象 map_emp emp2 = new map_emp("512", "李四"); map_emp emp3 = new map_emp("853", "王一"); map_emp emp4 = new map_emp("125", "赵六"); map_emp emp5 = new map_emp("341", "黄七"); map.put(emp1.gete_id(), emp1.gete_name());//将对象 添加到集合中 map.put(emp2.gete_id(), emp2.gete_name()); map.put(emp3.gete_id(), emp3.gete_name()); map.put(emp4.gete_id(), emp4.gete_name()); map.put(emp5.gete_id(), emp5.gete_name()); Set<String> set = map.keySet();//获取Map集合中的key对象集合 Iterator<String> it = set.iterator(); System.out.println("HashMap类实现的Map集合,无序:"); while (it.hasNext()) { String str = (String) it.next(); String name = (String) map.get(str);//遍历Map集合 System.out.println(str + " " + name); } TreeMap<String, String> treemap = new TreeMap<>();//创建treemap集合对象 treemap.putAll(map); Iterator<String> iter = treemap.keySet().iterator(); System.out.println("TreeMap类集合实现对的Map集合,键对象升序:"); while (iter.hasNext()) { String str = (String) iter.next(); String name = (String) treemap.get(str); System.out.println(str + " " + name); } } }
总结:集合类在Java中具有重要的地位,应该好好学习掌握。