集合
一.单列集合
(1)collection接口, 单列数据,定义了存取一组对象的方法的集合。
collection:
1、添加
add(Object obj)
addAll(Collection coll)
2、获取有效元素个数
int size()
3、集合是否相等
boolean equals(Object obj)
4、转换成对象数组
Object [] toArray()
5、获取集合对象的哈希值
hashCode()
6、遍历
iterator():返回迭代器对象,用于集合遍历
collection常用子接口:List接口(其中List常用子接口又有ArrayList、LinkedList、Vector... )、Set接口(其中Set子接口又有HashSet、TreeSet、LinkedHashSet)
List接口
ArrayList:
ArrayList():构造一个默认大小为10容量的空列表。
LinkedList和ArrayList方法一样,只是底层实现不一样。ArrayList底层为数组存储,LinkedList是以双向链表存储。LinkedList集合没有初始化容量。最初这个链表中没有任何元素。first和last引用都是null。
LinkedList:
一) LinkedList():构造一个空的LinkedList对象。
二) LinkedList(Collection c):构造一个和参数c相同元素的LinkedList对象
Vector
1、底层也是一个数组。
2、初始化容量:10
3、怎么扩容的?
扩容之后是原容量的2倍。
10--> 20 --> 40 --> 80
4、Vector中所有的方法都是线程同步的,都带有synchronized关键字,
是线程安全的。效率比较低,使用较少了。
5、怎么将一个线程不安全的ArrayList集合转换成线程安全的呢?
使用集合工具类:
java.util.Collections;
java.util.Collection 是集合接口。
java.util.Collections 是集合工具类。
Collections.synchronizedList();//将及格转换为线程安全的。
二.双列集合
Map接口:双列数据,保存具有映射关系“key-value对”的集合。
Map常用子接口:Hashtable,LinkedHashMap,HashMap,TreeMap、Properties
(2)map接口:双列数据,保存具有映射关系“key-value对”的集合。
Set接口
- Set接口是Collection的子接口,Set集合中的元素是无须,同时不可重复的
- 可以存放null元素
- Set接口的实现类有HashSet、treeSet、LinkedHashSet
HashSet
1.HashSet是为了优化查询速度而设计的Set,允许存放null值。元素不可重复且无序
对于存在HashSet集合中的元素需要重写equals()方法和HashCode()方法
HashSet是线程不安全的
2.添加数据底层源码解析
底层实现图解:链表+数组+红黑树
treeSet
①Tree是SortedSet接口的实现类,TreeSet可以确保集合元素除余排序状态。
②Tree底层使用红黑树结构存储数据。
③新增的方法:(了解)
>Comparator comparator() >Object higher(Object e)
>Object first() >SortedSet subSet(fromElement,toElement)
>Object last() >SortedSet headSet(toElement)
>Object lower(Object e) >SortedSet taiSet(fromElement)
④Tree两种排序方法:自然排序和定制排序。默认情况下,Tree采用自然排序。
⑤TreeSet和后面的TreeMap采用红黑树的存储结构。特点:有序,查询速度比List快。
原文链接:https://blog.youkuaiyun.com/qq_55133453/article/details/124476889
HashMap
①HashMap是Map接口使用频率最高的实现类。
②允许使用null键和null值,与HashSet一样,不保证映射的顺序。
③所有的key构成的集合是Set:无序的、不可重复的。所以,key所在的类要重写equals()和hashCode()
④所有的value构成的集合是Collection:无序的、可以重复的。所以,value所在的类要重写equals()
⑤一个key-value构成一个entry
⑥所有的entry构成的集合是Set:无序的、不可重复的
⑦HashMap 判断两个key相等的标准是:两个key通过equals()方法返回true,hashCode值也相等。
⑧HashMap 判断两个value相等的标准是:两个value通过equals()方法返回true。
LinkedHashSet
①LinkedHashMap是HashMap的子类
②在HashMap存储结构的基础上,使用了一堆双向链表来记录添加元素的顺序
③与LinkedHashSet类似,LinkedHashMap可以维护Map的迭代顺序:迭代顺序与Key-Value对的插入顺序一致
可变参数
一 可变参数本质上就是一个数组
二 作用:在形参中接收多个数据
三 格式:数据类型...参数名称
如:int...a
四 注意事项:
1.在方法形参中最多只能写一个可变参数
2.在方法中,如果除了可变参数,还有其他形参,可变参数要写到最后
Collections
1.java.util.Collections:是集合工具类
2.作用:Collections不是集合,而是集合的工具类
3.方法(主要):Collections.addall(集合名,element)
Collections.shuffle(集合名)
Collections.sort()给元素排序(默认规则)Collections.sort(集合名,new Compare)
Steam流
概述:
Stream是Java 8引入的一种新的抽象,它使得我们可以以类似于SQL查询的方式来操作集合数据。Stream不是数据结构,而是对数据进行操作的工具。结合了lambda表达式,简化集合,数组的操作。它可以从集合、数组等数据源创建,并支持各种操作,如过滤、映射、排序、聚合等。
特点:
Stream是面向函数式编程的,它允许使用Lambda表达式进行操作。
Stream提供了一种延迟执行的机制。在进行最终操作之前,可以对Stream进行多次中间操作,这样可以构建一个操作流水线。
Stream操作是惰性的,只有在需要结果时才会进行实际计算。
Stream可以是无限的,也可以是有限的。
创建Stream:
从集合创建:可以通过集合的stream()方法来创建一个Stream流。
从数组创建:可以使用Arrays.stream()方法来创建一个Stream流。
从值或数组元素创建:可以使用Stream.of()方法来创建一个包含指定值或数组元素的Stream流。
从文件创建:可以使用Files.lines()方法来读取文件并创建一个Stream流。
中间操作和终端操作:
中间操作:中间操作是对Stream进行转换和过滤的操作,它们返回一个新的Stream对象。常见的中间操作包括filter()、map()、sorted()、distinct()等。
终端操作:终端操作是对Stream进行最终操作并产生结果的操作。它们可能返回一个非Stream的结果,例如forEach()、count()、collect()等,或者返回一个新的Stream,例如map()和filter()操作的组合。
常见操作示例:
过滤:使用filter()方法根据给定的条件过滤集合中的元素。
映射:使用map()方法将集合中的元素映射为新的值,转换流中数据类型
排序:使用sorted()方法对集合中的元素进行排序。
聚合:使用reduce()方法将集合中的元素聚合为单个结果。
收集:使用collect()方法将Stream中的元素收集到集合中。
获取:使用limit()方法获取前几个元素
跳过:使用skip()跳过前几个元素
Stream<T> distinct() 元素去重,依赖(hashCode,equals方法)
static <T>Stream<T>concat(Stream a, Steam b)合并a,b两个流