数据结构:栈:先进后出。队列:先进先出
数据结构:数组,查询快(数组的地址是连续的,通过数组的首地址可以找到数组,通过数组的索引可以快速查找某一个元素),增删慢(数组的长度是固定的,我们想要增加/删除一个元素,必须创建一个新数组,把源数组的数据复制过来)。
数据结构:链表:查询慢(链表中的地址不是连续的,每次查询元素都必须从头开始),增删快(链表结构,增加/删除一个元素,对链表的整体结构没有影响,所以增删快)。可分为单向链表和双向链表。
红黑树:节点可以是红色或者黑色的,根节点是黑色的,叶子 的节点是黑色的。特点,趋近于平衡树,查询的速度非常的快,查询叶子节点最大次数和最小次数不能超过2倍。
java.util.List 接口继承Collection接口
List接口特点:
1,有序的集合,存储元素和去除元素的顺序是一致的
2,有索引,包含了一些带索引的方法
3,允许存储重复的元素
其中带索引的方法:add,get,remove,set
创建List集合:如多态:List <String> list=new ArrayList<>();
List子类ArraList(此实现不是同步),集合存储的结构是数组结构。日常开发中常用,但不提倡随意使用。
List子类LinkedList(此实现不是同步),集合存储的结构是链表结构。且是双向链表。常用方法,addFirst,addLast,push,getLast,getFirst,pop,remove等。
List子类Vector(此实现同步——单线程,单线程速度慢)在JDK1.2版本之后被ArrayList取代。
Set接口特点
1,不允许重复元素
2,没有索引,没有带索引的方法,不能使用普通的for循环遍历,可使用迭代和增强for
java.util.HashSet 特点:
1,不允许存储重复的元素。2,没有索引,没有带索引的方法,不能使用普通的for循环遍历,可使用迭代和增强for。3,是一个无序的集合,存储元素和取出元素的顺序可能不一致。4,底层是一个哈希表结构(查询的速度非常的快)。
创建如:Set<Integer>set=new HashSet<>();
哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来的地址,不是数据实际存储的物理地址。在Object类中有一个方法,int hashCode() 获取对象的哈希值)。
hashCode方法可以重写,对象的地址其实就是哈希值的十六进制。
若用hashset存储元素,必须重写hashCode和equals方法(尤其是存储。自定义类型元素)
java.util.LinkedHashSet 底层是一个哈希表(数组+链表/红黑树)+链表:多了一个链表(记录元素的存储顺序),保证元素有序。
可变参数:当方法的参数列表数据类型已经确定,但是参数的个数不确定,就可以使用可变参数。格式:修饰符 返回值类型 方法名(数据类型。。。变量名){}
注意事项:1,一个方法的参数列表,只能有一个可变参数。2,如果方法的参数有多个,那么可变参数必须卸载参数列表的末尾。
java.util.Collections是集合工具类。sort 方法,将集合中元素按照默认规则排序。使用前提,被排序的集合里边存储的元素,必须实现Comparable 接口,并重写接口中的方法compareTo定义排序的规则。
Comparable 和 Comparator接口区别:Comparable:强行对实现它的每个类的对象进行整体排序。Comparator 强行对某个对象进行整体排序。
java.util.Map
Map集合特点:
1,Map集合是一个双列集合,一个元素包含两个值(key,value)
2,Map集合中的元素,key和value的数据类型可以相同,可以不同
3,Map集合中的元素,key是不允许重复的value是可以重复的
4,Map集合中的元素,key和value是一一对应的
HashMap集合的特点:
1,HashMap集合底层是哈希表:查询的速度特别的快。JDK1.8之后除了数组和单向链表,也加入了红黑树结构,目的提高查询的速度。
2,HashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致。
LinkedHashMap特点:
1,LinkedHashMap集合底层是哈希表+链表(多了一个链表,保证迭代顺序)
2,LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的。
HashMap和LinkedHashMap,由于要保证键的唯一、不重复,需要重写键的hashcode和equals方法。
常用方法,put/get/remove/containsKey。其中,基本类型最好用到包装类,即使返回空值也不会报错。
Map集合有两种遍历的方式(Map集合不能直接使用迭代器或者增强for进行遍历,要转为Set之后就可以使用)
1,通过键找值的方式,即Set<K>keySet(),返回此映射中包含的键的Set视图。
2,使用Entry对象遍历,即Set<Map.Entry<k,v>> entrySet() 返回此映射中包含的映射关系的Set视图。
JDK9的新特性:
List接口,Set接口,Map接口;里边增加了一个静态的方法of,可以给集合一次性添加多个元素。
注意:1,of方法只适用上述接口,不适合接口的实现类如ArrayList,hashSet等。2,of方法的返回值是一个不能改变的集合,集合不能再使用add,put等方法增加元素,会抛出异常。3,Set接口和Map接口在调用of方法时,不能有重复的元素,否则会抛出异常。