在这门课的实验里总是会频繁的使用到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(有序)
---------------------------------------------------------------------------------------------------------------------------------