JCF 集合框架小结

本文是对Java集合框架的总结,涵盖了Collection、List、Set、Map接口及其主要实现类,如ArrayList、LinkedList、HashSet、TreeSet等。文章讨论了它们的特点、操作方法,以及泛型在集合中的应用,并涉及遍历、迭代器、并发安全等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在这门课的实验里总是会频繁的使用到Java集合框架部分,但是课上并没有一个系统的讲解,在这里我自己通过查找资料的形式学习了一些有关的知识,做一个总结。

------------------------------------------------------------------------------------------------------------------------------

1.集合
对象的容器。实现了对对象常用的操作。
和数组的区别:  
     数组                                            集合
1.长度固定                                   1.长度不固定
2.可以存储基本类型与引用类型     2.只能存储引用类型

在java.util包中

1.Collection体系集合
根接口:Collection
子接口:List   Set
List:有序,有下标,元素可重复(有序指添加时是什么顺序遍历时就是什么顺序)
Set: 无序,无下标,元素不可重复

List: Arraylist    LinkedList Vector(比较老)
Set: HashSet   SortedSet(接口)->TreeSet

2.提供的方法
Collection:
1. add(对象)
2. addAll(另一个集合)
3.  clear();
4. boolean contains(对象)
5. boolean equals(Object a)  比较此集合是否与指定对象相等
6. toArray() 转换成数组
7.removeAll(另一个集合) 删共同
8. retainAll(另一个)  保共同

---------------------------------------------------------------------------------------------------------------------------------

1.集合的遍历:
    1.foreach
    2.迭代器

2.迭代器:Iterator(接口)
三个方法:boolean hasNext()  next()  remove()  
由集合调用iterator()获取
由于并发机制,不允许在迭代过程中调用非remove方法修改集合


2.list集合(可以使用for循环!) remove第一个
    1.add(index,o).....
    2.get(index)
    3.subList()


3.ListIterator
可以nextIndex()
可以逆向遍历Previous
has....()   p..()   p..I..()  使用方法是一样的


4.List实现类
    1.ArrayList:数组结构实现,查询块,增删慢;运行效率块,线程不安全
    2.Vector:与1相同,唯一不同的是他线程安全,慢一些
    3.LinkedList:  链表结构实现,增删快,查询慢(尽管表面有序号,实际是隐式的,即找4号->一个一个找一直找到第四个,其实没有显示的序号)


5.ArrayList:
    1. remove : 实际上是调用了被处理对象的equals方法,因此可以通过重写来改变规则
    2.add源码分析:初始容量:0 add一次:10(ArrayList有个静态默认容量10)
            后来每次不够都是以前的1.5倍

---------------------------------------------------------------------------------------------------------------------------------

1.Vector
capacity();  返回容量
elements();  返回枚举器(Enumeration):  包含方法: hasMoreElements()  nextElement()


2.LinkedList (内部维护一个双向链表,也有一个静态内部类Node(节点),但是该类被封装了,对外只有Node中的Item)

3.泛型
1.5引入的新特性,本质是将类型当作参数传递
常见形式有泛型类,泛型接口,泛型方法 
语法:<T,...>  T称为类型占位符,表示一种引用类型,多个用逗号隔开
好处:    1.提高代码的重用性
    2.防止类型转换异常 


(1)泛型类   类名后加<T,..>
所谓参数化类型,即把类型看作一种参数。在泛型类中可以定义变量引用,如T t;可以把T t作为方法的参数,可以把T作为方法的返回值类型,但不能直接new T();因为此时还不确定T的类型,万一没有无参构造器或权限不够呢;且不能作为静态    
    在实例化的时候要确定类型

(2)泛型接口
注意接口中的字段默认时public static final
在实现接口的时候明确泛型
或者实现它的类也是个泛型类,在实例化该类的时候确定(继承父类也是一样)

(3)泛型方法
<T>放在方法返回值的前面
当方法参数中无T时,T表示Object
当有时,传进去是什么类型泛型就是什么类型


4.泛型与集合
在没有声明时,默认为Object
在声明时,强制类型统一
---------------------------------------------------------------------------------------------------------------------------------

1.Set接口
方法全部继承自Collection
    实现类:HashSet  TreeSet

2.HashSet (是用哈希表实现的(外散列表))
使用方式一样
存储过程(访问过程(包括remove)):先计算hashCode,再equals
想改变存储依据,既要改变hashCode也要重写equals
(因为如果只改变equals,第一步计算hashCode就不一样,根本轮不到equals)

3.TreeSet(使用红黑树实现)
    基于排序实现元素不重复
    实现了SortedSet接口,对集合元素自动排序
    元素的对象类型必须实现Comparable接口,指定排序规则
    通过CompareTo方法确定是否为重复元素

内部储存是有顺序的


需要对象实现Comparable接口,重写方法
compareTo->0相同,其他不同
这里的重写可以让排序规则发生改变

4.也可以不实现Comparable接口,改成创建集合时传入一个比较器:Comparator;
这里就展现了泛型的用法,这个比较器接口要有用户去实现,本身并不知道会比较什么类型,就用一个泛型代替


5.可以用TreeSet来实现在某规则下的排序
 

---------------------------------------------------------------------------------------------------------------------------------

1.Map体系集合(映射)
Map->HashMap(Class)/SortedMap(Interface)->TreeMap(Class)

特点:用于储存任意键值对
          键:无序,无下标,不允许重复
          值:无序,无下标,允许重复


2.基本使用
    put(key,value)(重复对一个键put会替换)
    remove(key)
    keySet()  (获得key的集合)
    entrySet() (获取键值对集合)(Map内部将键值对封装为了Entry)


2.HashMap    JDK1.2加入,线程不安全,运行效率快,允许使用null作为key或是value
构造方法:关键字段:初始容量(默认16)默认加载因子(超过即扩容,默认0.75)复制传入的
防止相同也是用的HashCode与equals
刚创建的时候没有容量,与ArrayList相似

3.HashTable  线程安全,运行效率慢,不允许null作键值或值
Properties  HashTable的子类,要求key和value都是String,通常用于配置文件的读取

4.TreeMap
实现了SortedMap,会对key进行排序
同样,对象需要实现Comparable接口
或者传入比较器Comparator

实际上TreeSet与HashSet都是由他们的Map实现的

5.集合的工具类

Collections(工具类,提供静态方法,类比数组的Arrays)


如:   reverse()  反转元素顺序
    shuffle()  打乱顺序
    sort() 排序  (有个重写方法可以自己写比较器)、
    binarySearch() 二分查找
    copy()  但两个集合大小必须一样(可以先随便加一些)

6.list转数组
.toArray() 传入一个数组
传入数组长度小于List的话会返回与list一样长的
超过就补null

7.数组转list
Arrays类中的asList方法
但此时这个集合是受限集合,不能添加或删除
且基本类型数组需要需要先装箱成引用数组

总结:还有LinkedHashSet(有序)

---------------------------------------------------------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值