集合框架和泛型

集合框架和泛型

1.Collection集合

1.1数组和集合的区别

  • 相同点

    都是容器,可以存储多个数据

  • 不同点

    • 数组的长度是不可变的,集合的长度是可变的

    • 数组可以存基本数据类型和引用数据类型

      集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类

1.2集合体系结构图

1.3Collection 集合概述

  • 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素

  • JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现

1.4Collection集合常用方法

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

2.List集合

2.1List集合的概述和特点

  • List集合的概述

    • 有序集合,这里的有序指的是存取顺序

    • 用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素

    • 与Set集合不同,列表通常允许重复的元素

  • List集合的特点

    • 存取有序

    • 可以重复

    • 有索引

  • List接口的实现类

    • ArrayList集合

      底层是数组结构实现,查询快、增删慢

    • LinkedList集合

      底层是链表结构实现,查询慢、增删快

2.2ArrayList集合类

  • ArrayList类是List接口的一个具体实现类

  • ArrayList对象实现了可变大小的数组

  • 随机访问和遍历元素时,它提供更好的性能

ArrayList常用方法
方法名说明
boolean add(Object o)在列表的末尾顺序添加元素,起始索引位置从0开始
void add(int index,Object o)在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间
int size()返回列表中的元素个数
Object get(int index)返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换
boolean contains(Object o)判断列表中是否存在指定元素
boolean remove(Object o)从列表中删除元素
Object remove(int index)从列表中删除指定位置元素,起始索引位置从0开始

2.3.LinkedList集合类

  • LinkedList类是List接口的一个具体实现类

  • LinkedList 类用于创建链表数据结构

  • 插入或者删除元素时,它提供更好的性能

LinkedList常用方法
方法名说明
void addFirst(Object o)在列表的首部添加元素
void addLast(Object o)在列表的末尾添加元素
Object getFirst()返回列表中的第一个元素
Object getLast()返回列表中的最后一个元素
Object removeFirst()删除并返回列表中的第一个元素
Object removeLast()删除并返回列表中的最后一个元素

2.4List集合的遍历方式

Car car1 = new Car("宝马", "X5", "京A88888", 300000);
Car car2 = new Car("奔驰", "S500", "京A88889", 300000);
Car car3 = new Car("奥迪", "A6", "京A88890", 200000);
List<Car> cars = new ArrayList<Car>();
cars.add(car1);
cars.add(car2);
cars.add(car3);
​
System.out.println("使用迭代器循环打印汽车信息");
Iterator<Car> iterator = cars.iterator();
while (iterator.hasNext()) {
    Car car = iterator.next();
    System.out.println(car.toString());
}
​
System.out.println("使用增强for循环打印汽车信息");
for (Car car : cars) {
    System.out.println(car.toString());
}

3.Set集合

3.1Set集合概述和特点

  • 不可以存储重复元素

  • 没有索引,不能使用普通for循环遍历

3.2HashSet集合类

  • 底层数据结构是哈希表

  • 存取无序

  • 不可以存储重复元素

  • 没有索引,不能使用普通for循环遍历

3.3TreeSet集合类

  • 不可以存储重复元素

  • 没有索引

  • 可以将元素按照规则进行排序

    • TreeSet():根据其元素的自然排序进行排序

    • TreeSet(Comparator comparator) :根据指定的比较器进行排序

3.4Set集合的遍历方式

  • 迭代器遍历

  • 增强for遍历

 Student stu1 = new Student("liusan", 25, 90.0F);
        Student stu2 = new Student("lisi", 21, 90.0F);
        Student stu3 = new Student("wangwu", 20, 99.0F);
        Student stu4 = new Student("sunliu", 22, 100.0F);
        Set<Student> set = new TreeSet<Student>();
​
        set.add(stu1);
        set.add(stu2);
        set.add(stu3);
        set.add(stu4);
        System.out.println("增强for打印集合");
        for (Student student : set) {
            System.out.println(student.toString());
        }
​
        System.out.println("迭代器打印集合");
        Iterator<Student> it = set.iterator();
        while (it.hasNext()) {
            System.out.println(it.next().toString());
        }
​

4.Map集合

4.1Map集合概述和特点

  • 双列集合,一个键对应一个值

  • 键不可以重复,值可以重复

4.2HashMap集合类

  • HashMap底层是哈希表结构

  • 依赖hashCode方法和equals方法保证键的唯一

  • 如果键要存储的是自定义对象,需要重写hashCode和equals方法

4.3TreeMap集合

  • TreeMap底层是红黑树结构

  • 依赖自然排序或者比较器排序,对键进行排序

  • 如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象时候给出比较器排序规则

4.4Map集合常用方法

方法名说明
Object put(Object key, Object val)以“键-值”对的方式进行存储
Object get(Object key)根据键返回相关联的值,如果不存在指定的键,返回null
Object remove(Object key)删除由指定的键映射的“键-值对”
int size()返回元素个数
Set keySet()返回键的集合
Collection values()返回值的集合
boolean containsKey(Object key)如果存在由指定的键映射的“键-值对”,返回true
Set<Map.Entry<K,V>> entrySet()获取所有键值对对象的集合

4.5Map集合的遍历方式

  • 通过键的集合来遍历

    • 获取所有键的集合。用keySet()方法实现

    • 遍历键的集合,获取到每一个键。用增强for实现

    • 根据键去找值。用get(Object key)方法实现

  • 通过键值对的集合来遍历

    • 获取所有键值对对象的集合

      • Set<Map.Entry<K,V>> entrySet():获取所有键值对对象的集合

    • 遍历键值对对象的集合,得到每一个键值对对象

      • 用增强for实现,得到每一个Map.Entry

    • 根据键值对对象获取键和值

      • 用getKey()得到键

      • 用getValue()得到值

Map<Integer,String> map = new HashMap<Integer, String>();
map.put(1, "张三丰");
map.put(2, "周芷若");
map.put(3, "汪峰");
map.put(4, "灭绝师太");
//用键的集合去找值来遍历
Set<Integer> keySet = map.keySet();
System.out.println("用键的集合去找值来遍历");
for (Integer key : keySet) {
    System.out.println(key + ":" + map.get(key));
}
​
System.out.println("___________________");
​
//用键值对的方式遍历
System.out.println("用键值对的方式遍历");
for (Map.Entry<Integer, String> entry : map.entrySet()) {
    System.out.println(entry.getKey() + ":" + entry.getValue());
}
​
map.put(5,"李晓红");
map.remove(1);
map.put(2,"周林");

5.集合的泛型

  • 泛型的介绍

    泛型是JDK5中引入的特性,它提供了编译时类型安全检测机制

  • 泛型的好处

    1. 把运行时期的问题提前到了编译期间

    2. 避免了强制类型转换

  • 泛型的定义格式

    • <类型>: 指定一种类型的格式,尖括号里面可以任意书写例如

    • <类型1,类型2…>: 指定多种类型的格式,多种类型之间用逗号隔开

      Map<Integer,String> map = new HashMap<Integer, String>();

6.Collections算法类

  • Java集合框架将针对不同数据结构算法的实现都保存在工具类中

  • Collections类定义了一系列用于操作集合的静态方法

  • Collections和Collection不同,前者是集合的操作类,后者是集合接口

  • Collections提供的常用静态方法

    • sort():排序

    • max()\min():查找最大\最小值

  • 实现一个类的对象之间比较大小,该类要实现Comparable接口

  • 根据compareTo方法的返回值大小来进行排序

package Demo3;
​
/**
 * @author Advancer
 * @version 1.0.0
 * @ClassName Demo3.Student.java
 * @Description
 * @createTime 2024年08月12日 09:42
 */
public class Student implements Comparable<Student> {
    String name;
    int age;
    float score;
    public Student()
    {
    }
  +
    public Student( String name,int age, float score) {
        this.age = age;
        this.name = name;
        this.score = score;
    }
​
    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", score=" + score +
                '}';
    }
    @Override
    public int compareTo(Student o) {
        //主要判断条件: 按照成绩从高到低排列
        float result=o.score-this.score;
        //次要判断条件: 年龄相同时,按照姓名的字母顺序排序
        result=result==0?this.name.compareTo(o.name):result;
        return (int)result;
    }
}
​
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值