导图社区 Java容器类
JAVA容器类概述1.常用容器分类JAVA中的容器类主要分为两大类,一类是Map类,一类是Collections类,他们有一个共同的父接口Iterator,它提供基本的遍历,删除元素操作。
编辑于2022-09-26 20:36:11 四川省listener 音标['lisnә] 读音 汉语翻译 n. 收听者, 听众 英语解释: 名词listener: someone who listens attentively 同义词:hearer, auditor, attender
Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。 1、Filter快速入门 1.1、步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方法 d...
会话的解释 [conversation] 指两人以上的对话(多用于学习别种语言或方言时) 详细解释 (1).聚谈;对话。现多用于学习别种语言或方言时
社区模板帮助中心,点此进入>>
listener 音标['lisnә] 读音 汉语翻译 n. 收听者, 听众 英语解释: 名词listener: someone who listens attentively 同义词:hearer, auditor, attender
Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。 1、Filter快速入门 1.1、步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方法 d...
会话的解释 [conversation] 指两人以上的对话(多用于学习别种语言或方言时) 详细解释 (1).聚谈;对话。现多用于学习别种语言或方言时
集合
介绍
集合类:提供一种存储空间可变的存储模型,存储的数据容量可以发生改变
集合和数组的区别
共同点
都是存储数据的容器
不同点
数组的容量是固定的,集合的容量是可变的
数组可以存基本数据类型和引用数据类型。集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类
如果存储的数据,长度经常发生改变,推荐使用集合
集合容器如果没有加<>就可以存储在意数据类型
<>泛型:对集合容器存储的数据类型进行限制
集合类体系结构
蓝色框:接口红色框:实现类
Collection
介绍
Collection是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
JDK不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现
创建Collection集合的对象
多态的方式
具体的实现类Arraylist
例子
常用方法
boolean add(E e)
添加元素
boolean remove(Objecto)
从集合中移除指定的元素
如果删除成功了,则返回true
如果删除失败了,则返回false
boolean removeif(Object o )
根据条件进行删除
removeif底层会遍历集合,得到集合中的每一个元素,s依次表示集合中的每一个元素,然后会把这每一个元素都到lambda表达式中去判断一下
如果返回的是true,则删除
如果返回的是false,则保留不删除
void clear()
清空集合
boolean contains(Objecto)
判断集合中是否存在指定的元素
boolean isEmpty()
判断集合是否为空
int size()
集合的长度,也就是集合中元素的个数
集合的遍历
介绍
Iterator:迭代器,集合的专用遍历方式
常用方法
Iterator<E> iterator()
返回集合中的迭代器对象,该迭代器对象默认指向当前集合的0索引
boolean hasNext()
判断当前位置是否有元素可以被取出
E next()
获取当前位置的元素,将迭代器对象移向下一个索引位置
删除方法
增强for循环
介绍
增强for:简化数组和Collection集合的遍历
它是JDK5之后出现的,其内部原理是一个lterator迭代器
实现Iterable接口的类才可以使用迭代器和增强for
格式
数据类型一定是集合或者数组中元素的类型
str仅仅是一个变量名而已,在循环的过程中,依次表示集合或者数组中的每一个元素
list就是要遍历的集合或者数组.
三种循环使用场景
如果需要操作索引,使用普通for循环
如果在遍历的过程中需要删除元素,请使用选代器
如果仅仅想遍历,那么使用增强for
注意
修改第三方变量的值不会影响到集合中的元素
List
介绍
List是有序集合,这里的有序指的是存取顺序
用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引访问元素,并搜索列表中的元素
与Set集合不同,列表通常允许重复的元素
特有方法
void add(int index,E element)
在此集合中的指定位置插入指定的元素
原来位置上的元素往后挪一个索引
E remove(int index)
删除指定索引处的元素,返回被删除的元素
E set(int index,E element)
修改指定索引处的元素,返回被修改的元素
E get(int index)
返回指定索引处的元素
特有迭代器ListIterator
介绍
在迭代时,只能用迭代器的方法操作元素,可是Iterator的方法是有限的,只能对元素进行判断,取出,删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口ListIterator(List集合特有的迭代器),该接口只能通过List集合的listIterator方法获取
获取
List list = new ArrayList();ListIterator it = list.listIterator()
ArrayList
介绍
ArrayList<E>:可调整大小的数组实现
ArrayList:底层数据结构是数组,查询快,增删慢
构造方法
Arraylist()
构造一个初始容量默认为10的空列表
对集合存储类型进行限制
例子表明集合仅存储String类型数据
JDK7之后规定后面的尖括号内可不写
成员方法
添加
boolean add(E e)
将指定的元素添加到此列表的尾部
void add(int index,E element)
将指定的元素插此列中的指定位置
注意索引越界异常
删除
public boolean remove(Object o)
删除指定的元素,返回删除是否成功
有重复的元素将只删除第一个
public E remove(int index)
删除指定索引处的元素,返回被删除的元素
注意
删除集合元素后该索引位置会被后面的元素依次占领
public E set(int index,E element)
修改指定索引处的元素,返回被修改的元素
public E get(int index)
返回指定索引处的元素
public int size()
返回集合中的元素的个数
源码解析
LinkedList
介绍
LinkedList:底层数据结构是双向链表,查询慢,增删快
创建对象
特有方法
public void addFirst(E e)
在该列表开头插入指定的元素
public void addLast(E e)
将指定的元素追加到此列表的末尾
public E getFirst()
返回此列表中的第一个元素
public E getLast()
返回此列表中的最后一个元素
public E removeFirst()
从此列表中删除并返回第一个元素
public E removeLast()
从此列表中删除并返回最后一个元素
源码分析
Set
介绍
特点
可以去除重复
存取顺序不一致
没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取,删除Set集合里面的元素
TreeSet
介绍
TreeSet的底层是红黑树结构的
特点
不包含重复元素的集合
没有带索引的方法
可以将元素按照规则进行排序
注意
想要使用TreeSet,需要制定排序规则
指定排序规则
自然排序
介绍
自然排序:自定义类实现Comparable接口,重写compareTo方法,根据返回值进行排序。
步骤
使用空参构造创建TreeSet集合
自定义的Student类实现Comparable接口
重写里面的compareTo方法
补充
按照姓名首字母排序
比较器排序Comparator
介绍
比较器排序:创建Treeset对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序。
Treeset的带参构造方法使用的是比较器排序对元素进行排序的
比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
例子
对比
在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,使用比较器排序
返回值规则相同
如果返回值为负数,表示当前存入的元素是较小值,存左边
如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存
如果返回值为正数,表示当前存入的元素是较大值,存右边
HashSet
介绍
底层数据结构是哈希表
不能保证存储和取出的顺序完全一致
没有带索引的方法,所以不能使用普通for循环遍历
由于是Set集合,所以元素唯一
哈希值
介绍
哈希值(哈希码值):是JDK根据对象的地址或者属性值,算出来的int类型的整数
特点
如果没有重写hashCode方法,那么是根据对象的地址值计算出的哈希值。同一个对象多次调用hashCode()方法返回的哈希值是相同的,不同对象的哈希值是不一样的。
如果重写了hashCode方法,一般都是通过对象的属性值计算出哈希值。如果不同的对象属性值是一样的,那么计算出来的哈希值也是一样的。
获取方法
Object类中有一个方法可以获取对象的哈希值
public int hashCode():根据对象的地址值计算出来的哈希值
底层原理
JDK 7
底层结构:哈希表。(数组+链表)
数组的长度默认为16,加载因子为0.75
首先会先获取元素的哈希值,计算出在数组中应存入的索引,判断该索引处是否为nulll,如果是null,直接添加,如果不是null,则与链表中所有的元素,通过equals方法比较属性值只要有一个相同,就不存,如果都不一样,才会存入集合。
JDK 8
底层结构:哈希表。(数组、链表、红黑树的结合体)。
当挂在下面的元素过多,那么不利于添加,也不利于查询,所以在JDK8以后,当链表长度超过8的时候,自动转换为红黑树
存储流程
Map
介绍
单列集合一次存一个元素,双列集合一次存两个元素(一对数据)
Interface Map<K,V> K:键的数据类型;V:值的数据类型
键不能重复,值可以重复
键和值是一一对应的,每一个键只能找到自己对应的值
(键+值)这个整体称之为"键值对"或者"键值对对象",在Java中叫做"Entry对象"
创建对象
常用方法
V put(K key,V value)
添加元素
如果要添加的键不存在,那么会把键值对都添加到集合中如果要添加的键是存在的,那么会覆盖原先的值,把原先值当做返回值进行返回
V remove(Obiect key)
根据键删除鍵值对元素
void clear()
移除所有的键值对元素
boolean containsKey(Obiect key)
判断集合是否包含指定的键
boolean containsValue(Object value)
判断集合是否包含指定的值
boolean isEmpty()
判断集合是否为空
int size()
集合的长度,也就是集合中键值对的个数
Set<K> keySet()
获取所有键的集合
V get(Object key)
根据键获取值
Set<Map.Entry<kV>> entrySet()
获取所有键值对对象的集合
K getKey()
获得键
V getValue()
获得值
遍历方式
1.创建集合并添加元素
2.获取到所有的键
3.遍历Set集合得到每一个键
4.通过每一个键key,来获取到对应的值
1.创建集合并添加元素
2.获取所有的键值对对象
Set集合中装的是键值对对象(Entry对象)
而Entry里面装的是键和值
3.得到每一个键值对对象
HashMap
介绍
HashMap是Map里面的一个实现类
HashMap跟HashSet一样底层是哈希表结构的
依赖hashCode方法和equals方法保证键的唯一
如果键要存储的是自定义对象,需要重写hashCode和equals方法
foreach遍历
TreeMap
介绍
TreeMap是Map里面的一个实现类。
TreeMap跟TreeSet—样底层是红黑树结构的
依赖自然排序或者比较器排序,对键进行排序
如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象时候给出比较器排序规则
可变参数
介绍
可变参数:就是形参的个数是可以变化的
如果一个方法有多个参数,包含可变参数,可变参数要放在最后
格式
三个... 不多不少
这里的变量其实是一个数组
创建不可变的集合
介绍
在List,Set,Map接口中,都存在of方法,可以创建一个不可变的集合。
这个集合不能添加,不能删除,不能修改,但是可以结合集合的带参构造,实现集合的批量添加。
在Map接口中,还有一个ofEntries方法可以提高代码的阅读性。首先会把键值对封装成一个Entry对象,再把这个Entry对象添加到集合当中。
方法
static <E> List <E> of(E..elements)
创建一个具有指定元素的List集合对象
static <E> Set <E> of(E..elements)
创建一个具有指定元素的Set集合对象
传递的参数当中,不能存在重复的元素
static <K,V> Map <K,V> of(Eelements)
创建一个具有指定元素的Map集合对象
应用场景
帮助集合进行批量添加
Stream流
介绍
在Stream流中无法直接修改集合,数组等数据源中的数据
三类方法
获取Stream流
创建一条流水线,并把数据放到流水线上准备进行操作
方法
单列集合
可以使用Collection接口中的默认方法stream()生成流
default Stream<E> stream()
双列集合
不能直接获取流,间接的生成流
可以先通过keySet或者entrySet获取一个Set集合,再获取Stream流
数组
Arrays中的静态方法stream生成流
同种数据类型的多个数据
1,2,3,4,5....
"aaa","bbb","ccc"....
使用Stream.of(T...values)生成流
中间方法
流水线上的操作,一次操作完毕之后,还可以继续进行其他操作。
方法
Stream <T> filter(Predicate predicate)
用于对流中的数据进行过滤
Predicate接口中的方法:boolean test(T t):对给定的参数进行判断,返回一个布尔值
Stream <T> limit(long maxSize)
截取指定参数个数的数据
Stream <T> skip(long n)
跳过指定参数个数的数据
static <T> Stream <T> concat(Stream a,Stream b)
合并a和b两个流为一个流
Stream <T> distinct()
去除流中重复的元素。依赖(hashCode和equals方法)
终结方法
一个Stream流只能有一个终结方法,是流水线上的最后一个操作
方法
void forEach(Consumer action)
对此流的每个元素执行操作
Consumer接口中的方法:void accept(T t):对给定的参数执行此操作
long count()
返回此流中的元素数
收集方法
R collect(Collector collector)
collect负责收集数据.获取流中剩余的数据,但是不负责创建容器,也不负责把数据添加到容器中
工具类Collectors提供了具体的收集方式
public static <T> Collector toList()
把元素收集到List集合中
public static <T> Collector toSet()
把元素收集到Set售合中
public static Collector toMap(Function keyMapper,Function valueMapper)
把元素收集到Map集合中
主题