Day 17 集合框架(1)

这篇博客介绍了Java集合框架中的核心接口Collection及其特点,包括添加、删除、遍历和判断元素等基本操作。通过示例展示了ArrayList的使用,包括添加元素、删除元素、遍历元素以及判断元素是否存在等功能。还探讨了ArrayList的内部实现,如默认容量和扩容策略。此外,文章提到了其他集合实现如Vector和LinkedList,并展示了如何在ArrayList中存储和操作自定义对象。
摘要由CSDN通过智能技术生成

集合框架(1)

概念:对象的容器,定义了对多个对象进行操作的常用方法。可实现数组的功能。

和数组区别:

  • 数组长度固定,集合长度不固定
  • 数组可以存储基本类型和引用类型,集合只能存储引用类型

Collection体系集合

在这里插入图片描述

Collection父接口

特点:代表一组任意类型的对象,无序、无下标、不能重复。

方法:

  1. boolean add(0bject obj)//添加一个对象。
  2. boolean addAl1(Collection c)//将一个集合中的所有对象添加到此集合中。
  3. void clear()//清空此集合中的所有对象。
  4. boolean contains(0bject o)//检查此集合中是否包含o对象
  5. boolean equals(0bject o)//比较此集合是否与指定对象相等。
  6. boolean isEmpty()//判断此集合是否为空
  7. . boolean remove(Object o)//在此集合中移除o对象
  8. int size()//返回此集合中的元素个数。
  9. 0bject[] toArray ()//将此集合转换成数组。
package United;

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

/*
    Collection接口的使用
    1. 添加元素
    2. 删除元素
    3. 遍历元素
    4. 判断
 */
public class Demo01 {
    public static void main(String[] args) {
        //创建集合
        Collection a = new ArrayList();//有序的
        //1. 添加元素
        a.add("水果");
        a.add("香蕉");
        a.add("榴莲");
        a.add("草莓");
        System.out.println("元素的个数:"+a.size());
        System.out.println(a);
        //2. 删除元素
        a.remove("香蕉");
        System.out.println("元素的个数:"+a.size());
        //3. 遍历元素  第一种:增强for循环   第二种:迭代器
        for (Object b:a) {
            System.out.println(b);
        }
        //hasNext();有没有下一个元素
        //next();获取下一个元素
        //remove();删除当前元素
        //在迭代器的过程当中不能用其他的方法,如Collection
        Iterator c = a.iterator();
        while (c.hasNext()){
            String d = (String) c.next();
            System.out.println(d);
            c.remove();
        }
        System.out.println("元素的个数:"+a.size());

        //4. 判断
        System.out.println(a.contains("西瓜"));
        System.out.println(a.isEmpty());
    }
}

创建一个学生类

package United;

public class Student {
    private String name;
    private int age;

    public Student() {
    }
    public Student(String name,int age){
        super();
        this.name = name;
        this.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;
    }

    @Override
    public String toString() {
        return "Student["+"name:"+name+","+"age:"+age+"]";
    }
}

package United;

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

//Collection的使用:保存学生信息
public class Demo02 {
    public static void main(String[] args) {
        //新建Collection对象
        Collection a = new ArrayList();
        Student s1 = new Student("汪汪",12);
        Student s2 = new Student("小王",14);
        Student s3 = new Student("旺财",13);

        //1. 添加数据
        a.add(s1);
        a.add(s2);
        a.add(s3);
        System.out.println("元素的个数:"+a.size());
        System.out.println(a.toString());
        //2. 删除
        //a.remove(s1);
        System.out.println("删除之后:"+a.size());
        //a.clear();
        System.out.println("清空之后:"+a.size());
        //3.1 遍历 增强for循环
        for (Object b:a) {
            System.out.println(b);
        }
        System.out.println("===========================");
        //3.2  迭代器循环
        Iterator c = a.iterator();
        while (c.hasNext()){
            System.out.println(c.next().toString());
        }
        //4. 判断
        System.out.println(a.contains(s1));
        System.out.println(a.isEmpty());
    }
}

List集合

特点:有序、有下标、元素可以重复。

方法:

  • void add(int index,Object o) 在index位置插入对象o。
  • boolean addAll(int index,Collection c) 将一个集合中的元素添加到此集合中的index位置。
  • Object get(int index) 返回集合中指定位置的元素。
  • List subList(int fromIndex,int toIndex) 返回fromIndex和toIndex之间的集合元素。
package United;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class Demo03 {
    public static void main(String[] args) {
        //先创建集合对象
        List a = new ArrayList();
        //1. 添加元素
        a.add("安安");
        a.add("风扇");
        a.add("吉他");
        a.add(0,"华为");
        System.out.println("元素个数:"+a.size());
        System.out.println(a.toString());
        //2. 删除元素
        //a.remove("苹果");
        //a.remove(0);
        System.out.println("删除之后:"+a.size());
        System.out.println(a.toString());
        //3.1 增强for
        for (Object b:a) {
            System.out.println(b);
        }
        System.out.println("======================");
        //3.2 for循环
        for (int i = 0; i < a.size(); i++) {
            System.out.println(a.get(i));
        }
        System.out.println("======================");
        //3.3 迭代器循环
        Iterator c = a.iterator();
        while (c.hasNext()){
            System.out.println(c.next());
        }
        System.out.println("======================");
        //3.4 使用列表迭代器   ListIterator 和 Iterator的区别:ListIterator可以向前或向后遍历,添加、删除、修改元素
        ListIterator d = a.listIterator();
        while (d.hasNext()){
            System.out.println(d.next());
        }
        //4. 判断
        System.out.println(a.contains("华为"));
        System.out.println(a.isEmpty());
        //5. 获取位置
        System.out.println(a.indexOf("安安"));
    }
}

package United;

import java.util.ArrayList;
import java.util.List;

public class Demo04 {
    public static void main(String[] args) {
        //1. 创建一个集合
        List a = new ArrayList();
        //2. 添加数字数据(自动装箱)
        a.add(20);
        a.add(15);
        a.add(10);
        a.add(25);
        a.add(30);
        System.out.println("元素个数:"+a.size());
        System.out.println(a.toString());
        //3. 删除操作
        a.remove(2);
        a.remove((Object)20);
        System.out.println("删除后:"+a.size());
        System.out.println(a.toString());
        //3. 补充方法  subList:返回子集合  范围含头不含尾
        List b = a.subList(0,1);
        System.out.println(b.toString());
    }
}

List实现类

  • ArrayList【重点】:

    • 数组结构实现,查询快、增删慢;
    • JDK1.2版本,运行效率快、线程不安全。
  • Vector:

    • 数组结构实现,查询快、增删慢;
    • JDK1.0版本,运行效率慢、线程安全。
  • LinkedList:

    • 链表结构实现,增删快,查询慢。
package United;

public class Student {
    private String name;
    private int age;

    public Student() {
    }
    public Student(String name,int age){
        super();
        this.name = name;
        this.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;
    }

    @Override
    public String toString() {
        return "Student ["+"name:"+name+","+"age:"+age+"]";
    }

    @Override
    public boolean equals(Object obj) {
        //1. 判断是否为同一个对象
        if (this==obj){
            return true;
        }
        //2. 判断是否为空
        if (obj==null){
            return false;
        }
        //3. 判断是否为Student类型
        if (obj instanceof Student){
            Student s = (Student)obj;
            //4. 比较属性
            if (this.name.equals(s.getName())&&this.age==s.getAge()){
                return true;
            }
        }
        //5. 不满足条件返回false
        return false;
    }
}

package United;

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

public class Demo05 {
    public static void main(String[] args) {
        ArrayList a = new ArrayList();
        //1. 添加元素
        Student s1 = new Student("刘德华",45);
        Student s2 = new Student("古天乐",43);
        Student s3 = new Student("梁朝伟",47);
        a.add(s1);
        a.add(s2);
        a.add(s3);
        System.out.println("元素个数:"+a.size());
        System.out.println(a.toString());
        //2. 删除元素
        //a.remove(new Student("刘德华",45));//这里是重写了equals方法之后能这样操作,源equals方法是不能直接new对象这种形式删除的
        //System.out.println("删除之后:"+a.size());
        //System.out.println(a.toString());
        //3. 遍历
        //3.1 迭代器
        Iterator b =a.iterator();
        while (b.hasNext()){
            System.out.println(b.next());
        }
        System.out.println("================");
        //3.2 列表迭代器
        ListIterator c = a.listIterator();
        while (c.hasNext()){
            System.out.println(c.nextIndex()+":"+c.next());
        }
        //4. 判断
        System.out.println(a.contains(s1));
        System.out.println(a.isEmpty());
        //5. 查找
        System.out.println(a.indexOf(s3));
    }
}

ArrayList源码分析

DEFAULT_CAPACITY=10默认容量;若超出10的容量,每次扩容都是原来的1.5倍

注意:如果没有向集合中添加任何元素时,默认容量为0;

elementData存放元素的数组;

size 实际元素的个数

add(); 添加元素

public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

private static int calculateCapacity(Object[] elementData, int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }

    private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }

    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好好学习争取保研

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值