导图社区 Java-Collection类
List接口:List接口继承了Collection接口,因此包含Collection中的所有方法。HashSet类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证Set迭代顺序,特别是它不保证该顺序恒久不变。此类允许使用null元素。
编辑于2022-12-26 14:50:25 贵州微信小程序开发知识整理,系统地介绍了微信小程序开发的基础知识,帮助开发者更好地理解和掌握小程序开发的要点和流程。
SpringFramework技术的介绍,SpringFramework,通常简称为Spring,是一个开源的企业级Java应用程序框架,由Rod Johnson创建,并于2004年首次发布。Spring Framework的主要目标是简化企业级Java开发,提高开发效率和应用程序的可维护性。
Maven的特性以及使用部署方法,Maven介绍:Maven是一款为Java项目构建管理、依赖管理的工具(软件),使用Maven可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。
社区模板帮助中心,点此进入>>
微信小程序开发知识整理,系统地介绍了微信小程序开发的基础知识,帮助开发者更好地理解和掌握小程序开发的要点和流程。
SpringFramework技术的介绍,SpringFramework,通常简称为Spring,是一个开源的企业级Java应用程序框架,由Rod Johnson创建,并于2004年首次发布。Spring Framework的主要目标是简化企业级Java开发,提高开发效率和应用程序的可维护性。
Maven的特性以及使用部署方法,Maven介绍:Maven是一款为Java项目构建管理、依赖管理的工具(软件),使用Maven可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。
Java集合类
集合可以看作是一个容器,如红色的衣服可以看作是一个集合,所有Java类的书也可以看作是一个集合。集合中的各个对象,很容易将其从集合中取出来,也很容易将其存放到集合中,还可以将其按照一定的顺序进行摆放。Java中提供了不同的集合类,这些类具有不同的存储对象的方式;同时提供了相应的方法,以方便用户对集合进行遍历、添加、删除和查找指定的对象。学习Java语言一定要学会使用集合。
一、 集合类概述
1. java.util包中提供了一些集合类,这些集合类又被称为容器。提到容器不难想到数组,集合类与数组的不同之处是,数组的长度是固定的,集合的长度是可变的;数组用来存放基本类型的数据,集合用来存放对象的引用。常用的集合有List集合、Set集合和Map集合,其中List与Set继承了Collection接口,各接口还提供了不同的实现类。集合类的的继承关系如图
2. 常用方法
1||| add(E e):将指定的对象添加到该集合中
2||| remove(Object o):将指定的对象从该集合中移出
3||| isEmpty():返回Boolean值,用于判断当前集合是否为空
4||| iterator():返回在此Collection的元素上进行迭代的迭代器,用于遍历集合中的对象
5||| size():用于返回int值,获取该集合中元素的个数
实例代码: package com.COLLECTION; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class Muster { public static void main(String[] args) { Collection<String> list=new ArrayList<String>(); //实例化集合对象 list.add("ha"); list.add("la"); list.add("shao"); Iterator<String> it=list.iterator(); //创建迭代器 while(it.hasNext()) //判断是否有下一个元素 { String str=(String)it.next(); //获取集合中的元素 System.out.println(str); } } }
Iterator的next()方法返回的是Object。
运行结果: ha la shao
二、 List集合
List集合包括List接口以及List接口的所有实现类。List集合中的元素允许重复,各元素的顺序就是对象插入的顺序。类似Java数组,用户可通过使用索引(元素在集合中的位置)来访问集合中的元素。
1. List接口:List接口继承了Collection接口,因此包含Collection中的所有方法。此外,List接口还定义了以下两个重要的方法
1||| get(int index):获得指定索引位置的元素
2||| set(int index,Object obj):将集合中指定索引位置的对象修改为指定的对象
2. List接口的实现类
使用List集合时通常声明为List类型,可通过不同的实现类来实例化集合。例如 List<E>list=new ArrayList<>(); List<E>list2=new LinkedList<>(); E可以是合法的Java数据类型。例如如果集合中的元素为字符串类型,那么E可以修改为String
1||| ArrayList类实现了可变的数组,允许保存所有元素,包括null,并可以根据索引位置对集合进行快速的随机访问;缺点是向指定的额索引位置插入对象或删除对象的速度较慢
2||| LinkedList类采用链表结构保存对象。这种结构的优点是便于向集合中插入和删除对象,需要向集合中插入、删除对象时,使用LinkedList类实现的List集合的效率较高;但对于随机访问集合中的对象,使用LinkedList类实现List集合的效率较低
实例代码: package com.COLLECTION; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Gather { public static void main(String[] args) { List<String> list=new ArrayList<>(); //创建集合对象 list.add("wu"); list.add("qing"); list.add("ha"); list.add("la"); list.add("shao"); int i= (int) (Math.random()*list.size()); //获得随机数 System.out.println("随机获取的数组元素为"+list.get(i)); list.remove(2); //将指定索引位置的元素从集合中移除 System.out.println("将指定位置的元素移除后剩下的元素为:"); Iterator<String> it=list.iterator(); //创建迭代器 while(it.hasNext()) { String str=it.next(); System.out.println(str); } } }
说明:Math类的random()方法可获得一个0.0-1.0的随机数 与数组相同,集合的索引也是从0开始
运行结果: 随机获取的数组元素为wu 将指定位置的元素移除后剩下的元素为: wu qing la shao
三、 Set集合
Set集合中的对象不按特定的方式排序,只是简单地把对象加入集合中,但Set集合中不能包含重复对象。Set集合由Set接口和Set接口的实现类组成。Set接口继承了Collection接口,因此包含Collection接口的所有方法。Set的构造有一个约束条件,传入的Collection对象不能有重复值,必须小心操作可变对象(Mutable Object)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true,则会出现一些问题。Set接口常用的实现类有HashSet类与TreeSet类。
1||| HashSet类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证Set迭代顺序,特别是它不保证该顺序恒久不变。此类允许使用null元素
2||| TreeSet不仅实现了Set接口,还实现了java.util.SortedSet接口,因此TreeSet类实现的Set集合在遍历集合时按照自然顺序递增排序,也可以按照指定比较器递增排序,既可以通过比较器对用TreeSet类实现的Set集合中的对象进行排序。TreeSet类新增的方法如图所示
实例代码: package com.COLLECTION; import java.util.Iterator; import java.util.TreeSet; public class UpdateStu implements Comparable<Object>{ //创建类实现Comparable接口 String name; long id; public UpdateStu(String name,long id) { //构造方法 this.id=id; this.name=name; } @Override public int compareTo(Object o) { UpdateStu updateStu=(UpdateStu) o; int result=id>updateStu.id?1:(id==updateStu.id?0:-1); return result; } public String getName(){ return name; } public long getId() { return id; } public void setName(String name) { this.name=name; } public void setId(long id) { this.id=id; } public static void main(String[] args) { UpdateStu stu1=new UpdateStu("李强",89757); UpdateStu stu2=new UpdateStu("张三",15310); //创建UpdateStu对象 UpdateStu stu3=new UpdateStu("王五",15350); UpdateStu stu4=new UpdateStu("黄二",10010); UpdateStu stu5=new UpdateStu("郭双",10086); TreeSet<UpdateStu> tree=new TreeSet<>(); tree.add(stu1); //向集合添加对象 tree.add(stu2); tree.add(stu3); tree.add(stu4); tree.add(stu5); 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(); //截取排在stu2对象之前的对象 System.out.println("截取前面部分的集合"); while(it.hasNext()) { UpdateStu stu=(UpdateStu) it.next(); System.out.println(stu.getId()+" "+stu.getName()); } it=tree.subSet(stu4,stu5).iterator(); //截取排在stu4与stu5之间的对象 System.out.println("截取中间部分的集合"); while (it.hasNext()) { UpdateStu stu=(UpdateStu) it.next(); System.out.println(stu.getId()+" "+stu.getName()); } } }
headSet()、subSet()、tailSet()方法截取对象生成新集合时是否包含指定的参数,可通过如下方法来判别:如果指定参数位于新集合的起始位置,则包含该对象,如subSet()方法的第一个参数和tailSet()方法的参数;如果指定参数是新集合的终止位置,则不包含该参数,如headSet()方法的入口参数和subSet()方法的第二个入口参数。
存入TreeSet类实现的Set集合必须实现Comparable接口,该接口中的compareTo(Object o)方法比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、0或正整数。
运行结果: Set集合中的所有元素 10010 黄二 10086 郭双 15310 张三 15350 王五 89757 李强 截取前面部分的集合 10010 黄二 10086 郭双 截取中间部分的集合 10010 黄二
四、 Map集合
Map集合没有继承Collection接口,其提供的是key到value的映射。Map中不能包含相同的key,每个key只能映射一个value。key还决定了存储对象在映射中的存储位置,但不是由key对象本身决定的,而是通过一种“散列技术”进行处理,产生一个散列码的整数值。散列码通常用作一个偏移量,该偏移量对应分配给映射的内存区域的起始位置,从而确定存储对象在映射中的存储位置。Map集合包括Map接口以及Map接口的所有实现类。
1. Map接口:Map接口提供了将key映射到值的对象。一个映射不能包含重复的key,每个key最多只能映射到一个值。Map接口中同样提供了集合的常用方法,除此之外还包括如图所示的常用方法。
实例代码: package com.COLLECTION; import java.util.*; public class MapTest { public static void main(String[] args) { Map<String,String> map=new HashMap<>(); //创建Map实例 map.put("001","李强"); //向集合中添加对象 map.put("002","魏延"); map.put("4080","铭瑄"); Set<String> set=map.keySet(); //构建Map集合中所有key对象的Set集合 Iterator<String> it=set.iterator(); //创建集合迭代器 System.out.println("集合中的元素有:"); while(it.hasNext()) { //遍历集合 System.out.println(it.next()); } Collection<String> collection=map.values(); //创建Map集合中所有values值的Collection集合 it=collection.iterator(); System.out.println("values集合中的元素:"); while(it.hasNext()) { //遍历结合 System.out.println(it.next()); } } }
Map集合中允许值对象是null,而且没有个数限制。例如,可通过“map.put("05",null);”语句向集合中添加对象。
运行结果: 集合中的元素有: 001 002 4080 values集合中的元素: 李强 魏延 铭瑄
2. Map接口的实现类:Map接口常用的实现类有HashMap和TreeMap。建议使用HashMap类实现Map集合,因为由HashMap类实现的Map集合添加和删除映射关系效率更高。HashMap是基于哈希表的Map接口的实现,HashMap通过哈希码对其内部的映射关系进行快速查找;而TreeMap中的映射关系存在一定的顺序,如果希望Map集合中的对象也存在一定的顺序,应该使用TreeMap类实现Map集合。
1||| HashMap类是基于哈希表的Map接口的实现,此实现提供所有可选的映射操作,并允许使用null值和null键,但必须保证键的唯一性。HashMap通过哈希表对其内部的映射关系进行快速查找。此类不保证映射的顺序,特别是它不保证顺序恒久不变
2||| TreeMap类不仅实现了Map接口,还实现了java.util.SortedMap接口,因此,集合中的映射关系具有一定的顺序。但在添加、删除和定位映射关系时,TreeMap类比HashMap类性能稍差。由于TreeMap类实现的Map集合中的映射关系是根据键对象按照一定的顺序排列的,因此不允许键的对象是null
可以通过HashMap类创建Map集合,当需要顺序输出时,再创建一个完成相同映射关系的TreeMap类实例。
实例代码: package com.COLLECTION; import com.COLLECTION.Emp; import java.util.*; public class MapTest1 { public static void main(String[] args) { Map<String,String> map=new HashMap<>(); //由HashMap实现的Map对象 Emp emp=new Emp("10000","张三"); Emp emp1=new Emp("10010","李四"); Emp emp2=new Emp("10086","王一"); Emp emp3=new Emp("10090","赵六"); Emp emp4=new Emp("10020","黄七"); map.put(emp2.getId(),emp2.getName()); //添加对象 map.put(emp3.getId(),emp3.getName()); map.put(emp1.getId(),emp1.getName()); map.put(emp4.getId(), emp4.getName()); map.put(emp.getId(),emp.getName()); 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); System.out.println(str+" "+name); //遍历Map集合 } TreeMap<String,String> treeMap=new TreeMap<>(); //创建TreeMap集合对象 treeMap.putAll(map); //向集合中添加对象 Iterator<String> iterator=treeMap.keySet().iterator(); //TreeMap迭代器 System.out.println("升序排列:"); while (iterator.hasNext()) { String str=(String)iterator.next(); //获取集合汇总的key对象 String name=(String)treeMap.get(str); //获取集合中的value值 System.out.println(str+" "+name); } } }
运行结果: HashMap类实现的Map无序集合: 10090 赵六 10086 王一 10020 黄七 10000 张三 10010 李四 升序排列: 10000 张三 10010 李四 10020 黄七 10086 王一 10090 赵六