Java入门Day9:List集合

1. 集合

  • 集合主要分两组,单列集合和双列集合。
  • 集合是用于存放数据的空间,它不同于数组,可以存放多种类型的数据。
  • Collection接口有两个主要的子接口:List 和 Set,它们的实现子类都是单列集合。
  • Map接口的实现子类是双列集合,存放键值对。

2. Collection 接口

  • Collection实现子类可以存放多个元素,每个元素可以是Object。
  • 有些Collection的实现子类可以存放重复的元素,有些不能。
  • 有些子类是有序的(List),有些是无序的(Set)。
  • Collection接口没有直接实现的子类,是通过子接口List和Set来实现的。
  • 实现了Collection接口的子类可以使用父接口Iterable的Iterator方法。
  • Iterator的方法主要与next()、hasnext()、remove()。
  • 调用next()方法后必须调用hasnext()方法,否则会报错。

2.1 List 接口

  • 常用方法
public class Demo01 {
    public static void main(String[] args) {
        List list= new ArrayList();
        //添加单个元素 add
        list.add("jack");
        list.add(10);//list.add(new Intger(10))
        list.add(true);
        System.out.println(list);

        //删除指定元素 remove
        list.remove(0);//删除第一个元素,返回删除的元素
        list.remove(new Integer(10));//删除指定元素,返回布尔值
        System.out.println(list);

        //查找某个对象是否存在 contains,返回布尔值
        System.out.println(list.contains(true));
        System.out.println(list.contains("jack"));
        System.out.println(list);

        //获取元素的个数  size
        System.out.println(list.size());

        //判断是否为空 isEmpty
        System.out.println(list.isEmpty());

        //清空 clear
        list.clear();
        System.out.println(list);

        //添加多个对象 addAll
        List list2 = new ArrayList<>();
        list2.add("jack");
        list2.add("tom");
        list.addAll(list2);//实现了Collection的对象都可以添加
        System.out.println(list);

        //判断多个元素是否存在  ContainsAll
        System.out.println(list.containsAll(list2));

        //删除多个元素  removeAll
        list.removeAll(list2);
        System.out.println(list);

        //
    }
  • 迭代器遍历
public class Demo02 {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(new Book("猫和老鼠",60));
        list.add(new Book("海绵宝宝",10));
        list.add(new Book("喜洋洋",80));
        System.out.println(list);
        //通过Interator迭代器遍历
        Iterator iterator = list.iterator();
      //  while (integer.hasNext()){  //判断是否还有数据
      //      Object objects = integer.next();
        //    System.out.println(objects);}
        while (iterator.hasNext()) {      //itit快捷
            Object next =  iterator.next();
            System.out.println(next);
        }
        //当迭代器遍历完毕,退出while循环后,迭代器已经指向最后的元素,无法再next(),会返回异常
        //如果要重置迭代器,需要重置迭代器
        iterator = list.iterator();
    }
}
class Book{
    private String name;
    private int num;

    public Book(String name, int num) {
        this.name = name;
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", num=" + num +
                '}';
    }
}
  • 增强for循环遍历
public class Demo03 {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(new Book("猫和老鼠",60));
        list.add(new Book("海绵宝宝",10));
        list.add(new Book("喜洋洋",80));
        
        //增强for循环
        for (Object book:list) {
            System.out.println(book);
        }
    }
}
  • 例子
    创建Dog{name,age}对象,放入Arraylist中,赋给List引用,用迭代器和增强for两种方式遍历,重写Dog的toString方法,输出name和age。
import java.util.ArrayList;
import java.util.Iterator;

public class Test01 {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add(new Dog("小雪",10));
        arrayList.add(new Dog("小白",5));
        arrayList.add(new Dog("萌多",9));
        //建立迭代器
        Iterator iterator = arrayList.iterator();
        //迭代器遍历
        while (iterator.hasNext()) {
            Object next =  iterator.next();
            System.out.println(next);
        }
        //增强for循环遍历
        for (Object dog :arrayList) {
            System.out.println(dog);
        }


    }
}
class Dog{
    private String name;
    private int age;

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

2.2 ArrayList 集合

  • ArrayList可以加入null,并且可以加入多个。
  • ArrayList是由数组来实现数据储存的。
  • ArrayList基本等同于Vector,但ArrayList是线程不安全的,多线程的情况下,不建议用ArrayList
  • 底层源码。
  • ArrayList中维护了一个Object类型的数组elementData.
  • 当创建一个ArrayList对象时,如果使用无参构造器,则初始化elementData的容纳为0,添加元素,则扩容到10。
  • 需要再扩容时,会每次扩容1.5倍。
  • 如果使用指定大小的构造器,则初始容纳为指定大小,扩容时自己扩容1.5倍。

2.3LinkedList 集合

  • LinkedList 底层实现了双向链表和双端队列的特点。

  • 可以添加任意元素,元素可以重复,包括null。

  • 线程不安全,没有实现同步。

  • 构造LinkedList的底层源码实现过程。
    无参构造,LinkedList的size=0,last和first的指向都为null。

  • 添加LinkedList的元素的底层源码实现过程
    1.判断如果last为null,则创建一个新的newNode对象指向一个新的含有该元素空间,并使last指向这个新空间。
    2.size++ , modCounter++。
    newNode的next指向下一个Node,per指向上一个Node
    3.使添加位置的上一个Node的next指向新空间和下一个Node的per指向新空间。

2.4 Vector 集合

  • Vector集合是线程安全的,适用于多线程开发。
  • 它的底层实现和ArrayList是相似的,但它维护的elementData数组是被synchronized修饰的,因此它是线程安全的。
  • 当创建一个Vector对象时,如果使用无参构造器,则初始化elementData的容纳为0,添加元素,则扩容到10。
  • 需要再扩容时,会每次扩容2倍。
  • 如果使用指定大小的构造器,则初始容纳为指定大小,扩容时自己扩容2倍。
  • 并且Vector的扩容方法是可以通过三元运算符指定扩容大小的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值