集合框架学习

集合框架

【引言】

在使用集合框架之前,我们较多使用数组来完成数据的存储,但目前数组存在问题有:
	1. 复用度差
		目前对于数据操作有且只能支持一个数据类型,一旦需要操作其他类型,全部
重构,从头来过
	2. 空间固定
		数组的空间一旦在创建过程中确定,空间无法修改。
	3. 方法较少
		Java中对于数组操作没有提供太多的有效方法,需要自己编写完成

以上问题集合都可以解决
	1. 复用性,没有问题
		集合创建采用了泛型模式,可以用户指定任意类型操作,既满足普适性,又满足数据类型一致化要求
	2. 空间在合理范围以内自行扩展,不需要考虑容量问题
	3. 方法很多,操作性很好

【集合框架组成】

Collection-E-interface.png

Collection接口各实现类简介
-|Collection为java集合中所有集合的总接口
--|List<E>:有序,有下标,可重复
---|ArrayList<E>:可变长数组
---|LinkedList<E>:双向链表
—--|Vector<E>:线程安全可变长数组
--|Set<E>:无序,无下标,不可重复
---|HashSet:底层储存数据的结构是一个哈希表,储存效率,查询效率极高
---|TreeSet:底层储存数据的是平衡二叉树,要求数据必须有比较方式
    
[Tips]
    ArrayList,Vector的有序性在于底层是数组实现
    LinkedList的有序性在于底层链表实现
Collection重点方法
Collection方法共有
增:2:
	boolean add(E e)
		添加受当前集合约束的元素类型到当前集合中,如果改变数组则返回true,否则返回false
	boolean addAll(Collection<? extends E> c)
		添加指定元素集合到当前集合中,要求添加的元素集合必须是当前集合的本身类型元素或者当前集合子类对象类型
删:4
	boolean remove(Object obj)
		在当前集合中删除指定元素,删除成功返回true,否则返回false;若存在多个元素则删除第一个
	boolean removeAll(Collection<?> c)
		在当前集合中删除两集合交集
	boolean retainAll(Collection<?> c)
		在当前集合中保留两集合交集
	void clear()
		清空当前集合
查:5
	int size()
		查询当前集合有效元素个数
	boolean isEmpty()
		判断当前集合是否为空
	boolean contains()
		判断当前集合是否包含指定元素
	boolean containsAll()
		判断当前是否包含指定集合
	Object toArray()
		返回当前集合元素的Object类型的数组
List接口
List接口概述
List接口特征:
	1.数据可重复
	2.有序,添加顺序与保存数据一致
List重点方法

Collection是List与Set的共同父接口,Collection和Set都具有无序性,List具有有序性,因此List相对与Collection的方法要多出关于有序性的方法

增:2
	boolean add(int index, E e)
		在指定位置增加指定元素
	boolean addAll(int index, Collection<? extends E> c)
		在指定位置增加指定集合,指定集合为该集合的本身类型或者子类型
删:1
	E remove(int index)
    	删除并返回指定下标元素
改:1
	E set(int index, E e)
		用指定元素替换指定位置元素,并返回替换之前的元素
查:4
	E get(int index)
		返回指定下标元素
	List<E> subList(int fromIndex, int toIndex)
		按指定方式截取子序列
	int indexOf(Object obj)
		返回指定元素在序列中的位置
	int lasrIndexOf(Object obj)
		返回指定元素在序列中最后一次出现的位置
ArrayList
ArrayList概述
ArrayList是在Java中集合非常重要的一个组成,基于数组完成的数据结构。
	底层保存数据的是一个Object类型数组。
ArrayList重点方法
ArrayList使用的方法都是List接口中的方法,有两个需要了解的成员方法:
	void ensureCapacity();
		数据量很大时,调用ensure Capacity()方法,可以一定程度上减少程序运行时间
	void trimToSize();
		节省空间,将底层数组的容量缩容至有效元素个数
细节问题
1. DEFAULT_CAPACITY
	默认容量 private static final int DEFAULT_CAPACITY = 10;
	在调用ArrayList无参数构造方法时,会使用DEFAULT_CAPACITY,作为底层Object数组的初始化容量
	如果用户指定调用的是带有初始化底层Object数组容量的构造方法,会根据用户指定的容量创建一个ArrayList集合

2.扩容时的扩容倍数是1.5倍
	
2. MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
	int[] arr = new int[10];
	
	arr.length 是什么??? 数组容量
	这里是一个方法还是属性??? 属性
	属性是不是成员变量??? 是
	成员变量是否需要占用内存??? 需要
	
	new数组占用的空间什么地方??? 堆区
	arr.length 属性是不是也在堆区??? 是
	
	为什么 - 8???
		因为在数组中存在很多属性,length只是众多属性中的一个,在创建数组使用的过
		程中,需要留有内存空间用于保存数组中属性。
泛型上下限在集合中的应用
泛型上限:
	<? extends A>:表示A的子类
泛型下限:
	<? super A>:表示A的父类
泛型集合:
	(Collection<?> c)
?是泛型通配符
迭代器在泛型中的应用

猜你喜欢

转载自www.cnblogs.com/raising/p/12953451.html