一、Java Collections集合框架
Java中的集合就像是一个容器用来存储Java对象的,按照其存储结构可以划分为单列集合Collection和双列结合Map。
单列集合Collection:
单列集合的根接口,其下含有两个重要的子接口,List接口和Set接口。
其中List接口特点是元素有序、可重复。
Set接口集合特点是元素无序并不可重复。
双列集合Map:
双列集合的根接口,提供了一个从键映射到值的数据结构,用于保存键值对,其中值可以重复,键是唯一不能重复。
二、补充介绍一些数据结构的知识
链表:
查询慢:链表中的地址不是连续的,每次查询元素必须从头结点开始查。
增删快:链表增加/删除一个元素对链表的整体结构没有影响,只需要修改节点的指向,所以增删速度快。
链表的每一个节点包含数据域(存储数据),两端指针域用来存储地址。
栈: 出口入口在同一侧的,先进后出。
队列: 出入口在集合两侧,先进先出。
数组:
查询快:数组地址连续,通过数组的首地址可以找到数组,通过索引就可以快速找到某一个索引。
增删慢:数组长度固定,增加/删除一个元素必须创建一个新数组,把源数据复制进来。在堆内存中重频繁的增加创建数组,复制数组中的元素,销毁数组,所以效率低下。
二叉树:
排序树/查找树:左子树小、右子树大
平衡树:左孩子等于右孩子
红黑树:趋近于平衡树,查询速度快,查询叶子节点最大次数与最小次数不能超过两倍。
红黑树约束:节点必须是红色或者是黑色;根节点是黑色的;叶子节点是黑色的;红色节点子节点是黑色;任一节点到其每个叶子节点黑色节点数目相同
三、list接口
list接口特点:
1、有序集合,存储取出元素顺序一致
2、有索引,包含一些带索引的方法。
3、允许有重复值的元素
4、允许存储空值
list接口常用的方法:
add(int index,object element ):在指定位置添加任意类型的元素。
addAll( int index,Collection c) :将集合c包含的所有元素插入到List集合的指定索引位置。
get( int index) :获取指定索引位置元素。
remove( int index):删除指定索引位置元素。
set(int index,object element ):替换指定位置元素
toArray( ):将集合元素转换成数组返回一个数组对象。
ArrayList:
1、多线程
2、集合底层数据结构是一个数组 (增删慢,查询快)
Linkedlist:
1、集合底层数据结构是一个链表结构,增删快,查询慢。
2、包含大量操作首尾元素的的方法。
Linkedlist常用方法:(linkedlist独有)
addFirst( ):将指定元素插入此列表的开头。
addLast( ):将指定元素插入此列表的结尾。
push( ):将指定元素推入此列表的所表示的堆栈。等效于addLast()
getFirst( ):返回次列表的第一个元素。
getLast( ):返回此列表的最后一个元素。
removeFirst( ):移除并返回此列表第一个元素
pop( ):此列表所表示的堆栈弹出一个元素(后进先出)等效removeFirst()方法
removeLast( ):移除并返回此列表的最后一个元素。
ArrayList和linkedlist和Vector区别:
vector与ArrayList都是基于存储元素的Object[ ] array实现的,ArrayList和Vector都有一个初始化的容量大小,当超出容量时Vector自动扩充为原来的两倍、ArrayList扩充为原来的1.5倍。vector跟ArrayList最大的区别是Vector是线程安全的,ArrayList不是线程安全的,Vector性能略低于Arraylist.
linkedlist采用双向链表实现的,因此查询效率低下,增删速度快,是非线程安全的。当数据的主要操作为索引,在末端增删元素时,ArrayList比Vector高效;当在多线程中使用容器时选用Vector较为安全。
四、Set接口
set接口特点:
1、不允许存储重复元素。
2、没有索引,不提供带索引的方法,不能使用普通的for循环遍历,可以使用增强For或者迭代器遍历
Hashset:
特点:
1、不允许存储重复元素。
2、没有索引,不提供带索引的方法,不能使用普通的for循环遍历,可以使用增强For或者迭代器遍历
3、无序的集合,存储元素与去除元素的顺序有可能不一致。
4、底层数据结构是一个哈希表结构(查询速度非常快)
哈希表的底层结构:
jdk1.8之前:哈希表=数组+链表
jdk1.8之后:哈希表=数组+链表/红黑树(提高查询速率),当链表长度超过8位时链表将会自动转化为红黑树
哈希表特点:查询速度快,哈希表初始长度为15.
哈希冲突:指的是哈希值相同但元素不同。
LinkedHashSet:
继承HashSet集合,底层数据结构是哈希表+链表,比HashSet集合多一个链表用来记录元素存储顺序保证元素存储顺序。
五、Map接口
特点:
1、Map接口是一个双列集合,一个元素包含两个值(key,value)
2、Map集合中元素,key和value数据类型可以相同也可以不同。
3、Map集合中的元素,key是不允许重复的,value可以重复。
4、Map集合中的元素,key和value是一一对应的。
HashMap:
1、HashMap集合底层是哈希表;查询速度快
2、HashMap是一个无序的集合,存储元素和去除元素顺序可能不一致。
LinkedHashMap:
1、LinkedHashMap集合底层是一个哈希表+链表(保证迭代顺序)
2、LinkedHashMap集合是一个有序集合,存储索引和去除索引顺序一致。
HashTable:
hashTable:底层是一个哈希表,是一个线程安全的集合,单线程,速度慢
HashtMap:底层是一个哈希表,是一个线程不安全的集合(多线程),速度快。
HashTable不允许存储空值,其余的集合都能存储空值。
Map集合常用方法:
1、put(key,value)给集合添加指定的键与值
注意:
(1)存放键值的时候,key不重复是添加新的元素。
(2)存放键值的时候,key重复会使用新的Value去替换旧值。
2、remove(object key):删除指定键值返回值是Value,若key不存在则返回null。
3、get(object key):根据指定的键在Map中获取对应的值
4、containsKey( key):判断集合中是否含有key
5、keySet():把map中所有的key取出存放到一个新的set集合中
6、entrySet( ):返回此映射关系的Set试图,返回值是一个Set集合。
entry对象还有getKey()、getValue()用来获取键与值。
遍历Map集合的方法:
1、通过键找值的方法
第一步:使用Map集合的keySet()方法,把map集合所有的key取出存储到一个set集合中。
第二步:遍历set集合,获取每一个key(迭代器/增强for)
第三步: 通过Map集合的get(key)方法找到value
2、通过Map集合中的方法:
第一步:使用Map集合的entrySet()方法把map集合中的entry对象取出,存储到一个集合中。
第二步:遍历set集合获取每一个entry对象
第三步:使用entry对象的getKey()和getValue()获取值。
六、常用工具类
Arrays: 与数组相关的工具类
Array.toString():将参数数组转化为字符串
Array.sort():按照默认升序从小到大对数组进行排序。
Collections:(用于list) 与集合相关的操作类
addAll( 集合,数据1,数据2…)
shuffle( list):打乱集合顺序
sort( list):将集合元素按照默认规则排序;
注意:排序集合存储元素必须实现comparable,重写接口中的方法。