java集合类
此类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,比如Collection,Iterator,List等。
有一个特点是,上述所有的集合类都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法。它的一个子接口LinkedIterator在它的基础上又添加了三种方法,分别是add(),previous(),hasPrevious()。也就是说如果是先Iterator接口,那么在遍历集合中元素的时候,只能往后遍历,被遍历后的元素不会在遍历到,通常无序集合实现的都是这个接口,比如HashSet,HashMap;而那些元素有序的集合,实现的一般都是LinkedIterator接口,实现这个接口的集合可以双向遍历,既可以通过next()访问下一个元素,又可以通过previous()访问前一个元素,比如ArrayList。
还有一个特点就是抽象类的使用。如果要自己实现一个集合类,去实现那些抽象的接口会非常麻烦,工作量很大。这个时候就可以使用抽象类,这些抽象类中给我们提供了许多现成的实现,我们只需要根据自己的需求重写一些方法或者添加一些方法就可以实现自己需要的集合类,工作量大大降低。
一、Collection接口
1、集合可以理解为一个动态的对象数组,不同的是集合中的对象内容可以任意扩充
2、集合的特点:
性能高
容易扩展和修改
3、Collection的常用子类
List
Set
Queue
<-------查看java API:由在线API文档->JDK中文版 本次所介绍集合类在java.util包下------>
二、List接口
1、List接口可以存放任意的数据,而且在List接口中内容是可以重复的
2、List接口常用子类:
ArrayList
Vector
3、常用操作:
判断集合是否为空:boolean isEmpty()
查找指定的对象是否存在:int indexOf(Object o)
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | package edu.tongji.list; import java.util.List; import java.util.ArrayList; public class ListDemo1 { public static void main(String[] args) { List<String> lists= null ; lists= new ArrayList<String>(); //使用ArrayList子类接口为例 lists.add( "A" ); lists.add( "B" ); lists.add( "A" ); //元素可以重复 for ( int i= 0 ;i<lists.size();i++){ System.out.println(lists.get(i)); } lists.remove( 0 ); System.out.println( "删除之后---" ); for ( int i= 0 ;i<lists.size();i++){ System.out.println(lists.get(i)); } System.out.println( "集合是否为空:" +lists.isEmpty()); System.out.println( "B是否存在:" +lists.indexOf( "B" )); System.out.println( "B是否存在:" +lists.indexOf( "C" )); } } |
运行结果:
1 2 3 4 5 6 7 8 9 | A B A 删除之后--- B A 集合是否为空: false B是否存在: 0 B是否存在:- 1 |
那么使用Vector有何区别呢?
三、Set接口
1、Set接口中不能加入重复元素,但是可以排序
2、Set接口常用子类
散列存放:HashSet
有序存放:TreeSet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package edu.tongji.list; import java.util.TreeSet; import java.util.Set; import java.util.HashSet; public class SetDemo01 { public static void main(String[] args) { Set<String> s= null ; s= new TreeSet<String>(); s.add( "B" ); s.add( "A" ); s.add( "C" ); s.add( "E" ); s.add( "D" ); s.add( "F" ); System.out.println(s); Set<String> s1= null ; s1= new HashSet<String>(); s1.add( "B" ); s1.add( "A" ); s1.add( "C" ); s1.add( "E" ); s1.add( "D" ); s1.add( "F" ); System.out.println(s1); } } |
四、Iterator接口
1、集合输出的标准操作:
标准做法,使用Iterator接口
2、操作原理:
Iterator是专门的迭代输出接口,迭代输出就是将元素一个个进行判断,判断其是否有内容,如果有内容则把内容取出
方法摘要:
boolean | hasNext() 如果仍有元素可以迭代,则返回 true。 |
E | next() 返回迭代的下一个元素。 |
void | remove() 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。 |
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package edu.tongji.list; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratorDemo01 { public static void main(String[] args) { List<String> lists= new ArrayList<String>(); lists.add( "A" ); lists.add( "B" ); lists.add( "C" ); lists.add( "D" ); lists.add( "E" ); Iterator<String> iter=lists.iterator(); while (iter.hasNext()){ String str=iter.next(); if ( "A" .equals(str)){ iter.remove(); } else System.out.println(str); } } } |
执行结果:
1 2 3 4 | B C D E |
注意点:在迭代输出的同时,不能对集合元素进行删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package edu.tongji.list; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratorDemo01 { public static void main(String[] args) { List<String> lists= new ArrayList<String>(); lists.add( "A" ); lists.add( "B" ); lists.add( "C" ); lists.add( "D" ); lists.add( "E" ); Iterator<String> iter=lists.iterator(); while (iter.hasNext()){ //lists.remove(2); System.out.println(iter.next()); } } } |
否则会报错:
1 2 3 4 | Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next(Unknown Source) at edu.tongji.list.IteratorDemo01.main(IteratorDemo01.java: 19 ) |
五、Map接口
1、保存形式:key—>value的方式保存
例如:小雪:13266668888
2、常用子类:
HashMap:无序存放,key不允许重复
Hashtable:无序存放,key不允许重复
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | package edu.tongji.list; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class MapDemo01 { public static void main(String[] args) { Map<String, String> map = new HashMap<String,String>(); map.put( "key1" , "www" ); map.put( "key2" , "hello" ); map.put( "key3" , "world" ); map.put( "key4" , "com" ); map.put( "key5" , "cn" ); String str=map.get( "key1" ); System.out.println(str); if (map.containsKey( "key1" )){ System.out.println( "key存在" ); } else { System.out.println( "key不存在" ); } if (map.containsValue( "hello" )){ System.out.println( "value存在" ); } else { System.out.println( "value不存在" ); } Set<String> s=map.keySet(); Iterator<String> i=s.iterator(); while (i.hasNext()){ System.out.println(i.next()); } Collection<String> c=map.values(); Iterator<String> iter=c.iterator(); while (iter.hasNext()){ System.out.println(iter.next()); } } } |
执行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 | www key存在 value存在 key1 key2 key5 key3 key4 www hello cn world com |
附几篇相关文章:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理