分享

java集合(详解)

 醉人说梦 2023-04-12 发布于广东

文章目录    

什么是集合?

Collection的基本使用

接口实现类 

Collections工具类

Map接口及其实现类

Map是不是集合?


什么是集合?

集合是指具有某种特定性质的具体的或抽象的对象汇总而成的集体,有时集合也称之为容器,java中在util包下存放了所有的基本集合。

集合大致分为List,Set,Map三种类型(还有一种Queue本章不讲解).

  • List为一种有序可重复的接口集合

  • Set为一种无序不重复的接口集合

  • Map是采用键值对形式的接口集合

Collection的基本使用

通过集合的关系图我们可以知道Collection是集合的顶层父类,他定义了集合的基本方法如:

方法作用
int size();获取集合大小
boolean isEmpty();判断是否为空
boolean contains(Object var1);判断是否包含
Object[] toArray();将集合转换为数组
boolean add(E var1);向集合增加元素
boolean remove(Object var1);向集合移除元素
boolean containsAll(Collection<?> var1);判断是否包含另一个集合的元素
boolean addAll(Collection<? extends E> var1);添加一个集合的全部元素
boolean removeAll(Collection<?> var1);删除一个集合的全部元素
void clear();清空集合
boolean equals(Object var1);判断是否相同
default Spliterator<E> spliterator();得到该集合的分离器
default Stream<E> stream();转换为Stream流
default Stream<E> parallelStream();转换为Stream并行流

测试:

public class Test {public static void main(String[] args) {//定义一个集合并向上转型Collection<String> obj = new ArrayList<>();//1.int size();	获取集合大小int size = obj.size();//2.boolean isEmpty();	判断是否为空boolean empty = obj.isEmpty();//3.boolean contains(Object var1);	判断是否包含boolean contains = obj.contains(null);//4.Object[] toArray();	将集合转换为数组Object[] objects = obj.toArray();//5.boolean add(E var1);	向集合增加元素boolean result = obj.add("Hello World");//6.boolean remove(Object var1);	向集合移除元素boolean remove = obj.remove(null);//7.boolean containsAll(Collection<?> var1);	判断是否包含另一个集合的元素boolean containsResult = obj.containsAll(new ArrayList<>());//8.boolean addAll(Collection<? extends E> var1);	添加一个集合的全部元素boolean addAllResult = obj.addAll(new ArrayList<>());//9.boolean removeAll(Collection<?> var1);	删除一个集合的全部元素boolean removeAllResult = obj.removeAll(new ArrayList<>());//10.void clear();	清空集合obj.clear();//11.boolean equals(Object var1);	判断是否相同boolean equalsResult = obj.equals(null);//12.default Spliterator<E> spliterator();	得到该集合的分离器Spliterator<String> spliterator = obj.spliterator();//13.default Stream<E> stream();	转换为Stream流Stream<String> stream = obj.stream();//14.default Stream<E> parallelStream();	转换为Stream并行流Stream<String> stringStream = obj.parallelStream();}}

接口实现类 

到这里我们已经知道了集合的基本用法,那么来看看接口的实现类:

List接口:

可以看到List接口下有四个较为常见的实现类:

CopyOnWriteArrayList

该类适用于多线程下读多写少的并发场景,它在有写操作的时候会copy一份数据,然后写完再设置成新的数据,同时也进行了重入锁的处理保证了安全。

ArrayList

它是一个标准的集合实现类,特点为有序,可重复,存储是连续的,因此查询较快,增删较为慢,使用Object数组进行存储

LinkedList

与其他的实现类不同,他的底层是采用链接形式存储的,因此增删块,查询较慢如:

Vector

该类于JDK1.1就出现了,特点为:线程安全但是效率较慢因为他的方法大多采用synchronized进行修饰,也是采用Object数组进行存储

Set接口

HashSet

一个标准的Set集合底层是使用HashMap的Key实现的,特点为:线程不安全,不可重复,无序

Collections工具类

同时java也提供了操作集合的工具类Collections,常用API:

方法作用
public static <T> int binarySearch(List<? extends Comparable<? super T>> var0, T var1);二分搜索找到返回下标没有则返回-1
public static void reverse(List<?> var0);List中的元素反转
public static void shuffle(List<?> var0);List中的元素随机重排
public static <T> Collection<T> synchronizedCollection(Collection<T> var0);将Collection转换为安全的集合
public static <T> Set<T> synchronizedSet(Set<T> var0);将Set集合转换为安全的Set集合
public static <T> List<T> synchronizedList(List<T> var0);将List转换为安全的List
public static <K, V> Map<K, V> synchronizedMap(Map<K, V> var0);将Map转换为安全的Map
public static <T> Iterator<T> emptyIterator();获取空迭代器

测试:

package com.xiao.dao;import java.util.*;import java.util.concurrent.CopyOnWriteArrayList;import java.util.stream.Stream;public class Test {public static void main(String[] args) {//定义Collection接口ArrayList<String> obj = new ArrayList<>();//1. 二分搜索找到返回下标没有则返回-1System.out.println(Collections.binarySearch(obj, "1"));//2.public static void reverse(List<?> var0);	List中的元素反转Collections.reverse(obj);//3.public static void shuffle(List<?> var0);	List中的元素随机重排Collections.shuffle(obj);//4.public static <T> Collection<T> synchronizedCollection(Collection<T> var0);	将Collection转换为安全的集合Collection<String> strings = Collections.synchronizedCollection(obj);//5.public static <T> Set<T> synchronizedSet(Set<T> var0);	将Set集合转换为安全的Set集合Set<Object> objects = Collections.synchronizedSet(new HashSet<>());//6.public static <T> List<T> synchronizedList(List<T> var0);	将List转换为安全的ListList<String> strings1 = Collections.synchronizedList(obj);//7.public static <K, V> Map<K, V> synchronizedMap(Map<K, V> var0);	将Map转换为安全的MapMap<Object, Object> objectObjectMap = Collections.synchronizedMap(new HashMap<>());//8.public static <T> Iterator<T> emptyIterator();	获取空迭代器Iterator<Object> objectIterator = Collections.emptyIterator();}}

Map接口及其实现类

Map官方解释:

A map is an object that maps keys to values. A map cannot contain duplicate keys, and each key can be mapped to at most one value.

翻译:

Map映射是将键映射到值的对象。映射不能包含重复的键,每个键最多可以映射到一个值。

  • Map接口定义了键值对集合的基本方法,其中的存取方法(put,get)这里将不再叙述.

  • Map的主要实现类有:HashMap与TreeMap,其中HashMap 类按哈希算法来存取键对象,而 TreeMap 类可以对键对象进行排序。

HashMap结构:

  • 在JDK8之前HshMap是采用数组加链表进行存储的

  • 在JDK8之后HahMap是采用数组加链表加红黑树进行存储的

HahMap的默认参数为长度16与加载因子为0.75,而现在他的底层实际有两种数据结构一种是链表形式的一种为红黑树:

当16个空间不足以存储(会判断元素数量是否大于HashMap的阈值如果大于则扩容)这时,就会调用resize ()方法通过加载因子扩容,最大是为1073741824个空间。

Map是不是集合?

在初学时很容易误以为只有实现了Collection接口的才是集合,而然并不是这样的,在

《java编程思想》的第11章,第216页,正数第13行,中原文:“……其中基本

的类型是LIst、Set、Queue和Map。这些对象类型也称为集合类,但由于Java类库中使用了Collection这个名字来指代该类库的一个特 殊子集,所以我使用了范围更广的术语'容器’称呼它们……

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多