java集合(详解)

目录

        什么是集合?

        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. 二分搜索找到返回下标没有则返回-1
        System.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转换为安全的List
        List<String> strings1 = Collections.synchronizedList(obj);
        //7.public static <K, V> Map<K, V> synchronizedMap(Map<K, V> var0);	将Map转换为安全的Map
        Map<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这个名字来指代该类库的一个特 殊子集,所以我使用了范围更广的术语‘容器’称呼它们……

  • 27
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

123小步

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值