Java 集合框架

数组

内存中连续的,大小固定的内存空间,可以用来包村相同类型的多个元素

复制数组的一个系统函数
System.arraycopy native修饰的,c/c++ 实现,纯内存赋值,效率很高

数组工具类Arrays

asList 返回一个受指定数组支持的固定大写哦的列表
sort 使用快排实现
binarySearch 二分查找
CopyOf 赋值数组,截取或者用(false,0,null)填充
copyOfRange 将指定数字范围赋值到一个新的数组
toString 转成字符串
equals 判断是否相等
fill 将指定的值分配给每个元素
hascode 返回哈希码

集合

集合的层次结构

集合			Collection接口 
							List接口
											ArrayList类
											LinkedList类
											Vector类
											Stack类
											AttributeList类
							set接口
											HashSet类
											LinkedHashSet类
											TreeSet类
							Queue接口 队列
							Deque接口 双向队列
				Map接口
						HashMap类
							LinkedHashMap类
							HashTree类
							TreeMap类
							ConcurrentHashMap类
							Attribute
							Properties

各个实现类

底层实现
如何扩容
是否允许空值(和空键)
是否有序
是否线程同步

collection接口

public interface Collection extends Iterable 代表泛型,只能是类,不能是基本数据类型
Collection是一个根接口,实现Iterable接口,所以它下面的都可以使用迭代器进行遍历
JDK不提供此接口的任何直接实现,只是对集合的同意规定

List接口

元素是有序的,可以用index访问,允许元素重复,允许null
方法

add
addAll
clear
contains(Object o) 判断是否包含该元素
equals
hashCode
isEmpty 判断是否为空
iterator 返回迭代器
get(index) 返回元素下标
indexOf/lastIndexOf  查找元素的下标
remove 删除某位置的元素,如果有相同的情况,则删除第一个
set 用指定元素替换指定为值的的元素
subList(int fromIndex,int toIndex) 返回从fromIndex(包括)到toIndex(包括)之间的部分
size 返回元素数量
toArray() 转化为数组 

实现类以及实现类的特点

ArrayList
	实现可变数组,底层使用数组保存,访问效率高,插入和删除效率低
	是线程不同步的
	初始长度为0 ,长度不足时,使用System.arrayCpy来扩容
	可以使用trimToSize将容量调节为当前列表大小
LinkedList
	底层使链表保存,访问效率低,插入删除效率高
	双向链表,实现了Queue接口和Deque接口
Vector 
	底层使用数组保存
	是线程同步的
Stack
	栈

遍历

  • 循环生成下标
  • 增强for循环
  • 使用迭代器

迭代器的使用

  1. 通过iterator方法来获取集合的迭代器
  2. 通过iterator的hasnext()判断是否可以取出元素
  3. next取出元素
  4. remove删除当前被迭代的元素

Set接口

元素不一定有序,不一定允许空值(都要看具体的实现类),不允许重复
方法

add
addAll
clear 
contains(Object o) 判断是否包含该元素
equals
hashCode
isEmpty 判断是否为空
iterator 返回迭代器
remove(Object o) 删除指定元素
size 返回元素数量
toArray() 转化为数组 

实现类

HashSet
	底层使用HashMap实现
	不保证set的迭代顺序,特别是它不保证顺序恒久不限,是一个无序的集合
	添加顺序于迭代顺序无关
	允许null(最多只能一个)
	默认初始容量为16,加载因子为0.75
	add时,如果要插入的已经存在,不更改set,返回false,不存在则添加指定元素,返回true
LinkedHashSet
	元素的迭代顺序是元素的添加顺序
	与HashSet不同的是,它维护着一个运行于所有条目的链表
TreeSet
	底层是一个MapTree
	自然顺序  数值型  char要转成相应的int再比较
			引用型 可以定义对象Comparator方法也可以实现Comparator接口
	迭代顺序按照自然顺序

遍历

  • 使用增强for循环
  • 使用迭代器

Map接口

Map<K,V> k–此映射所维护的键的类型, V–映射值的类型,保存键-值对的,key-value
特点:键不可以重复,每个键最多只能映射一个值
Map.Entry 代表一组映射冠词,Map集合也可以看作是Entry的集合

实现类

HashMap
	初始容量为16,加载因子为0.75
	加载因子是用来指定扩容的时机,当超过当前容量的0.75,则扩容为当前容量*2,StringBuilder是*2+2
	底层基于Hash表的,允许空值和空键的存在,是无序的,非线程同步的
LinkedHasMap
	底层采用Hash表和双向链表
	双向链表负责维护键的顺序,按照插入键的顺序
HashTable
	扩容时,当前容量*2+1
	基于Hash表,不允许空值和空,无序的,线程同步的(全局锁)
TreeMap
	基于红黑树的实现
	按照键的自然顺序排序
ConcurrentHashMap
	与HashTable一样,但是currentHashTable是分段锁,所以效率更高一点

解决冲突的方式 链地址法

HashMap 的底层实现

  • 数组/位桶,初始表,初始容量就是数组的长度
  • 链表,解决哈希冲突,当元素发生冲突的时候,就被存放在链表中
  • 红黑树
    当链表长度达到8时,转化为红黑树,提高元素再链表中的查找效率
    红黑树结点减少到6个时,红黑树转化为链表
    在较低的开销下,实现较快的查找O(logn)

遍历

使用Entry
使用键
使用值(但是无法操作键)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值