Java集合
集合框架的体系结构
1.Collection接口 (存储类的对象) 的三个子接口:
1)List 列表(有序的、可重复的)
- 可以精确控制元素的插入位置、或者删除某个位置的元素
- 实现类:ArrayList(可以看成长度动态增长的数组)、LinkedList (链表)
2)Queue 队列(有序的、可重复的)
- 实现类:LinkedList
3)Set 集(无序的、不可重复的)
- 实现类:HashSet
2.Map接口 (以键值对的方式存储信息)
- 实现类:HashMap(哈希表)
Collection接口
boolean add();将定义好的对象添加到集合
void clear();移除集合当中的所有元素
boolean contains(Object o);判断集合中是否包含参数对象
boolean equals();
int hashCode();
boolean isEmpty();判断集合是否为空
Iterator<E> iterator();迭代器方法进行集合遍历
boolean remove();移除集合中某个元素
int size();返回集合长度
Object[ ] toArray();将集合转换为数组
List 列表(有序的、可重复的)
- 可以精确控制元素的插入位置、或者删除某个位置的元素
- 实现类:ArrayList(可以看成长度动态增长的数组)、LinkedList (链表)
E get(int index);返回列表中指定位置的元素
int indexOf(Object o); 返回某个对象在列表中的位置
default void sort(Comparator<? super E> c);排序
案例1:在List中存储并操作字符串信息
public static void main(String[] args) { List list=new ArrayList(); list.add("Java"); list.add("C"); list.add("C++"); list.add("Go"); list.add("swift"); System.out.println("列表中元素的个数为:"+list.size()); for(int i=0;i<list.size();i++){ System.out.print(list.get(i)+","); } System.out.println(); //移除列表中的C++ list.remove("C++"); System.out.println("列表中元素的个数为:"+list.size()); for(int i=0;i<list.size();i++){ System.out.print(list.get(i)+","); } System.out.println(); //判断列表中是否存在C System.out.println("判断列表中是否存在C的结果是:"); System.out.println(list.contains("C")); }
ArrayList实现类
- ArrayList底层是由数组实现的
- 动态增长,以满足应用程序的需求
- 在列表尾部插入或删除数据非常有效
- 更适合查找和更新元素
- ArrayList中的元素可以为null
构造方法:
ArrayList();初始化容量为10
ArrayList(Collection<? extends E> c);用已存在的集合数据创建一个数组序列
ArrayList(int initialCapacity);设置初始容量
案例2:用ArrayList实现公告管理
public static void main(String[] args) { //创建Notice类的对象,生成三条公告 Notice n1=new Notice(1,"欢迎来到慕课网","admin",new Date()); Notice n2=new Notice(2,"请同学们按时添加作业","teacher",new Date()); Notice n3=new Notice(3,"考勤通知!","teacher",new Date()); //添加公告 ArrayList noticeList=new ArrayList(); noticeList.add(n1); noticeList.add(n2); noticeList.add(n3); //显示公告 System.out.println("公告信息为:"); for(int i=0;i<noticeList.size();i++){ System.out.println(i+1+((Notice)noticeList.get(i)).getTitle()); } //在第一条公告后面添加一天新公告 Notice n4=new Notice(4,"在线编辑器可以使用了","admin",new Date()); noticeList.add(1,n4); System.out.println("----------------------------------"); System.out.println("插入后的公告信息为:"); for(int i=0;i<noticeList.size();i++){ System.out.println( i+1 + ( (Notice) noticeList.get(i) ).getTitle()); } //删除第三天公告 noticeList.remove(2); System.out.println("----------------------------------"); System.out.println("删除后的公告信息为:"); for(int i=0;i<noticeList.size();i++){ System.out.println(i+1+((Notice)noticeList.get(i)).getTitle()); } //修改第二条公告 n4.setTitle("Java在线编译器可以使用了"); //如果创建新的对象,需要调用set方法重新设置 // noticeList.set(1,n4); System.out.println("----------------------------------"); System.out.println("修改后的公告信息为:"); for(int i=0;i<noticeList.size();i++){ System.out.println(i+1+((Notice)noticeList.get(i)).getTitle()); } }
HashSet实现类
- HashSet是Set的一个重要实现类,称为哈希集
- HashSet的元素无序且不可重复
- HashSet只允许一个null元素
- 具有良好的存取和查找功能
- 底层是HashMap
构造方法:
HashSet();默认容量16,加载因子0.75
HashSet(Collection<? extends E> c);用已存在的集合创建一个哈希集
HashSet(int initialCapacity);设置初始容量
HashSet(int initialCapacity,int loadFator);设置初始容量,加载因子
Iterator接口(迭代器)
- 可以以统一的方式对各种集合元素进行遍历
- hasNext()方法检测集合中是否还有下一个元素
- next()方法返回集合中的下一个元素
案例3:在集合中插入字符串
public static void main(String[] args) { //将英文单词添加到HashSet中 Set set=new HashSet(); //向集合中添加元素 set.add("blue"); set.add("red"); set.add("black"); set.add("yellow"); set.add("white"); //遍历迭代器显示集合的内容 System.out.println("集合中的元素:"); Iterator it=set.iterator(); while(it.hasNext()){ System.out.print(it.next()+" "); } System.out.println(); //在集合中插入一个新的单词 set.add("green"); set.add("red");//插入重复单词无意义也不会报错 System.out.println("插入后集合中的元素:"); it=set.iterator(); while(it.hasNext()){ System.out.print(it.next()+" "); } System.out.println(); }
Set接口中hashCode和equals方法作用
- hashCode()用于给对象返回hash code值,equals()方法用于判断其他对象是否与该对象相等
- 由于HashSet中不允许添加重复元素,调用add方法时使用这两个方法判断元素是不同的。
1.添加数据时,会调用hashCode方法得到hash code的值,通过这个值可以找到数据存储的位置,这个位置可以理解为一片区域,在该区域中存储的数据hash code都是相等的
2.如果该区域已经有数据了,就继续调用equals()方法判断数据是否相等,如果相等就说明重复了,就不允许添加,如果hash code值不等,就找一个区域进行存储
3.这些都是基于哈希算法完成的,它使得添加数据的效率得到提升,假设Set集合中100个元素,那么想添加101个元素时如果没有哈希算法,就需要调用equals()方法将第101个元素与前面100个元素依次进行比较,如果元素更多,比较所耗费的时间就越长。
4.如果两个对象相等,那么他们hash code值一定相等,但是如果两个对象hash code值相等这两个对象不一定相等,就需要equals()方法进行判断。如果不重写hashCode()方法,默认每个对象的hashCode值都不一样,所以HashSet类每个对象都不会相等
案例4:HashSet实现宠物猫信息管理
public static void main(String[] args) { //定义宠物猫对象 Cat huahua=new Cat("花花",12,"英国短毛猫"); Cat fanfan=new Cat("凡凡",3,"中华田园猫"); //将宠物猫对象放入HashSet Set<Cat> set=new HashSet<Cat>(); set.add(huahua); set.add(fanfan); //显示宠物猫信息 Iterator<Cat> it= set.iterator(); while (it.hasNext()){ System.out.println(it.next()); } //添加一个新宠物猫,重写HashCode()方法和equals()方法后不会生效 System.out.println("----------------------------------------------"); Cat huahua01=new Cat("花花",12,"英国短毛猫"); set.add(huahua01); it=set.iterator(); while(it.hasNext()){ System.out.println(it.next()); } //查找 System.out.println("----------------------------------------------"); //在集合中查找花花的信息并输出 if(set.contains(huahua)){ System.out.println("花花找到了"); System.out.println(huahua); }else { System.out.println("花花没找到"); } //在集合中使用名字查找花花的信息 System.out.println("----------------------------------------------"); System.out.println("按名字查询"); boolean flag=false; Cat c=null; it= set.iterator(); while(it.hasNext()){ c=it.next(); if(c.getName().equals("花花")){ flag=true; break; } } if(flag){ System.out.println("花花找到了"); System.out.println(c); }else{ System.out.println("花花没找到"); } //删除花花二代的信息 System.out.println("----------------------------------------------"); Cat huahua02=new Cat("花花二代",2,"英国短毛猫"); set.add(huahua02); System.out.println("删除前的数据"); for(Cat cat:set){ System.out.println(cat); } System.out.println("删除后的数据"); Set<Cat> set1=new HashSet<Cat>(); for(Cat cat:set){ if("花花".equals(cat.getName())){ // set.remove(cat); // break; set1.add(cat); } } set.removeAll(set1); for(Cat cat:set){ System.out.println(cat); } //删除集合中所有的数据 System.out.println("----------------------------------------------"); boolean f=set.removeAll(set); if(set.isEmpty()){ System.out.println("猫都不见了"); }else { System.out.println("猫还在"); } }
Map接口
- Map中的数据是以键值对(key - value)的形式存在的
- key - value 以Entry类型的对象实例化存在
- 可以通过key值快速查找value值
- 一个映射不能包含重复的键
void clrear();清空集合
Set<Map. Entry<K,V>> entrySet();获取键值对的所有内容
V get(Object o);通过key取得对应的value
Set<K> keySet();取出集合中所有key值
V put(key,value);将元素添加到集合中
V remove(Object key);移除Map中的数据
Collection<V> values();返回所有的value值
HashMap实现类
- 允许使用null值和null键
- key值不允许重复
- HashMap中的Entry对象是无序排列的
案例5:HashMap的应用
Map<String,String> animal=new HashMap<String,String>(); System.out.println("请输入三组单词对应的注释,并存放到HashMap中"); Scanner console=new Scanner(System.in); //添加数据 int i=0; while(i<3){ System.out.println("请输入key(单词)值:"); String key=console.next(); System.out.println("请输入value(注释)值:"); String value=console.next(); animal.put(key,value); i++; } //1.打印输出value的值(直接使用迭代器) System.out.println("---------------------------------------"); System.out.println("使用迭代器输出所有的value"); //迭代器接口可以以统一的方式对各种集合元素进行遍历 Iterator<String> it=animal.values().iterator(); while(it.hasNext()){ System.out.print(it.next()+" "); } System.out.println(); //2.打印输出key和value的值(通过entrySet方法) System.out.println("---------------------------------------"); System.out.println("通过entrySet得到key-value"); //key-value组成到一起就是一个Entry对象 //entrySet方法把HashMap中的键值对都放到一个Entry的集合里 Set<Map.Entry<String,String>> entrySet=animal.entrySet(); for(Map.Entry<String,String> entry:entrySet){ System.out.println(entry.getKey()+"-"+entry.getValue()); } //通过单词找到注释并输出 //使用keySet方法 System.out.println("---------------------------------------"); String strSearch=console.next(); //1.取得keySet Set<String> keySet=animal.keySet(); //2.遍历keySet boolean flag=false; String k=null; for(String key:keySet){ if(strSearch.equals(key)){ k=key; flag=true; break; } } if(flag==true){ System.out.println("找到了!键值对为:"+k+"-"+animal.get(k)); }else{ System.out.println("没找到。。。"); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!