JAVA学习日记(十四)集合进阶
一、单列集合Collection
List系列集合特点:添加的元素是有序(存和取的顺序一致)、可重复、有索引
Set系列集合特点:添加的元素是无序(存和取的顺序有可能不一致)、不重复、无索引
Collection是所有单列集合的祖宗接口,其功能所有的单列集合都能继承使用。
import java.util.ArrayList;
import java.util.Collection;
public class Main {
public static void main(String[] args){
//利用多态创建对象
//对于成员变量:在子类的对象中,会把父类的成员变量继承下去。多态创建的对象是采用父类变量。
//对于成员方法:如果子类对方法进行了重写,那么在继承时,虚方法表中会覆盖父类的方法,因此多态创建的对象采用子类方法。
Collection<String> collection=new ArrayList<>();
//1、添加元素
//对于同为Collection子类的 List系列集合 和 Set系列集合 两者都继承了父类种的 add 方法
//如果是通过List系列集合的对象调用 add 方法,则方法永远返回true(添加成功),因为List系列集合允许元素重复
//如果是通过Set系列集合的对象调用 add 方法,则方法会在元素不重复的情况下返回true(添加成功),否则返回false,因为Set系列集合不允许元素重复
collection.add("abc");
collection.add("def");
collection.add("ghi");
System.out.println(collection); //[abc, def, ghi]
//2、清空
// collection.clear();
// System.out.println(collection); //[]
//3、删除
//因为Set系列集合具有 无序 的特点,因此在父类中定义的remove方法是共性的方法——既无法通过索引删除,只能通过元素的对象删除。
//方法返回的是boolean类型的值,删除成功(要删除的元素存在)则返回true,反之返回false。
System.out.println(collection.remove("abc")); //true
System.out.println(collection); //[def, ghi]
//4、判断元素是否包含
//contains方法底层是依赖equals方法进行判断是否存在的
//如果集合中存储的是自定义对象,也想通过contains方法判断是否包含,在Javabean中一定要重写Equals方法
//因为对于引用数据类型,equals方法比较的是元素的地址值
boolean result1=collection.contains("def");
boolean result2=collection.contains("defg");
System.out.println(result1); //true
System.out.println(result2); //false
//5、判断集合是否为空
boolean result3=collection.isEmpty();
System.out.println(result3); //false
//6、判断集合长度
System.out.println(collection.size()); //2
collection.add("abc");
System.out.println(collection.size()); //3
}
}
二、Collection遍历方式
(一)迭代器遍历
特点:不依赖索引
迭代器在Java中的类是Iterator,迭代器是集合专用的遍历方式。
注意点:
①代器遍历结束后,指针不会复位,若需要再次遍历,只能再创建一个新的迭代器对象
②循环中只能用一次next方法(可以用一个变量进行记录)
③迭代器遍历时,不能用集合的方法进行增加或者删除(若要进行删除操作,需要用迭代器对象调用remove方法,增加目前没有办法)
④如果当前位置没有元素,还要强行获取,会报错,报错类型位:NoSuchElementException
import java.util.ArrayList;
import java.util.Iterator;
public class Main {
public static void main(String[] args){
ArrayList<String> list=new ArrayList<>();
list.add("三");
list.add("连");
list.add("外");
list.add("加");
list.add("转");
list.add("发");
list.add("了");
list.add("吗");
list.add("?");
list.add("?");
Iterator<String> it=list.iterator(); //返回迭代器对象,默认指向集合的0索引
boolean flag=it.hasNext();
System.out.println(flag);
String str=it.next();//获取当前元素,并将迭代器对象移向下一个位置
System.out.println(str);// 三
str=it.next();
System.out.println(str);// 连
}
}
import java.util.ArrayList;
import java.util.Iterator;
public class Main {
public static void main(String[] args){
ArrayList<String> list=new ArrayList<>();
list.add("三");
list.add("连");
list.add("外");
list.add("加");
list.add("转");
list.add("发");
list.add("了");
list.add("吗");
list.add("?");
list.add("?");
Iterator<String> it=list.iterator(); //返回迭代器对象,默认指向集合的0索引
boolean flag=it.hasNext();
System.out.println(flag);
//使用迭代器进行遍历
while(it.hasNext()){
String str=it.next();
System.out.print(str+" ");//三 连 外 加 转 发 了 吗 ? ?
}
}
}
(二)增强for遍历
①增强for的底层就是迭代器,为了简化迭代器的代码书写的。
②是JDK5之后出现的,内部原理就是一个Iterator迭代器。
③所有的单列集合和数组才能用增强for进行遍历。
格式:
例:
import java.util.ArrayList;
import java.util.Collection;
public class Main {
public static void main(String[] args){
//集合的三种遍历方式:迭代器遍历 增强for循环遍历 lambda表达式遍历
Collection<String> list=new ArrayList<>();
list.add("三");
list.add("连");
list.add("外");
list.add("加");
list.add("转");
list.add("发");
list.add("了");
list.add("吗");
list.add("?");
list.add("?");
//增强for循环遍历
//快速生成方式: list.for (集合名字.for)
for(String s:list){
System.out.print(s+" ");
}
}
}
注意点:
修改增强for中的变量,不会改变集合中原本的数据(遍历过程中是用第三方变量记录集合中的元素,修改增强for中的变量不影响集合元素)
(三)Lambda表达式遍历
例:
import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;
public class Main {
public static void main(String[] args){
//集合的三种遍历方式:迭代器遍历 增强for循环遍历 lambda表达式遍历
Collection<String> list=new ArrayList<>();
list.add("三");
list.add("连");
list.add("外");
list.add("加");
list.add("转");
list.add("发");
list.add("了");
list.add("吗");
list.add("?");
list.add("?");
//增强for循环遍历
for(String s:list){
System.out.print(s+" ");
}
System.out.println();
System.out.println("________________________");
//使用匿名内部类的形式遍历
list.forEach(new Consumer<String>() {
@Override
//s依次表示集合中的每一个数据
//方法底层也是遍历集合,依次得到每一个元素,把得到的每一个元素,传递给下面的accept方法
//s依次表示集合中的每一个数据
public void accept(String s) {
System.out.print(s+" ");
}
});
System.out.println();
System.out.println("___________________________");
//使用Lambda表达式简化匿名内部类方法
list.forEach(s-> System.out.print(s+" "));
}
}
(四)总结
三、List系列集合
特点:有序、有索引、可重复
List集合方法:
①Collection的方法都继承了
②List集合有索引,有很多关于索引操作的方法:
关于remove方法的问题:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;
public class Main {
public static void main(String[] args){
//List系列集合
List<Integer> list1=new ArrayList<>();
list1.add(1);
list1.add(2);
list1.add(3);
//若想要删除元素1
//list1.remove(1); 会判断1为集合的索引而不是元素
//正确方法
list1.remove((Integer) 1);
System.out.println(list1); //[2, 3]
}
}
原因:remove方法在调用时,发生了重载现象,默认优先调用实参和形参类型一致的方法。
方法示例代码:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args){
//List系列集合
//因为List类是一个接口类,所以不能直接创建接口类的对象
//在这边只能创建一个List的实现类的对象
List<String> list=new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
System.out.println(list); //[aaa, bbb, ccc, ddd]
// add(int index,E element) 在指定索引出插入指定的元素
list.add(0,"fff");
System.out.println(list); //[fff, aaa, bbb, ccc, ddd]
System.out.println("__________________");
//E remove(int index) 删除指定索引处的元素,返回被删除的元素
String remove=list.remove(2);
System.out.println(remove); //bbb
System.out.println(list); //[fff, aaa, ccc, ddd]
// E set(int index,E element) 修改指定索引处的元素,将被修改处的原元素返回
System.out.println("_____________________");
String set=list.set(0,"hahaha");
System.out.println(set); //fff
System.out.println(list); //[hahaha, aaa, ccc, ddd]
System.out.println("_________________");
//E get(int index) 返回指定索引处的元素
String get=list.get(0);
System.out.println(get); //hahaha
}
}
List集合遍历方式:
示例代码:
import java.util.*;
public class Main {
public static void main(String[] args){
//List系列集合遍历方法
List<String> list=new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
System.out.println(list); //[aaa, bbb, ccc, ddd]
System.out.println("__________________________");
//1、迭代器遍历
//创建迭代器对象
Iterator<String> it=list.iterator();
System.out.print("迭代器遍历: ");
while(it.hasNext()){
String str=it.next();
System.out.print(str+" ");
}
System.out.println();
System.out.println("________________");
//2、增强for遍历
System.out.print("增强for遍历:");
for (String s : list) {
System.out.print(s+" ");
}
System.out.println();
System.out.println("______________________");
//3、Lambda表达式遍历
System.out.print("Lambda表达式遍历:");
list.forEach(s-> System.out.print(s+" "));
System.out.println();
System.out.println("___________________");
//4、普通for循环遍历
System.out.print("普通for循环遍历:");
for(int i=0;i<list.size();i++){
System.out.print(list.get(i)+" ");
}
System.out.println();
System.out.println("_________________________");
//5、列表迭代器遍历
//创建列表迭代器对象
//比迭代器多了一个功能: 能够在遍历的同时添加元素(之前只能用迭代器的remove方法删除元素)
ListIterator<String> lit=list.listIterator();
System.out.print("列表迭代器遍历: ");
while(lit.hasNext()){
String str=lit.next();
if("ddd".equals(str)){
lit.add("qqq");
}
System.out.print(str+" "); //aaa bbb ccc ddd
}
System.out.println();
System.out.println(list); //[aaa, bbb, ccc, ddd, qqq]
}
}
五种方法对比:
原文地址:https://blog.csdn.net/DDDiccc/article/details/143733860
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!