集合框架(复盘)

1.什么是集合框架

java Collection框架由接口和类组成,集合框架是用于存储数据和操作一组对象的统一架构.

集合框架只能存储引用数据类型,如果要存基本数据类型,需要存对应的包装类(拆箱和装箱)

1.1 集合和数组的区别是什么?

1.数组只能存储相同类型的数据

2.集合可以存放不同类型的数据

3.数组可以存基本数据类型和引用数据类型,而集合只能存引用数据类型.

4.数组长度固定,集合长度不固定.

2.集合类体系结构

2.1 Collection 集合(接口)

一.Collection集合概述

是单列集合的顶层接口,JDK不提供此接口的任何直接实现,只提供子接口实现.

二.Collection集合常用的方法
方法名说明
boolean add(E e)添加元素
boolean remove(Object o)从集合中移除指定的元素
boolean removeIf(Object o)根据条件进行移除
void clear()清空集合中的元素
boolean contains(Object o)判断集合中是否存在指定的元素
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中元素的个数

 2.2 List集合(接口)

一.List集合概述

1.存取有序

2.可以存储重复数据

3.有索引值

二.常用的方法
方法名描述
void add(int index,E element)在此集合中的指定位置插入指定的元素
E remove(int index)删除指定索引处的元素,返回被删除的元素
E set(int index,E element)修改指定索引处的元素,返回被修改的元素
E get(int index)返回指定索引处的元素

 2.3ArrayList集合(List集合的实现)

一.ArrayList集合概述

1.ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 继承了 AbstractList ,并实现了 List 接口。

2.底层是数组结构:有索引---查询快,修改数据块,但是增删慢.

3.线程不安全,在List下还有一个古老的实现类,Vector是线程安全的但是效率很低,底层也是数组.

4.底层实现:

因为底层是数组默认创建了一个长度为10 的数组,如果添加元素导致容量不够,就会触发扩容.

int newCapacity = oldCapacity + (oldCapacity >> 1);

 新的容量=旧 的容量+0.5倍旧的容量.

5.简单了解下victor类的扩容机制:底层创建一个长度为10 的数组,扩容的是2倍.

2.4LinkedList集合(List集合的实现)

一.LinkedList集合概述

1.底层是链表结构:查询慢(没有随机遍历 ),但是增删很快.

二.特有方法
方法名说明
public void addFirst(E e)在该列表开头插入指定的元素
public void addLast(E e)将指定的元素追加到此列表的末尾
public E getFirst()返回此列表中的第一个元素
public E getLast()返回此列表中的最后一个元素
public E removeFirst()从此列表中删除并返回第一个元素
public E removeLast()从此列表中删除并返回最后一个元素

 2.5Set集合(接口)

一.集合概述

1.存储无序

2.不能存储重复元素,没有索引

3.继承Collection接口

4.注意:没有特有方法都是使用Collection接口里面的公共方法.

2.6HashSet集合(Set的实现)

一.概述

1.底层数据结构是哈希表(在jdk1.8之前是数组+链表,1.8后是数组+链表+红黑树)

2.简单说说底层实现:

jdk1.8之前是数组+链表,HashSet默认创建一个长度为16,默认加载因子为0.75的数组,存入元素的时候,通过数组的长度计算存入的位置,如果这个位置为null直接存储,如果不为空就通过equals方法比较属性值,如果一样不存,不一样新的元素就挂在旧的下.

问题:如果这个链表很长就会导致查询慢,效率低.所以在jdk1.8后就加入了红黑树,防止链表的长度过长.

3.存储无序

4.不能存储重复元素

5.没有索引

6.可以放一个null

二.遍历集合
package day16;

import java.util.*;

class Student {
    private String name;
    private Integer age;

    public Student() {
    }

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

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

public class test {
    public static void main(String[] args) {
        HashSet<Student> stu = new HashSet<>();
        //创建学生对象,添加元素
        stu.add(new Student("小明", 23));
        stu.add(new Student("Lisa", 23));
        stu.add(new Student("小雷", 23));
        stu.add(new Student("明天", 23));

        for (Student s:stu){
            System.out.println(s);
        }
    }
}

 2.7TreeSet集合(Set的实现)

一.集合概述

1.不可以重复存储元素

2.没有索引

3.不能存储

4.可以排序(自然排序和比较器排序)

5.LinkedHashSet:是HashSet的子类.

二.TreeSet的基本使用

1.自然排序Comparable接口的使用.

自然排序就是让元素所属的类实现Comparable接口,重写comparaTo(T o)方法.

package day16;

public class Student implements Comparable<Student> {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        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 int compareTo(Student o) {

        int result = this.age - o.age;   
                //次要判断条件: 年龄相同时,按照姓名的字母顺序排序
        result = result == 0 ? this.name.compareTo(o.getName()) : result;
        return result;
    }
}

package day16;

import java.util.TreeSet;

public class MyTreeSet2 {
    public static void main(String[] args) {
        //创建集合对象
        TreeSet<Student> students = new TreeSet<>();

        //创建Student集合
        Student stu2 = new Student("Lisa", 14);
        Student stu3 = new Student("张杰", 14);
        Student stu4 = new Student("马云", 1);
        Student stu5 = new Student("冰冷的40亿", 10);

        students.add(stu2);
        students.add(stu3);
        students.add(stu4);
        students.add(stu5);

        //遍历集合
        for (Student s:students){
            System.out.println(s);
        }
    }

}

 2.比较器排序Comparator接口的使用

比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)

package day16;

import java.util.Comparator;
import java.util.TreeSet;

public class MyTreeSet2 {
    public static void main(String[] args) {
        //创建集合对象
        TreeSet<Student> students = new TreeSet<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                //主要条件
                int result=o1.getAge()-o2.getAge();
                //次要条件
               result= result==0? o1.getFraction()-o2.getFraction():result;

                result=result==0?o1.getName().compareTo(o2.getName()):result;
                return result;
            }
        });

        //创建Student集合
        Student stu2 = new Student("Lisa", 14,89);
        Student stu3 = new Student("张杰", 14,90);
        Student stu4 = new Student("马云", 1,20);
        Student stu5 = new Student("冰冷的40亿", 10,100);

        students.add(stu2);
        students.add(stu3);
        students.add(stu4);
        students.add(stu5);

        //遍历集合
        for (Student s:students){
            System.out.println(s);
        }
    }

}

package day16;

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

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

    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;
    }

    public int getFraction() {
        return fraction;
    }

    public void setFraction(int fraction) {
        this.fraction = fraction;
    }

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

    public Student() {
    }

}

 3.迭代器

集合专用的遍历方式

Iterator<E> iteratoa():返回集合中元素的迭代器,通过集合对象的iterator()方法得到

Iterator里面的常用方法

boolean hasNext(): 判断当前位置是否有元素可以被取出 ​

E next(): 获取当前位置的元素,将迭代器对象移向下一个索引位置

案列:遍历Collection集合

public class test {
    public static void main(String[] args) {
        //创建Collection集合对象
        Collection<String> c = new ArrayList();
        //添加元素
        Collections.addAll(c,"小明","校长","小李","Lisa");
        //利用iteraor方法创建Iterator对象
        Iterator<String> iterator = c.iterator();
        //利用while循环改进元素的判断和获取
        while (iterator.hasNext()){
            String next = iterator.next();
            System.out.println(next);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值