Java集合常用方法介绍

简介

集合的使用场景

当需要在程序中记录单个数据时,则声明变量记录即可;
当需要在程序中记录多个类型相同的数据时,则声明数组记录即可;
当需要在程序中记录多个类型不同的数据时,则构造对象记录即可;
当需要在程序中记录多个类型不同的对象时,则需要集合来处理;

数组和集合的比较

(1)数组的特点
a.数组本质上就是一段连续的内存空间,用于记录多个类型相同的数据;
b.数组一旦声明完毕,则内存空间固定不变;
c.插入和删除操作不方便,可能会移动大量的元素导致效率太低;
d.支持下标访问,可以实现随机访问;
e.数组中的元素可以是基本数据类型,也可以使用引用数据类型;

(2)集合的特点
a.内存空间可以不连续,数据类型可以不相同;
b.集合的内存空间可以动态地调整;
c.集合的插入删除操作可以不移动大量元素;
d.部分支持下标访问,部分不支持;
e.集合中的元素必须是引用数据类型;

集合的框架

Java语言中集合框架的顶层是:Collection集合 和 Map集合。
其中Collection集合操作元素的基本单位是:单个元素;
其中Map集合操作元素的基本单位是:单对元素;

在开发中很少直接使用Collection集合,通常都是使用该集合的子集合:List集合、Queue集合以及Set集合。


Collection中的常用方法

boolean add(E e)
- 用于将元素e放入当前集合中。
boolean addAll(Collection<? extends E> c)
- 用于将参数指定集合中的所有元素放入当前集合中。
boolean remove(Object o)
- 用于从当前集合中删除参数指定的元素。
boolean removeAll(Collection<?> c)
- 用于从当前集合中删除参数指定集合中的所有元素。
void clear()
- 用于将当前集合中的所有元素移除。
boolean contains(Object o)
- 用于判断当前集合中是否包含参数指定的单个元素。
- (onull ? enull : o.equals(e))
boolean containsAll(Collection<?> c)
- 用于判断当前集合中是否包含参数指定集合中的所有元素。
boolean isEmpty()
- 用于判断当前集合是否为空。
int size()
- 用于返回当前集合中元素的个数。
boolean retainAll(Collection<?> c)
- 用于获取当前集合和参数集合的交集并保留到当前集合中。
- 若当前集合中的内容发生了更改则返回true,否则返回false。

List集合(重中之重)

List集合基本概念

java.util.List接口是Collection接口的子接口,元素有先后放入次序,并且允许重复。
该接口的主要实现类有:ArrayList类、LinkedList类、Stack类以及Vector类。

  • 其中ArrayList类的底层是采用动态数组实现的,因此增删不方便,访问元素方便;
  • 其中LinkedList类的底层是采用链表实现的,因此增删方便,访问元素不方便;
  • 其中Stack(栈)类的底层是采用动态数组实现的,用于描述一种具有后进先出特性的数据结构,简称为LIFO(last in first out)。
  • 其中Vector类的底层是采用动态数组实现的,与ArrayList类相比属于早期的类,属于线程安全的类,因此效率比较低,推荐使用ArrayList类取代之。
List集合常用的方法

void add(int index, E element)
- 用于将元素element插入到当前集合中index指向的位置。
boolean addAll(int index, Collection<? extends E> c)
- 用于将集合c中所有元素插入到当前集合中index指向的位置。
E remove(int index)
- 用于将index位置的元素从当前集合移除。
- 返回被删除的元素值,下标不合理时会产生下标越界异常。
E set(int index, E element)
- 使用element元素替换当前集合中index位置的元素,返回被替换的元素。
E get(int index)
- 用于返回当前集合中下标为index位置的元素。
List subList(int fromIndex, int toIndex)
- 用于返回当前集合中从fromIndex(包含)到toIndex(不包含)之间的部分视图。
- 返回的集合和当前集合共用同一块内存区域。

泛型机制

集合中之所以可以存放不同类型的数据是因为全部当做Object类型处理的,当从集合中取出元素并希望表达该数据最原始的类型时就需要进行强制类型转换,而强制类型转换不仅使得代码更加繁琐而且可能导致类型转换异常的发生。

为了避免上述问题的发生,从jdk1.5开始提供泛型机制,也就是在集合名称的右边使用<数据类型>的方式明确规定该集合中可以存放的元素类型,若存放其他类型则编译报错。

List<Integer> l1 = new LinkedList<Integer>(); 

泛型机制的原理就是参数化类型,也就是说使用E作为泛型机制的形式参数负责占位,当真正构造对象时需要使用真实的数据类型作为实参传递给E这个形参,从而类中的E全部变成了实参类型。

Queue接口

Queue接口基本概念

Queue接口是Collection接口的子接口,与List接口是平级关系。
该接口主要描述具有先进先出特性的数据结构,简称为FIFO(first in first out),叫队列
该接口的主要实现类是LinkedList类,因为该类在增删方面有一定的优势。

Queue接口常用的方法

boolean offer(E e) - 将参数指定的元素e插入到当前队列的末尾。
- 若插入成功则返回true,否则返回false。
E poll() - 用于从当前队列的队首移除一个元素并返回。
- 若当前队列为空,则返回null。
E peek() - 用于获取当前队列的队首元素并返回。
- 若当前队列为空,则返回null。

Set接口(重点)

Set接口基本概念

java.util.Set接口是Collection接口的子接口,元素没有先后放入次序,并且不允许重复
该接口的主要实现类有:HashSet类 和 TreeSet类。
其中HashSet类的底层是采用哈希表进行数据管理的。
其中TreeSet类的底层是采用二叉树进行数据管理的。

元素放入HashSet类的过程(尽量理解)

(1)使用元素调用hashCode()方法,获取该元素的哈希码值;
(2)将哈希码值交给哈希算法来生成哈希表中的索引位置;
(3)若该位置没有元素,则将该元素直接放入该位置即可;
(4)若该位置有元素,则判断该元素是否与已有元素相等;
(5)若相等,则放弃新元素的插入,保留旧元素来确保元素不能重复;
(6)若不相等,则将新元素插入到该元素的后面,若后面有元素则继续比较;

TreeSet类基本概念

TreeSet类是java.util.Set接口的实现类,底层是一棵有序二叉树。
为了使得插入新元素后该集合的底层依然是有序二叉树,则需要指定元素比较大小的规则,而具体的执行方式有两种:
a.使用元素的自然排序规则来处理,让元素类型实现java.lang.Comparable接口并重写方法
b.使用创建集合时的比较器来指定规则,传入java.util.Comparator接口的引用作为实参

TreeSet类常用的工具类

java.util.Arrays类中提供了大量操作数组中元素的静态方法;
java.util.Collections类中提供了大量操作集合中元素的静态方法;

Set接口常用的方法

该接口的常用方法参考Collection接口即可。
Iterator iterator() - 用于获取当前集合中的迭代器,用于迭代集合中的所有元素。
- 迭代就是遍历/访问的意思,通俗来说,使用该方法的返回值可以访问集合任意元素
Iterator接口中的常用方法有:
boolean hasNext() - 用于判断当前集合中是否拥有可以访问的元素。
E next() - 获取一个元素返回后并指向下一个元素。
void remove() - 用于删除集合中刚刚获取到的元素。

注意:
使用迭代器访问集合中的元素时,不允许使用集合自己的remove()方法来删除元素,否则会产生并发修改异常,应该使用迭代器自己的remove()方法。

增强版的for循环(for each结构)

(1)语法格式

for(元素类型 变量名 : 数组名/集合名){
    循环体;
}  

(2)执行流程
不断地从数组/集合中取出一个元素赋值给变量名,然后在循环体中使用变量名处理,直到取完所有元素为止。

总结:
对于Set集合来说,访问所有元素的方式有3种:toString()、迭代器、for each结构。
对于List集合来说,访问所有元素的方式有4种:除了上述三种外还可以使用get()方法。


Map接口(重点)

Map接口基本概念

java.util.Map<K,V>接口主要用于存放一对一对元素,分别叫做key(键)和value(值)。
类型参数:
K - 此映射所维护的键的类型
V - 映射值的类型
该集合中key是不允许重复的,而且每个key对应唯一的value。
该接口的主要实现类有:HashMap类 和 TreeMap类。

Map接口常用的方法

V put(K key, V value) - 用于将参数指定的key和value组成一对放入当前集合中。
- 增加key和value时则返回null,修改key和value时则返回key之前对应的value。
V remove(Object key) - 用于从当前集合删除key关联的键值对。
- 若key不存在则返回null,否则返回key对应的value。
boolean containsKey(Object key)
- 用于判断当前集合中是否存在参数指定的key。
boolean containsValue(Object value)
- 用于判断当前集合中是否包含参数指定的value。
V get(Object key)
- 用于根据参数指定的key来返回对应的value。
Set<Map.Entry<K,V>> entrySet()
- 用于返回当前集合中包含映射关系的Set视图,通俗来说,就是把Map转换为Set。
Set keySet()
- 用于返回当前集合中包含key的Set视图。
java.util.Map.Entry<K,V>接口代表键值对,提供的方法有:
K getKey() - 用于获取当前键值对中key的数值并返回。
V getValue() - 用于获取当前键值对中value的数值并返回。
————————————————
版权声明:本文为CSDN博主「xyphf_和派孔明」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xyphf/article/details/84000952

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值