集合

28 阅读3分钟

集合:很多数据堆放在一起,可变长的数据集合

回顾一下数组:

定义:相同数据类型的集合,数组既可以存基本数据类型,也可以存引用数据类型

弊端:数组它创建出来时候长度是固定的,如果要新增数组,需要对数组扩容

需要操作数组api(Arrays.copyOf(arr,arr.length+5);相当于删除一个原数组,在新建一个数组

单列集合(Collection 是一个接口,接口是不能实力化的(就是不能new一个对象)

List集合(子接口):

  • ArrayList集合(子类) 底层是基于数组实现 查询快
  • LinkedList(子类) 底层是基于链表实现 增删快
  • Vector(子类)几乎不用

Set集合(子接口): 存储元素不可以重复,如果插入相同的元素,会插入失败,但是不会报错了

  • HashSet集合 基于hash算法 存取 查找 删除 性能都很好(使用频率较高)

无序(元素存取的时候不一定会按照顺序存储)

可以存null值

不是线程安全的

  • TreeSet集合 基于二叉树算法

需求:

创建一个集合,调用一下的方法看一下效果:

add()增加数据

remove()删除数据

clear()清空数据

contains()判断某个元素

imEmpty()

size()集合的长度

遍历集合

public static void main(String[] args) {
    Collection c = new ArrayList();
    //注意以下写法存Student对象到集合中只是为了演示,在实际工作中不可以这么写
    //因为没有引用对象指向对象,新建对象可能会被自动回收
    c.add(new Student("张三",18));
    c.add(new Student("李四",19));
    c.add(new Student("王五",20));
    //将集合转换为数组
    Object[] object = c.toArray();
    for (int i = 0; i < object.length; i++) {
        Student student = (Student)object[i];
        //由于数组中的元素是 Object 类型,但实际上是 Student 类的实例,所以在访问之前需要进行类型转换。类型转换通过 (Student) obj[i] 实现,这将 obj[i] 强制转换为 Student 类型,以便可以调用 Student 类的方法 getName() 和 getAge()。
        System.out.println(student.getAge());
        System.out.println(student.getName());
    }
}

List集合

List集合接口

get(index) 根据下标获取集合中的元素,下标从0开始

set(index,元素) 替换index位置的元素

public static void main(String[] args) {
    // 父类引用指向子类对象  这个是多态的体现
    List list = new ArrayList();
    list.add(new Student("张三", 23));
    list.add(new Student("李四", 24));
    list.add(new Student("王五", 25));
    // ClassCastException  类型转换异常
    list.add(1.23);
    try {
        for (int i = 0; i < list.size(); i++) {
            Student stu = (Student) list.get(i);
            System.out.println(stu.getName());
            System.out.println(stu.getAge());
        }
    } catch (ClassCastException e) {
        System.out.println("小数不可以转换成Student类型");
    }
}
/**
 * 创建一个集合,存入3个学生的信息,遍历3个学生的信息,把名字叫张三的同学的年龄改成18
 */
 public static void main(String[] args) {
    List<Object> list = new ArrayList();
    list.add(new Student("张三", 23));
    list.add(new Student("李四", 24));
    list.add(new Student("王五", 25));
    list.add(1.23);
    // list里面如果存引用数据类型,存的是引用数据类型的地址,
    // setAge=18修改的是引用数据的地址所指向的堆中的变量
    for (Object obj:list) {
        // ClassCastException
        Student stu = (Student)obj;
        if("张三".equals(stu.getName())){
            stu.setAge(18);
        }
    }
    System.out.println(list);

foreach

for (Object i:list) {
    System.out.println(i);
    int num = (int)i;
    if(num==3){
        // ConcurrentModificationException 因为增强for循环就是对迭代器的封装
        list.remove(i);
    }
}