JAVA之集合

1. 泛型

宽泛的类型。能够让类和方法更灵活地处理参数。Java 泛型有三种使用方式:泛型类、泛型方法、泛型接口

  • 需求:定义一个 Person 类,属性有 name、age,name 为 String 型,age 可以为 int 型,或者 String 型

    • 没有泛型:

​
class Person {
    private String name;
    private Object age;

    // getters & setters

    public static void main(String[] args) {
        Person person1 = new Person();
        person1.setName("张三");
        person1.setAge(18);
        String name1 = person1.getName();
        int age1 = (int) person1.getAge();

        Person person2 = new Person();
        person2.setName("李四");
        person2.setAge("保密");
        String name2 = person2.getName();
        int age2 = (int) person2.getAge(); // 报错
    }
}

​

使用泛型:

class Person<T> {
    private String name;
    private T age;

    // getters & setters

    public static void main(String[] args) {
        Person<Integer> person1 = new Person<Integer>();
        person1.setName("张三");
        person1.setAge(18);
        String name1 = person1.getName();
        int age1 = person1.getAge();

        Person<String> person2 = new Person<String>();
        person2.setName("李四");
        person2.setAge("保密");
        String name2 = person2.getName();
        String age2 = person2.getAge();
    }
}
  • 好处:

    • 提高了数据的安全性,将运行时的问题,提前暴露在编译时期

    • 避免了强转的麻烦

  • 注意事项:

    • 前后一致:在创建对象时,赋值符号前面和后面的类型的泛型,必须一致

    • 泛型推断:如果前面的引用所属的类型已经写好了泛型,后面创建对象的类型就可以只写一个尖括号,尖括号中可以不写任何内容。<>特别像菱形,称为“菱形泛型”,jdk1.7特性。

Person<String> person = new Person<>();

2. 集合

2.1 概述

Java 中,数组的长度是固定的,一旦创建,就无法修改。为了解决这一限制,Java 提供类一系列的类,它们被称为集合框架。

  • List

    为了实现容器容量可变,提供 List 接口,其中定义了新增元素、删除元素等动态操作容器的方法。List 接口继承自 Collection 接口。

    List 下的主要实现类有:ArrayList、LinkedList

  • Set

    为了实现容器中元素不可重复,提供 Set 接口,其中同样提供基础的操作容器的方法。Set 接口继承自Collection 接口。

    Set 下的主要实现类有:HashSet、TreeSet

  • Map

    为了实现关联性数据的存储,提供 Map 接口,也叫双列集合、K-V 集合、键值对集合,其中 Key 不可重复,Map 是 Set 的实现原理,Set 就是单独使用 Map 的 Key 来实现的。

    Map 下的主要实现类有:HashMap、TreeMap

2.2 ArrayList

ArrayList 的底层实现方式为数组

  • 常用方法:

    • Collection 接口中:

      • add(Object obj):将 obj 元素添加到集合中

      • remove(Object obj):将 obj 元素从集合中删除

      • clear():将集合中的元素清空

      • isEmpty():判断集合中元素是否为空

      • contains(Object obj):判断集合中是否包含 obj 元素

      • size():返回集合中的元素个数

    • List 接口中:

      • add(int index, Object obj):在指定索引上,添加指定的元素。

      • remove(int index):删除指定索引上的值,也可以直接删除值。

      • set(int index, Object obj):将指定索引上的值,修改为指定的值。

      • get(int index):根据给定的索引,获取对应位置的值。

  • 特别注意:

    • 遍历集合过程中删除元素会引发错误

for (Student student : list) {
    if (student.getName().length() <= 2){
    		list.remove(student); // 报错
    }
}

使用迭代器遍历集合,可以删除元素

// 迭代器
Iterator<Student> iterator = list.iterator();
while (iterator.hasNext()) {
    Student student = iterator.next();
    if (student.getName().length() <= 2) {
				// list.remove(student); // 报错
        iterator.remove(); // 使用迭代器的删除方法
    }
}

2.3 LinkedList

LinkedList 的底层实现方式为双向链表

2.4 HashSet

HashSet 的底层实现方式为哈希表

  • 使用 HashSet,需要元素类型重写 hashcode 和 equals 方法。

  • HashSet 是无序的(存与取的顺序不同),List 的实现类都是有序的。

  • LinkedHashSet 在每个节点间维护了双向链表,实现了有序。

2.5 TreeSet

TreeSet 的底层实现方式为红黑树

  • 使用 TreeSet,需要元素类型实现 Comparable 接口并重写 compareTo 方法,或者提供 Comparator。

  • TreeSet 会自动排序(自然顺序),但也是无序的(存与取的顺序不同)。

2.6 HashMap

HashMap 的底层实现方式为哈希表,是 HashSet 的实现原理。

  • 常用方法:

    • put(Object key, Object value):添加一个键值对到 Map 中

    • get(Object key):通过 key 获取 value

    • size():返回集合中的键值对个数

    • isEmpty():判断集合中元素是否为空

    • containsKey(Object key):判断集合中是否包含键为 key 的元素

    • containsValue(Object value):判断集合中是否包含值为 value 的元素

    • remove(Object key):将键为 key 的元素从集合中删除

    • keySet():返回所有的键,做为一个 Set 集合

    • values():返回所有的值,做为一个 Collection 集合

    • entrySet():返回所有的键值对,做为一个元素类型为 Map.Entry 的 Set 集合

  • Map 中的键不可重复,但值可以重复。

  • HashMap 中元素的键可以为 null。

  • TreeMap 的键可以自动排序(自然顺序)。

  • HashMap 和 TreeMap 都是无序的,LinkedHashMap 是有序的。

2.7 Collections 工具类

  • max

  • min

  • sort

  • binarySearch

  • reverse

  • shuffle

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值