集合
集合:java提供的一个容器
数组:集合
数组可以存储基本数据类型,大小不可变
集合只能存储引用数据类型,大小可以改变
单列集合Collection 拥有List和Set
双列集合Map
Collection集合
如果创建Collection集合的时候没有指定数据类型,自动提升为Object类型
常用方法
-
创建对象
Collection<Integer> coll = new ArrayList<>(); Collection<Integer> coll1 = new ArrayList<>();
-
遍历
for (int i = 0; i < 12; i++) { coll.add(i); } for (int i = 6; i < 45; i++) { coll1.add(i); }
-
是否一个集合包含另一个集合元素contains(Collection?)
boolean contains = coll1.contains(coll);
-
//删除所有包含coll元素的内容removeAll(Collection?)
// boolean removeAll = coll1.removeAll(coll);
-
/交集retainAll(Collection?)
boolean b = coll.retainAll(coll1);
-
删除coll.clear();
coll.clear();
-
是否为空coll.isEmpty();
coll.isEmpty();
-
包含的个数coll.size();
coll.size();
集合的遍历方式
-
增强for
-
iterator
hashNext()表示当前迭代器里面是否还有下一个元素
next()表示的就是下一个元素
-
增强for
Collection<Integer> coll = new ArrayList(); for (int i = 0; i < 5; i++) { coll.add(i); } for (Integer integer : coll) { System.out.println(integer); } }
-
iterator迭代器
Iterator<Integer> iterator = coll.iterator(); while (iterator.hasNext()) { String next = iterator.next(); }
List集合
创建List集合的方式:多态的方式创建
接口
实现了List接口的实现类集合,称为List集合
可以使用索引精确控制每个元素
以一种线性方式进行存储,可以通过索引访问集合中的指定元素
-
特点:元素有序,存入顺序和取出顺序一致
-
它是一个元素存取有序的集合。
-
带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
-
可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
-
List常用方法:
-
//指定位置插入元素
List<String> list = new ArrayList<>(); for (int i = 0; i < 8; i++) { list.add(i+""); } list.add(0,"a");
-
//获取指定位置元素
System.out.println(list.get(0));
-
//替换指定位置的元素
list.set(0,"b");
-
//返回泛型类型的数组
// String[] s = new String[list.size()]; String[] strings = list.toArray(new String[list.size()]);
-
//根据索引移除元素
list.remove(0);
List的子类
ArraysList集合
-
集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为: 查询数据、遍历数据,所以array List为最常用的数组
-
ArraysList中维护了一个Object类型的数组elementDate
[debug]源码 transient Object[] elementDate;
transient表示瞬间,短暂的,表示该属性不会背序列化
-
当创建ArrayList对象时,如果用的是无参构造器,则初始elementDate容量为10,如需要再次扩容,则扩容elementDate为1.5倍数
-
Arraylist()
-
-
如果使用的是指定大小的构造器,则初始elementDate容量为指定大小,如果需要扩容,则直接扩容为elementDate的1.5倍,
-
Arraylist(int)
-
-
ArraysList底层分析机制
使用Arrays.copyof扩容保证内容不变
Vector集合
底层也是一个数组
线程是同步的,安全
在使用线程时候考虑使用Vector
-
扩容
-
无参,默认10,满后按照2倍扩容
-
如果指定大小,直接按照两倍扩容
-
LinkedList链表
LinkedList底层实现了一个双向链表和段高端队列
可以添加任意元素(元素可以重复)包括null
线程不安全,没有同步
集合数据存储的结构是链表结构。方便元素添加、删除的集合。
双向链表(数据域和指针域)
特点:查询慢,增删快
ArrayList和LinkedLIst比较
ArraysList:可变数组 增删效率较低 改查效率较高
LinkedList:双向链表 增删效率较高,通过链表追加 改查效率较低
set接口
-
无序、
-
不允许重复元素、最多包含一个元素,包括null
-
继承Collection接口
-
其中包括 linkedset 和hashset
-
hashset集合
-
元素不可重复,元素无序
-
底层是一个HashMap支持
-
根据对象的哈希值来确定集合中的储存位置
-
具有良好的存取性能,保证元素的唯一性
-
依赖hashCode 和equals方法
-
HashSet集合存储数据的结构(哈希表)
哈希表是由数组+链表+红黑树实现
保证集合中的唯一,是由hashCode和equals来决定的
HashSet存储自定义类型元素
存放一个 自定义元素时,需要重写对象的HashCode和equals方法,建立自己的比较方式
LinkedHashSet
元素唯一,具有顺序
链表和哈希表组合的一个数据存储结构
Collections工具类
往集合中添加一些元素
-
public static <T> boolean addAll(Collection<T> c, T... elements)
打乱顺序
-
public static void shuffle(List<?> list) 打乱顺序
将集合中元素按照默认规则排序
-
public static <T> void sort(List<T> list)
:将集合中元素按照指定规则排
-
public static <T> void sort(List<T> list,Comparator<? super T> )
Comparator比较器
:将集合中元素按照默认规则排序。
-
public static <T> void sort(List<T> list)
-
两个对象之间比较大小
-
Comparable:要求了被排序的类型
需要实现Comparable接口完成比较的功能
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {}
-
Comparator :public int compare(String o1 , String o2)
-
两个对象比较的结果有三种:大于,等于,小于。
如果要按照升序排序, 则o1 小于o2,返回(负数),相等返回0,01大于02返回(正数) 如果要按照
降序排序 则o1 小于o2,返回(正数),相等返回0,01大于02返回(负数)
-
Comparable和Comparator两个接口的区别。
-
Comparable : 强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中 的键或有序集合中的元素,无需指定比较器。
-
Comparator强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或 有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序
map集合
Map实现类的结构
-
Map:双列数据,存储key-value对的数据 ----类似高中的函数 y= f(x)
-
HashMap:作为Map的主要实现类 线程不安全效率高:存储null的key和value
-
-LinkedHashMap:保证再遍历map元素是,可以按照添加的顺序实现遍历; 原因:在原有的Hashmap底层基础上,添加了一堆指针,指向前一个和后一个,队友频繁的遍历操作,此类执行效率高于HashMap
-
-
-TreeMap:按照添加的key-value对进行排序,实现排序遍历,此时考虑key的自然排序,或者定制排序;
底层使用红黑树;
-
-Hashtable:古老的实现类:线程安全,效率低,不能储存null的key和value
-
--Properties: 常用来处理配置文件。key和value都是String类型
-
HashMap的底层:数组+链表+红黑树
二、结构的理解
-
Map中的key :无序的,不可重复的 ,
-
使用Set存储所有的key---重写equals和hashCode(HashMap为列)
-
-
Map中的value: 无序的,可以重复的,
-
使用Collection存储所有的value--------value所在的类要重些equals()。
-
-
一个键值对:key和value构成了一个Entry对象。
Entry:无序的,不可重复的,使用Set存储所有的entry
三、HashMap的底层实现原理
1.new HashMap()底层没有创建一个长度为16的数组
2.jdk 8 底层的数组是Node[],而不是Entry[]
3.首次调用put()方法时候,底层创建长度为16的数组
4.jdk7底层结构只有:数组+链表,jdk中底层结构:数组+链表+红黑树
当数组的某一个索引位置上的元素以链表形式存在的数据个数 > 8且当前数组的长度>64,此时索引的位置上的所有数据改为使用红黑树存储
DEFAULT_INITTAL_CAPACITY: HashMap的默认容量,16
DEFAULT_LOAD_FACTOR:HashMap的默认加载因子:0.75
threshold:扩容的临界值,=容量*填充因子:16 * 0.75=>12
MIN_TREEIFY_CAPACITY:桶中的Node被 树化时最小的hash表容量:64
LinkHaskMap的底层实现原理
Map中定义的方法
添加、删除、修改、操作:
Object put (Object key ,object value):将指定的key-value
添加到(或修改)当前map对象中
void putAll(Map m):将m中所有key-value对存放到当前map中
Object remove(object key):指定一处key的key-value对,并且返回value
void clean():清空当前Map中所有的数据
元素查询的操作:
- object get(object key ):获取指定key对应的value
- boolean containsKey (Object key):是否包含 指定的key
- boolean containsValue(object value):是否包含指定的value
- int size() :返回map中key-value对的个数
- boolean isEmpty():判断当前map是否为空
- boolean equals (object obj) :判断当前map和参数对象obj是否相等元视图操作的方法
- Set keySet():返回所有key构成的Set集合
- Collection values():返回所有key构成的Set集合
- Set entrySet():返回所有Key - value对构成的Set集合