Java学习记录
日期: 10.28
📖今日知识点 ——集合的分类
一、Java 集合主要分为两大类:
单列集合 (Collection):一次存取一个元素。
双列集合 (Map):一次存取一对数据(键值对)。
二、单列集合 (Collection) 体系结构
Collection(接口)│ ├──List(接口)│ ├──ArrayList(实现类)│ ├──LinkedList(实现类)│ └──Vector(实现类)│ └──Set(接口)├──HashSet(实现类)│ └──LinkedHashSet(实现类)└──TreeSet(实现类)1. List 系列集合特点
有序:添加的元素是有序的。
可重复:可以添加重复的元素。
有索引:可以通过索引访问元素。
2. Set 系列集合特点
无序:添加的元素是无序的。
不重复:不能添加重复的元素。
无索引:不能通过索引访问元素。
三、 Collection 接口常用方法
Collection 是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的。
| 方法名称 | 说明 |
|---|---|
public boolean add(E e) | 把给定的对象添加到当前集合中 |
public void clear() | 清空集合中所有的元素 |
public boolean remove(E e) | 把给定的对象在当前集合中删除 |
public boolean contains(Object obj) | 判断当前集合中是否包含给定的对象 |
public boolean isEmpty() | 判断当前集合是否为空 |
public int size() | 返回集合中元素的个数/集合的长度 |
💻练习代码
练习代码1:
packagecom.itheima.mycollection;importjava.util.ArrayList;importjava.util.Collection;publicclassA01_CollectionDemo1{publicstaticvoidmain(String[]args){/* /* public boolean add(E e) 添加 public void clear() 清空 public boolean remove(E e) 删除 public boolean contains(Object obj) 判断是否包含 public boolean isEmpty() 判断是否为空 public int size() 集合长度 注意点: Collection是一个接口,我们不能直接创建他的对象。 所以,现在我们学习他的方法时,只能创建他实现类的对象。 实现类:ArrayList *///目的:为了学习Collection接口里面的方法//自己在做一些练习的时候,还是按照之前的方式去创建对象。Collection<String>coll=newArrayList<>();//1.添加元素//细节1:如果我们要往List系列集合中添加数据,那么方法永远返回true,因为List系列的是允许元素重复的//细节2:如果我们要往Set系列集合中添加数据,那么方法返回值就表示添加成功没有,因为Set系列的是不允许元素重复的//因为Set系列的集合不允许元素重复,所以如果添加的元素已经存在,那么添加失败,方法返回falsecoll.add("aaa");coll.add("bbb");coll.add("ccc");System.out.println(coll);//2.清空元素//coll.clear();//System.out.println(coll);//3.删除元素//注意1:因为collection里面定义的是共性的方法,所以此时不能通过索引进行删除,只能通过元素的对象//注意2:方法会有一个布尔类型的返回值,删除成功返回true,删除失败返回false//如果删除的元素不存在,那么方法返回falsecoll.remove("bbb");System.out.println(coll);//4.判断元素是否包含//细节1:底层是依赖equals方法进行判断的//细节2:如果存的是自定义对象,没有重写equals方法,那么默认使用的是Object类中的equals方法进行判断,而Object类中的equals方法默认比较的是对象的地址值//需要在自定义的JavaBean中重写equals方法//不过字符串已经重写equals方法了booleanresult=coll.contains("aaa");//trueSystem.out.println(result);//5.判断集合是否为空//底层是依赖size方法进行判断的System.out.println(coll.isEmpty());//false//6.获取集合的长度System.out.println(coll.size());//2}}练习代码2:
packagecom.itheima.mycollection;importjava.util.Objects;publicclassStudent{privateStringname;privateintage;publicStudent(){}publicStudent(Stringname,intage){this.name=name;this.age=age;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}//重写equals方法@Overridepublicbooleanequals(Objecto){if(o==null||getClass()!=o.getClass())returnfalse;Studentstudent=(Student)o;returnage==student.age&&Objects.equals(name,student.name);}}packagecom.itheima.mycollection;importjava.util.ArrayList;importjava.util.Collection;publicclassA02_CollectionDemo2{publicstaticvoidmain(String[]args){//1.创建集合对象Collection<Student>coll=newArrayList<>();//2.创建3个学生对象Students1=newStudent("张三",18);Students2=newStudent("李四",19);Students3=newStudent("王五",20);//3.添加学生对象到集合中coll.add(s1);coll.add(s2);coll.add(s3);//4.判断集合中是否包含张三这个元素Students4=newStudent("张三",18);//因为contains方法在底层依赖于equals方法//如果存的是自定义对象,没有重写equals方法,那么默认使用的是Object类中的equals方法进行判断,而Object类中的equals方法默认比较的是对象的地址值//需求:如果姓名和年龄一样,则认为是同一个对象//需要在自定义的JavaBean中重写equals方法System.out.println(coll.contains(s4));//true}}📖今日知识点 ——迭代器
一、迭代器 (Iterator)
1. 基本概念:迭代器在遍历集合的时候是不依赖索引的。
2. 迭代器需要掌握三个方法(代码示例):
| 方法名称 | 说明 |
|---|---|
boolean hasNext() | 判断当前位置是否有元素,有元素返回 true,没有元素返回 false |
E next() | 获取当前位置的元素,并将迭代器对象移向下一个位置 |
Iterator<E> iterator() | 返回迭代器对象,默认指向当前集合的 0 索引位置。 |
Iterator<String>it=list.iterator();while(it.hasNext()){Stringstr=it.next();System.out.println(str);}3. 迭代器的四个细节:
🔴 如果当前位置没有元素,还要强行获取,会报 NoSuchElementException(异常)。
🔴 迭代器遍历完毕,指针不会复位。
🔴 循环中只能用一次 next 方法。
🔴 迭代器遍历时,不能用集合的方法进行增加或者删除。
💻练习代码
练习代码一:迭代器遍历:
packagecom.itheima.mycollection;importjava.util.ArrayList;importjava.util.Collection;importjava.util.Iterator;publicclassA03_CollectionDemo3{publicstaticvoidmain(String[]args){/* Collection系列集合三种通用遍历方式: 1. 迭代器遍历 2. 增强for遍历 3. Lambda表达式遍历 迭代器遍历相关的三个方法: public Iterator<E> iterator():获取一个迭代器对象 Boolean hasNext():判断当前指向的位置是否有元素 E next():获取当前指向的位置并移动指针 *///1.创建集合并添加元素Collection<String>coll=newArrayList<>();coll.add("aaa");coll.add("bbb");coll.add("ccc");coll.add("ddd");//2.获取迭代器对象//迭代器就好比一个箭头,默认指向集合的0索引位置Iterator<String>it=coll.iterator();//3.利用循环不断的取获取集合中的每一个元素while(it.hasNext()){Stringstr=it.next();System.out.println(str);}}}练习代码二:迭代器的四个细节:
packagecom.itheima.mycollection;importjava.util.ArrayList;importjava.util.Collection;importjava.util.Iterator;publicclassA04_CollectionDemo4{publicstaticvoidmain(String[]args){/* 迭代器的细节注意点: 1.报错NoSuchElementException 2.迭代器遍历完毕,指针不会复位 3.循环中只能用一次next方法 4.迭代器遍历时,不能用集合的方法进行增删操作 *///1.创建集合并添加元素Collection<String>coll=newArrayList<>();coll.add("aaa");coll.add("bbb");coll.add("ccc");coll.add("ddd");//2.获取迭代器对象//迭代器就好比一个箭头,默认指向集合的0索引位置Iterator<String>it=coll.iterator();//3.利用循环不断的取获取集合中的每一个元素while(it.hasNext()){Stringstr=it.next();System.out.println(str);}//4.当上面的循环结束之后,迭代器的指针已经指向了最后没有元素的位置//System.out.println(it.next());//NoSuchElementException//5.迭代器遍历完毕,指针不会复位System.out.println(it.hasNext());//false//6.如果我们要继续第二次遍历集合,只能再次获取一个新的迭代器对象Iterator<String>it2=coll.iterator();while(it2.hasNext()){Stringstr=it2.next();System.out.println(str);}}}packagecom.itheima.mycollection;importjava.util.ArrayList;importjava.util.Collection;importjava.util.Iterator;publicclassA05_CollectionDemo5{publicstaticvoidmain(String[]args){/* 迭代器的细节注意点: 1.报错NoSuchElementException 2.迭代器遍历完毕,指针不会复位 3.循环中只能用一次next方法 4.迭代器遍历时,不能用集合的方法进行增删操作 *///1.创建集合并添加元素Collection<String>coll=newArrayList<>();coll.add("aaa");coll.add("bbb");coll.add("ccc");coll.add("ddd");coll.add("eee");//2.获取迭代器对象//迭代器就好比一个箭头,默认指向集合的0索引位置Iterator<String>it=coll.iterator();//3.利用循环不断的取获取集合中的每一个元素while(it.hasNext()){//4.next方法的两件事:获取元素,并移动指针//System.out.println( it.next());//aaa ccc eee//System.out.println( it.next());//bbb ddd 获取不到元素NoSuchElementExceptionStringstr=it.next();//5.迭代器遍历时,不能用集合的方法进行增删操作// if("bbb".equals(str)){// coll.remove("bbb");// }// System.out.println(coll);//ConcurrentModificationExceptionSystem.out.println(str);}}}📖今日知识点 ——增强for遍历
一、增强for核心原理:
- 增强 for 的底层就是迭代器,为了简化迭代器的代码书写而设计的。
- 它是 JDK5 之后出现的,其内部原理就是一个 Iterator 迭代器。
- 使用限制:所有的单列集合和数组才能用增强 for 进行遍历。
二、基本格式:
for (元素的数据类型 变量名 : 数组或者集合) {
}
三、具体示例:
for(Strings:list){System.out.println(s);}四、增强for遍历小细节:
修改增强for中的变量,不会改变集合中原本的数据
💻练习代码
packagecom.itheima.mycollection;importjava.util.ArrayList;importjava.util.Collection;importjava.util.Iterator;publicclassA06_CollectionDemo6{publicstaticvoidmain(String[]args){/* Collection系列集合三种通用遍历方式: 1. 迭代器遍历 2. 增强for遍历 3. Lambda表达式遍历 增强for格式: for(数据类型 变量名 : 集合/数组){ } 快速生成格式:集合的名字.for回车 *///1.创建集合并添加元素Collection<String>coll=newArrayList<>();coll.add("zhangsan");coll.add("lisi");coll.add("wangwu");//2.增强for遍历//注意点://s是一个第三变量,在循环的过程中依次表示集合中的每一个数据// for(String s : coll){// System.out.println(s);// }//快速生成:coll.for回车for(Strings:coll){s="qqq";}//增强for的小细节:修改增强for中的变量,不会改变集合中原本的数据System.out.println(coll);//[zhangsan, lisi, wangwu]}}📖今日知识点 ——Lambda表达式遍历
Lambda表达式遍历:
得益于 JDK 8 开始的新技术 Lambda 表达式,提供了一种更简单、更直
核心方法
| 方法名称 | 说明 |
|---|---|
default void forEach(Consumer<? super T> action) | 结合 Lambda 表达式遍历集合,对集合中的每个元素执行指定操作 |
| 。 |
核心方法
💻练习代码
packagecom.itheima.mycollection;importjava.util.ArrayList;importjava.util.Collection;importjava.util.function.Consumer;publicclassA07_CollectionDemo7{publicstaticvoidmain(String[]args){/* Collection系列集合三种通用遍历方式: 1. 迭代器遍历 2. 增强for遍历 3. Lambda表达式遍历 Lambda表达式遍历: default void forEach(Consumer<? super T> action); *///1.创建集合并添加元素Collection<String>coll=newArrayList<>();coll.add("zhangsan");coll.add("lisi");coll.add("wangwu");//2.利用匿名内部类的形式//底层原理://其实也会自己遍历集合,依次得到每一个元素//把得到的每一个元素,传递给下面的accept方法//s依次表示集合中的每一个元素/* coll.forEach(new Consumer<String>() { @Override public void accept(String s) { System.out.println(s); } }); *///Lambda表达式//()->{}coll.forEach(s->System.out.println(s));}}📖今日知识点 —— 小结
- Collection 是单列集合的顶层接口,所有方法被 List 和 Set 系列集合共享。
- 常见成员方法:
add、clear、remove、contains、isEmpty、size - 三种通用的遍历方式:
- 迭代器: 在遍历的过程中需要删除元素,请使用迭代器。
/* 在遍历过程中若需删除元素,必须通过迭代器的 remove() 方法操作, 而非集合本身的增删方法。这是为了避免并发修改异常, 确保遍历过程的稳定性与安全性。 */List<String>list=newArrayList<>(Arrays.asList("a","b","c","d"));// ❌ 错误做法:使用集合的 removefor(Strings:list){if("b".equals(s)){list.remove(s);// 抛出 ConcurrentModificationException}}// ✅ 正确做法:使用迭代器的 removeIterator<String>iterator=list.iterator();while(iterator.hasNext()){Strings=iterator.next();if("b".equals(s)){iterator.remove();// 安全删除}}- 增强 for、Lambda: 仅仅想遍历,那么使用增强 for 或 Lambda 表达式。