JavaSE基础——(16)List集合

目录

一、去除ArrayList重复字符串

二、LinkedList特有功能

 三、栈和队列

四、用LinkedList模拟栈数据结构

五、泛型

5.1泛型的基本概述

5.2泛型的好处

5.3泛型的使用

5.4ArrayList存储字符串使用泛型遍历

5.5泛型的由来

六、泛型类

6.1泛型类概述与使用

6.2泛型方法概述与使用

6.3泛型通配符

七、增强for循环

7.1增强for循环的概述和使用

7.2三种迭代是否能删除

八、静态导入

九、可变参数

9.1可变参数概述与使用

9.2Arrays工具类的asList()方法

十、集合的嵌套ArrayList


一、去除ArrayList重复字符串

import java.util.ArrayList;
import java.util.Iterator;

public class ListTest {
    public static void main(String []args){
        ArrayList list=new ArrayList();
        list.add("a");
        list.add("a");
        list.add("b");
        list.add("b");
        list.add("b");
        list.add("c");
        list.add("c");

        ArrayList newList=getSingle(list);
        System.out.println(newList);
    }

    public static ArrayList getSingle(ArrayList list){
        ArrayList newList=new ArrayList<>();
        Iterator it=list.iterator();

        while(it.hasNext()){
            Object obj=it.next();
            if(!newList.contains(obj)){
                newList.add(obj);
            }
        }
        return newList;
    }
}

二、LinkedList特有功能

public void addFirst(E e)//将元素添加到链表头部
public void addLast(E e)//将元素添加到链表尾部
public E getFirst()//获取链表头部元素
public E getLast()//获取链表尾部元素
public E removeFirst()//删除链表头部元素,并返回删除的元素
public E removeLast()//删除链表尾部元素,并返回删除的元素
public E get(int index)//获取指定索引处的元素

 三、栈和队列

    • 先进后出
  • 队列
    • 先进先出

四、用LinkedList模拟栈数据结构

import java.util.LinkedList;

public class ListTest {
    public static void main(String []args){
        Stack stack=new Stack();
        stack.in("a");
        stack.in("b");
        stack.in("c");

        while(!stack.isEmpty()){
            System.out.println(stack.out());
        }
    }
}

class Stack{
    private LinkedList list=new LinkedList();

    //模拟进栈
    public void in(Object obj){
        list.add(obj);
    }

    //模拟出栈
    public Object out(){
        return list.removeLast();
    }

    //判断栈元素是否为空
    public boolean isEmpty(){
        return list.isEmpty();
    }
}

五、泛型

5.1泛型的基本概述

泛型,即“参数化类型”,

就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,

在java中我们一般用<>表示,<>中为引用数据类型,

其作用是限定了集合存储的数据类型,或者说类中操作的数据类型,

5.2泛型的好处

  • 提高安全性,将运行期的错误转换到编译期
  • 省去强转的麻烦

5.3泛型的使用

public class PatternTest {
    public static void main(String []args){
        ArrayList<Student> list=new ArrayList<Student>();
        list.add(new Student("测试1",20));
        list.add(new Student("测试2",21));
        list.add(new Student("测试3",22));
        list.add(new Student("测试4",23));

        Iterator<Student> it=list.iterator();
        while(it.hasNext()){
            Student stu=it.next();
            System.out.println(stu.getName()+"  "+stu.getAge());
        }
    }
}

注意,前后的泛型必须一致,或者后面的泛型可以省略不写,但是尖括号不可以省略<>,

泛型也不要定义成Object,没有意义。

5.4ArrayList存储字符串使用泛型遍历

public class PatternTest {
    public static void main(String []args){
        ArrayList<String> list=new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");

        Iterator<String> it=list.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

5.5泛型的由来

早期的Object类型可以接受任意的对象类型,

但是在实际的使用中,会有类型转换的问题,也就存在着隐患,

如果在进行类型转换时两个类型不匹配,那么就会抛出ClassCastException,

所以java提供了泛型来解决这个安全问题。

六、泛型类

6.1泛型类概述与使用

将泛型定义在类上,在定义类的时候指定一个类型形参T,

在类中T就当作类型来使用,比如,

class myPattern<T>{
    private T t;
    public myPattern(T t) {
        this.t=t;
    }
    public T getT() {
        return t;
    }
    public void setT(T t) {
        this.t = t;
    }
}

6.2泛型方法概述与使用

将泛型定义在方法上,定义的格式如下,

public <泛型类型> 返回值类型 方法名(泛型类型 形参名)

比如,

public <T> void show(T t){
    System.out.println(t);
}

注意,这里的方法泛型最好与类的泛型一致,如果不一致,需要在方法上声明该泛型。

但是如果为静态方法时,则方法的泛型不能与类泛型一致,必须要声明自己的泛型!

6.3泛型通配符

泛型通配符通常表示为:<?>,

它表示任意类型,如果没有明确,则为Object以及任意的Java类,

List<?> list=new ArratList<String>();//当右边的泛型是不确定时,左边可以指定为?

七、增强for循环

7.1增强for循环的概述和使用

增强for是用来简化数组和Collection集合的遍历,比如,

        //遍历数组
        int arr[]={1,2,3};
        for(int i:arr){
            System.out.println(i);
        }

        //遍历集合
        ArrayList<String> list=new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("c");
        for(String i:list){
            System.out.println(i);
        }

7.2三种迭代是否能删除

  • 普通for循环:可以删除,但是索引要自减
  • 迭代器:可以删除,但是必须要使用迭代器自身的remove方法,否则会出现并发修改异常
  • 增强for循环:不可以删除,只能遍历
        ArrayList<String> list=new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("b");
        list.add("c");
        
        //for循环删除,索引要--
        for(int i=0;i<list.size();i++){
            if("b".equals(list.get(i))){
                list.remove(i--);
            }
        }

        //迭代器删除,用迭代器自身的remove方法
        Iterator<String> it=list.iterator();
        while(it.hasNext()){
            if("b".equals(it.next())){
                it.remove();
            }
        }

        //增强for循环不可以删除,只能遍历
        for(String str:list){
            if("b".equals(str)){
                list.remove("b");
            }
        }

        System.out.println(list);

八、静态导入

之前我们已经学习了导包,导包是导入一个类,

而这里的静态导入,导入的是一个静态方法,格式如下,

import static 包名.类名.方法名

这个方法必须是静态的,如果有多个同名的静态方法,容易不知道是使用哪个类中的方法,这个时候必须要加类前缀,一般不使用,

import static  java.util.Arrays.sort;

public class StaicImportTest {
    public static void main(String []args){
        int arr[]={5,7,4,9,0,1,6,2,8,3};
        sort(arr);
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
    }
}

九、可变参数

9.1可变参数概述与使用

如果在定义方法的时候不知道该定义多少个参数,那么我们就会使用可变参数,

使用格式为,

修饰符 返回值类型 方法名(数据类型... 变量名){}

这里的变量名就代表了一个数组,可变参数其实和数组类似,但是功能比数组更强大,

可变参数不仅可以接受数组地址作为参数,还可以接受一个实际意义上的数组比如{1,2,3},还可以什么都不给,

    public static void main(String []args){
        int arr[]={5,7,4,9,0,1,6,2,8,3};
        print(arr);
        print(1,2,3);
    }

    public static void print(int... arr){
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }

如果一个方法有可变参数,并且有多个参数,那么可变参数一定要放在最后一个位置。

9.2Arrays工具类的asList()方法

static List<T> asList(T... a)//返回一个受指定数组支持的固定大小的列表

这里asList()方法返回值类型是一个集合,接受的参数数组a,功能是将一个数组转换为集合,

这里就用到了可变参数,我们看看这个功能具体如何使用,

String str[]={"a","b","c"};
List list= Arrays.asList(str);
System.out.println(list.toString());

注意,数组转换成集合之后,不能增加删除元素!但是可以使用其他的集合方法。

如果将基本数据类型的数组转换成集合,他会将整个数组当作一个对象转换,也就是会输出数组的地址,

如果一定要将基本数据类型的数组转换成集合,可以换成基本数据类型包装类比如Integer等。

十、集合的嵌套ArrayList

例:我们将一个年级分为若干个班级,班级里有不同的学生,整个年级为一个大集合,而班级又为每个小集合,

这样大集合里面就会嵌套小集合,我们看看如何实现,

        ArrayList<ArrayList<Student>> gradeSeven=new ArrayList<>();

        ArrayList<Student> classOne=new ArrayList<>();//一班
        classOne.add(new Student("一班测试1",20));
        classOne.add(new Student("一班测试2",21));
        classOne.add(new Student("一班测试3",22));

        ArrayList<Student> classTwo=new ArrayList<>();//二班
        classTwo.add(new Student("二班测试1",20));
        classTwo.add(new Student("二班测试2",21));

        //将班级添加到学校中
        gradeSeven.add(classOne);
        gradeSeven.add(classTwo);

        //遍历年级集合,输出年级中的每个人
        for(ArrayList<Student> i:gradeSeven){
            for(Student j:i){
                System.out.println(j);
            }
        }

猜你喜欢

转载自blog.csdn.net/weixin_39478524/article/details/112689237