速递!Java 集合类详解(一)
为什么要使用集合
存储多个数据可以使用数组,但由于数组在内存中是连续存储的,所以会有一些限制。比如数组在创建时就要指定长度,即可以容纳的元素个数,且指定后无法更改;数组在创建时需要指定元素的类型,并且所有元素都必须是该类型或其子类;添加或删除数组中的元素需要创建一个新数组再进行元素复制,比较麻烦。下面是 Person 数组扩容的示意代码。
(资料图)
// 给 people1 数组末尾添加一个元素public class PersonArray { public static void main(String[] args) { Person[] people1 = new Person[1]; people1[0] = new Person(); // 创建新数组 Person[] people2 = new Person[people1.length + 1]; // 复制 people1 数组的元素到 people2 for (int i = 0; i < people1.length; i++) { people2[i] = people1[i]; } // 添加新元素 people2[people2.length - 1] = new Person(); }}
数组可以通过索引快速访问和操作元素,在许多场景下仍然是非常有用的,但如果需要动态调整大小或保存不同类型的元素,则可以考虑使用集合类来代替数组。集合类还提供了一系列增加、删除、修改和查找元素的方法。集合框架中还提供了多种优化和封装好的实现类,通过使用合适的集合类可以更高效地组织和操作数据。
集合框架体系
Java 的集合类很多,主要有Collection
和Map
两个接口,层次关系如下图。
Collection
接口有List
和Set
这两个重要的子接口,它们的实现子类都是单列集合。其中List
接口表示有序的、可以包含重复元素的集合,常见的实现类有ArrayList
、LinkedList
和Vector
。Set
接口表示无序的且不包含重复元素的集合,常见的实现类有HashSet
、TreeSet
和LinkedHashSet
。
Map
接口实现子类是双列集合,表示一组键值对的映射,其中每个键都是唯一的。常见的实现类有HashMap
、Hashtable
和Properties
。
public class AddElements() { public static void main(String[] args) { ArrayList
Collection 接口和常用方法
Collection 接口实现类的特点
Collection
实现类(通常通过其中一个子接口间接实现Collection)可以存放多个 Object 类型的元素。有些Collection
接口的实现类可以存放重复的元素,有些则不可以。有些Collection
接口的实现类是有序的(List
),有些是无序的(Set
)。Collection
接口没有直接实现类,提供了更具体的子接口(如Set
和List
)的实现。
所有通用的Collection实现类都会提供两个"标准"构造方法:一个无参构造方法,来创建一个空的集合,以及一个带有单个Collection类型参数的构造方法,创建一个与参数集合具有相同元素的新集合。实际上,后一种构造方法可以复制任何集合,生成一个与参数集合元素相同的所需类型的集合。
public class CollectionMethod() { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(1); list.add(2); list.add(3); System.out.println(list);// [1, 2, 3] Vector
Collection 接口常用方法
下面的代码以其间接实现类ArrayList
演示Collection
接口的常用方法。
public class CollectionMethod() { public static void main(String[] args) { Collection collection = new ArrayList<>(); // boolean add(E e) // 给集合中添加指定的元素,添加成功则返回 true。 // 如果此集合不允许重复元素并且已经包含了指定的元素,则返回 false。 // 支持此操作的实现类可能会对添加到该集合中的元素进行限制。 // 如果一个集合拒绝添加某个特定元素的原因不是因为集合已经包含该元素, // 会抛出一个异常(而不是返回 false)。 collection.add("hello"); collection.add(10); collection.add(true); // 下面一条语句执行后输出:collection = [hello, 10, true] System.out.println("collection = " + collection); // boolean remove(Object o) // 从集合中移除指定元素的一个实例。如果集合包含多个满足 // (o==null ? e==null : o.equals(e))条件的元素 e, // 则移除第一个元素 e。移除完成后返回 true。 collection.remove("hello"); // 下面一条语句执行后输出:collection = [10, true]System.out.println("collection = " + collection); // boolean contains(Object o) // 如果此集合包含指定元素,则返回 true。更准确地说,当且仅当此集合包含至少 // 一个满足(o==null ? e==null : o.equals(e))条件的元素 e 时,返回 true。 System.out.println(collection.contains(10));// true // int size() // 返回此集合中的元素数量。 System.out.println(collection.size());// 2 // boolean isEmpty() // 判断集合是否为空。 System.out.println(collection.isEmpty());// false // void clear() // 清空集合中的元素。 collection.clear(); // 下面一条语句执行后输出:collection = [] System.out.println("collection = " + collection); // boolean addAll(Collection extends E> c) // 将指定集合中的所有元素添加到此集合中。 Collection collection1 = new ArrayList(); collection1.add("Mary"); collection1.add("Luck"); collection.addAll(collection1); // 下面一条语句执行后输出:collection = [Mary, Luck] System.out.println("collection = " + collection); // boolean containsAll(Collection> c) // 判断此集合是否包含指定集合中的所有元素 System.out.println(collection.containsAll(collection1));// true // boolean removeAll(Collection> c) // 从此集合中移除与指定集合中相同的所有元素。 // 在此调用返回后,此集合将不包含与指定集合共有的任何元素。 collection.add("King"); collection.removeAll(collection1); // 下面一条语句执行后输出:collection = [King] System.out.println("collection = " + collection); }}
Collection 接口如何遍历元素
使用 Iterator(迭代器)
Iterator
接口是集合的迭代器,主要用于遍历Collection
集合中的元素。所有实现了Collection
接口的实现类,都有一个iterator()
方法,用以返回一个实现了Iterator
接口的对象,即可以返回一个迭代器。
Iterator
接口的方法:
// 判断是否还有下一个元素boolean hasNext() // 返回集合中的下一个元素E next()// 从底层集合中移除此迭代器返回的最后一个元素。每次调用 next() 只能调用此方法一次。// 如果在调用此方法之前尚未调用过 next() 方法,或者在最后一次调用 next() 方法之后// 已经调用了过一次 remove() 方法,则抛出 IllegalStateException 异常。default void remove() // 对剩余的每个元素执行给定的操作,直到所有元素被处理完或操作抛出异常为止。default void forEachRemaining(Consumer super E> action)
迭代器的使用示例代码:
public class CollectionIterateor() { public static void main(String[] args) { Collection col = new ArrayList(); col.add("红楼梦"); col.add("西游记"); col.add("三国演义"); col.add("水浒传"); // 遍历 col 集合 // 先获得 col 对应的迭代器 Iterator iterator = col.iterator(); // 使用 while 循环遍历 while (iterator.hasNext()) {// 判断是否还有元素 Object obj = iterator.next(); // 返回下一个元素,类型是 Object System.out.println("obj = " + obj); } // 当退出 while 循环后,iterator 迭代器指向最后一个元素 // 此时再调用 next() 会抛出 NoSuchElementException 异常 // iterator.next(); // 如果需要再次遍历,需要重制迭代器 System.out.println("===第二次遍历==="); iterator = col.iterator(); while (iterator.hasNext()) { Object obj = iterator.next(); System.out.println("obj = " + obj); } }}
由于当迭代器中不存在下一个元素时,直接调用 iterator.next() 方法会抛出 NoSuchElementException 异常,所以调用 iterator.next() 方法之前需要调用 iterator.hasNext() 方法。
增强 for 循环
增强 for 循环是简化版的 iterator,本质一样,只能用来遍历集合或数组。基本语法如下:
for(元素类型 元素名 : 集合名或数组名){访问元素;}
public class EnhancedFor() { public static void main(String[] args) { Collection collection = new ArrayList(); collection.add("mary"); collection.add(true); collection.add(10); for (Object o : collection) { System.out.println("o = " + o); } }}
关键词:
下一篇:最后一页
精心推荐
- 速递!Java 集合类详解(一)
- 西部(重庆)科学城高新技术企业年底有望达1150家
- 世界头条:判断一个人开车水平高低,看这4点就可以了
- 骁龙660相当于麒麟多少-环球热推荐
- 崔东树:1-4月动力电池装车量91GWh 同比增长41%
- 世界简讯:金智科技成功中标国家电网有限公司配网相关项目 累计中标金额5787.74万
- 飘舞的军旗下合集(飘舞的军旗下)-当前热文
- 世界热议:多个见底信号已出 A股何时变盘?
- 连续举办七届、吸引8000名青年,2023上海海峡两岸青年创业大赛今天启动-热消息
- 世界热消息:船舶电子电气工程考研怎么样员真实的资
- 建好蔬菜大棚促增收
- 东风集团股份(00489)5月30日耗资约1790万港元回购530万股
- 【环球新要闻】盐城打造15分钟医保服务圈 把医保服务搬到群众家门口
- 福建2023年中级经济师考试报名时间及报名入口
X 关闭
行业排行
- 1、深圳:积极推进旅游业恢复 扎实推动经济稳定增长
- 2、保定定州提出一系列发展措施 引领体品产业向智能化品牌化高端化迈进
- 3、河北省财政厅充分发挥财政职能作用 促进交通运输事业发展
- 4、太原阳曲人才公寓项目开启施工招标工作 共有1954套人才公寓满足人才居住需求
- 5、山西出口钢构件顺利发货 为企业加强科技创新开辟了更为广阔的发展空间
- 6、上半年泰州姜堰实现新签约亿元和1000万美元以上项目95个 计划总投资208.319亿元
- 7、清华博士非洲修电站 因为他,“内卷”成为网络热词
- 8、内蒙古新增本土确诊病例3例 均在呼伦贝尔满洲里市
- 9、31省份新增新冠肺炎确诊病例67例 其中本土50例
- 10、浙江新增本土确诊病例45例 其中宁波6例、绍兴39例
X 关闭
产业
-
不用跑北京 在家门口也能挂上顶...
日前,我省首个神经疾病会诊中心——首都医科大学宣武医院河北医院...
-
“十四五”期间 河北省将优化快...
从省邮政管理局获悉,十四五期间,我省将优化快递空间布局,着力构...
-
张家口市宣化区:光伏发电站赋能...
3月19日拍摄的张家口市宣化区春光乡曹庄子村光伏发电站。张家口市宣...
-
“张同学”商标被多方抢注 涉及...
“张同学”商标被多方抢注,官方曾点名批评恶意抢注“丁真” ...
-
山东济南“防诈奶奶团”花式反诈...
中新网济南12月15日电 (李明芮)“老有所为 无私奉献 志愿服...
-
广州新增1例境外输入关联无症状...
广州卫健委今日通报,2021年12月15日,在对入境转运专班工作人...
-
西安报告初筛阳性病例转为确诊病例
12月15日10:20,经陕西西安市级专家组会诊,西安市报告新冠病毒...
-
广东东莞新增本土确诊病例2例 ...
(抗击新冠肺炎)广东东莞新增本土确诊病例2例 全市全员核酸检测...
-
中缅边境临沧:民警深夜出击捣毁...
中新网临沧12月15日电 (胡波 邱珺珲)记者15日从云南临沧边境...
-
“土家鼓王”彭承金:致力传承土...
中新网恩施12月15日电 题:“土家鼓王”彭承金:致力传承土家...