Java(集合)


遗漏知识点

  1. transient --> 序列化相关的知识
  • 集合的概念
  • Collection接口
  • List接口与实现类
  • 泛型和工具类
  • Set接口与实现类
  • Map接口与实现类

集合的概念

集合:对象的容器,实现了对对象常用的方法,可实现数组的功能

与数组的区别

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

位置:java.util.*

Collection接口

![[Pasted image 20250826235508.png]]

Collection: 该体系结构的根接口,代表一组对象,称为“集合”
List:有序,有下标,元素可重复
Set:无序,无下标,元素不能重复

Collection

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

方法:

boolean add (Object obj) //添加一个对象到集合中。

boolean addAll (Collection c) //把一个集合里的所有对象,都添加到当前集合里。

void clear () //清空当前集合里的所有对象。

boolean contains (Object o) //检查当前集合里有没有 o 这个对象。

boolean equals (Object o) //对比当前集合和指定对象(需是集合类型等可比较情况 )是否相等。

boolean isEmpty () //判断当前集合是不是空的(没有元素 )

boolean remove (Object o)//从当前集合里移除 o 这个对象。

int size () //返回当前集合里元素的个数。

Object [] toArray () //把当前集合转换成对象数组。

iterator() //迭代器

a.removeAll(Collection<> c) //删除全部c在a中出现过的元素

a.retainAll(Collection<> c) // 保留a和c中的交集部分

特别注意:遍历元素

  1. 增强for
  2. 迭代器

//3.1 使用增强 for  
for (Object object : collection) {  
	System.out.println (object);  
}  


//3.2 使用迭代器 (迭代器专门用来遍历集合的一种方式)  
//hasNext (); 有没有下一个元素,  
//next (); 获取下一个元素  
//remove (); 删除当前元素  

Iterator it=collection.iterator ();  
while (it.hasNext ()) {  
	String s=(String) it.next ();  
	System.out.println (s);  
}


List

特点:有序,有下表,元素可以重复

int indexOf(Object o) //返回列表中第一次出现的指定元素的索引,如果不包含该元素,就返回-1

int lastIndexOf(Object o) // 返回此列表中最后出现的指定元素的索引,如果列表不包含此元素,则返回-1

E set(int index,E element) //用指定元素替换列表中指定位置的元素

实现类

  • ArrayList
    • 数组结构实现,查询快,增删慢
    • JDK1.2版本,运行效率快,线程不安全
  • Vector
    • 数据结构实现,查询快,增删慢
    • JDK1.0版本,运行效率慢,线程安全
  • LinkedList:
    • 链表结构实现,增删快,查询慢

源码分析

  • ArrayList 结论:没有添加任何元素时,容量为0,添加一个元素之后,容量为10;扩容是按照1.5倍

  • LinkedList结论:存储结构双向链表

  • 区别:ArrayList,必须开辟连续空间,查询快,增删慢;LinkedList:无需开辟连续空间,查询慢,增删快

泛型

  • 概念:参数化类型、类型安全的集合,强制集合元素的类型必须一致。

  • 特点:

    • 编译时即可检查,而非运行时抛出异常。
    • 访问时,不必类型转换(拆箱)。
    • 不同泛型之间引用不能相互赋值,泛型不存在多态。

Set

方法全部继承与Collection 方法

  • HashSet(重点)

    • 基于HashCode计算元素存放位置
    • 当存入元素的哈希码相同时,会调用equals进行确认,结果为true,则拒绝后者存入
    • 存储结构:哈希表(数组+链表+红黑树)
  • 存储对象的时候,需要重写一下hashCodeequals

  • TreeSet:

    • 存储结构:红黑树
    • 基于排列顺序实现元素不重复。
    • 实现了 SortedSet 接口,对集合元素自动排序。
    • 元素对象的类型必须实现 Comparable 接口,指定排序规则。
    • 通过 CompareTo 方法确定是否为重复元素。
TreeSet<Person> persons = new TreeSet<>(new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        int n1 = o1.getAge() - o2.getAge();
        int n2 = o1.getName().compareTo(o2.getName());
        return n1 == 0 ? n2 : n1;
    }
});

Person p1 = new Person("xyz", 20);
Person p2 = new Person("hello", 22);
Person p3 = new Person("zhangsan", 25);

persons.add(p1);
persons.add(p2);
persons.add(p3);

注:也可以不实现Comparable 接口,指定排序规则。而是在创建 TreeSet 的时候,使用匿名内部类

Map

特点:存储一对数据,无序,无下标,键不可重复,值可以重复


// 添加
map.put(key,values);

// 删除
map.remove(key);

// 拿到key
Set<T> keyset = map.keyset();

// 获取value
map.get(key)

// 一种遍历方式
System.out.println("-----entrySet()-----");
//Set<Map.Entry<String, String>> entries=map.entrySet();
for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println(entry.getKey()+"--------"+entry.getValue());
}

实现类

  • HashMap
    • 存储结构:数组+链表+红黑树
    • 使用key用hashcode和equals作为判断重复依据

(1) HashMap 刚创建时,table 是 null,为了节省空间,当添加第一个元素时,table 容量调整为 16
(2) 当元素个数大于阈值 (16×0.75=12) 时,会进行扩容,扩容后大小为原来的 2 倍。目的是减少调整元素的个数。
(3) jdk1.8 当每个链表长度大于 8,并且数组元素个数大于等于 64 时,会调整为红黑树,目的提高执行效率
(4) jdk1.8 当链表长度小于 6 时,调整成链表
(5) jdk1.8 以前,链表时头插入,jdk1.8 以后时是尾插入

  • TreeMap
    • 存储结构:红黑树

工具类

概念:集合工具类,定义了除了存取以外的集合常用方法

public class Demo4 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(20);
        list.add(5);
        list.add(12);
        list.add(30);
        list.add(6);
        //sort排序
        System.out.println("排序之前:" + list.toString());
        Collections.sort(list);
        System.out.println("排序之后:" + list.toString());
    }
}



sort()  //排序
binarySearch() //二分查找,需要排序好的数组
copy(dest,list) //注意容量大小
reverse() //反转
shuffle() //打乱


list.toArray(new xxx[0]) //把集合转换成数组
Arrays.asList() //将数组转换成集合,该集合是一个受限集合,不能添加和删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值