Java 单列集合方法解析与应用
Posted 流楚丶格念
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 单列集合方法解析与应用相关的知识,希望对你有一定的参考价值。
文章目录
集合概述
这是Java的集合框架图,从该图中可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:
-
接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
-
实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
-
算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
例如下图集合框架的三个内容的分别举例:1
除了集合,该框架也定义了几个 Map 接口和类。Map 里存储的是键/值对。尽管 Map 不是集合,但是它们完全整合在集合中。
继承树
Collection体系的继承树:
Map体系的继承树:
集合接口
集合框架定义了一些接口。
下表是对每个接口的概述:
接口 | 接口描述 |
---|---|
Collection | Collection 接口 Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素, Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。Collection 接口存储一组不唯一,无序的对象。 |
List | List 接口 List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。List 接口存储一组不唯一,有序(插入顺序)的对象。 |
Set | Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素。Set 接口存储一组唯一,无序的对象。 |
SortedSet | SortedSet 继承于Set保存有序的集合。 |
Map | Map 接口存储一组键值对象,提供key(键)到value(值)的映射。 |
Map.Entry | Map.Entry 描述在一个Map中的一个元素(键/值对)。是一个 Map 的内部接口。 |
SortedMap | SortedMap 继承于 Map,使 Key 保持在升序排列。 |
Enumeration | Enumeration 这是一个传统的接口和定义的方法,通过它可以枚举(一次获得一个)对象集合中的元素。这个传统接口已被迭代器取代。 |
Set和List的区别
- Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。
- Set 检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。
- List 和数组类似,可以动态增长,根据实际存储的数据的长度自动增长 List 的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector> 。
数组和集合的区别
相同点
- 都是容器,可以存储多个数据
不同点
- 数组的长度是不可变的,集合的长度是可变的
- 数组可以存基本数据类型和引用数据类型
- 集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类
单列集合具体应用
将上述Java的集合框架图进行缩减为下图继承树所示,我们经常编写的是实现类实现下面这些接口。
1. Collection集合
1.1 Collection 集合概述
Collection 集合是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
JDK 不提供此接口的任何直接实现。它提供更具体的子接口(如Set和List)实现
1.2 创建Collection集合的对象
使用多态的方式:可以使用具体的实现类ArrayList()或者 LinkedList()
1.3 Collection集合常用方法
方法名 | 说明 |
---|---|
boolean add(E e) | 添加元素 |
boolean remove(Object o) | 从集合中移除指定的元素 |
boolean removeIf(Object o) | 根据条件进行移除 |
void clear() | 清空集合中的元素 |
boolean contains(Object o) | 判断集合中是否存在指定的元素 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中元素的个数 |
1.4 Collection集合的遍历:迭代器
迭代器介绍
- 迭代器,集合的专用遍历方式
- Iterator iterator(): 返回此集合中元素的迭代器,通过集合对象的iterator()方法得到
Iterator中的常用方法:
- boolean hasNext(): 判断当前位置是否有元素可以被取出
- E next(): 获取当前位置的元素,将迭代器对象移向下一个索引位置
代码示例:
public class test
public static void main(String[] args)
// 创建集合对象
Collection<String> c = new LinkedList<>();
// 添加元素
c.add("小爱");
c.add("小童");
c.add("小梦");
c.add("小倩");
// Iterator<E> iterator():返回此集合中元素的迭代器,通过集合的iterator()方法得到
Iterator<String> it = c.iterator();
//用while循环改进元素的判断和获取
System.out.println("迭代器############################");
while (it.hasNext())
String s = it.next();
System.out.println(s);
// 增强for
System.out.println("增强for循环############################");
for (String s : c)
System.out.println(s);
扩展:迭代器中删除的方法
void remove()
: 删除迭代器对象当前指向的元素(迭代器删了,源集合也删除)
public class IteratorDemo2
public static void main(String[] args)
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
Iterator<String> it = list.iterator();
while(it.hasNext())
String s = it.next();
if("b".equals(s))
//指向谁,那么此时就删除谁.
it.remove();
System.out.println(list);
1.5 Collection集合的遍历:增强for循环
说明:
- 它是JDK5之后出现的,其内部原理是一个Iterator迭代器
- 实现Iterable接口的类才可以使用迭代器和增强for
- 简化数组和Collection集合的遍历
格式:
for(集合/数组中元素的数据类型 变量名 : 集合/数组名)
// 已经将当前遍历到的元素封装到变量中了,直接使用变量即可
小技巧:在IEDA中集合对象后加.for就可自动提示补全,如下面所示:
回车就自动补全了,
1.6 代码示例
public class test
public static void main(String[] args)
// 创建集合对象
Collection<String> c = new LinkedList<>();
// 添加元素
c.add("小爱");
c.add("小童");
c.add("小梦");
c.add("小倩");
// Iterator<E> iterator():返回此集合中元素的迭代器,通过集合的iterator()方法得到
Iterator<String> it = c.iterator();
//用while循环改进元素的判断和获取
System.out.println("迭代器############################");
while (it.hasNext())
String s = it.next();
System.out.println(s);
//1,数据类型一定是集合或者数组中元素的类型
//2,str仅仅是一个变量名而已,在循环的过程中,依次表示集合或者数组中的每一个元素
//3,c就是要遍历的集合或者数组
// 增强for
System.out.println("增强for循环############################");
for (String str : c)
System.out.println(str);
2. List集合
2.1 List集合的概述
List集合的概述:
- 有序集合,这里的有序指的是存取顺序
- 用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素
- 与Set集合不同,列表通常允许重复的元素
List集合的特点:
- 存取有序
- 可以重复
- 有索引
2.2 List集合的特有方法
如上图所示:List继承Collection接口,List也能用Collection的所有方法
接口只是一种规范,实现了这个接口就能用里面的所有方法,也就是下面的方法。
方法名 | 说明 |
---|---|
boolean add(E e) | 添加元素 |
boolean remove(Object o) | 从集合中移除指定的元素 |
boolean removeIf(Object o) | 根据条件进行移除 |
void clear() | 清空集合中的元素 |
boolean contains(Object o) | 判断集合中是否存在指定的元素 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中元素的个数 |
但是也不止于此,List里面还有一些特有方法
方法名 | 描述 |
---|---|
void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
E get(int index) | 返回指定索引处的元素 |
3. Queue集合
队列结构: 先进先出
3.2 Queue集合的特有方法
方法名 | 描述 |
---|---|
public boolean add(E e) | 如果可以在不违反容量限制的情况下立即执行此操作,则将指定的元素插入此队列,成功时返回 true ,如果当前没有空间,则抛出 IllegalStateException 。 |
public E element() | 检索但不删除此队列的头部。 |
public boolean offer(E e) | 如果可以在不违反容量限制的情况下立即执行此操作,则将指定的元素插入此队列。 |
public E peek() | 检索但不删除此队列的头部,如果此队列为空,则返回 null 。 |
public E poll() | 检索并删除此队列的头部,如果此队列为空,则返回 null 。 |
public E remove() | 检索并删除此队列的头部。 |
4. List与Queue集合的实现类
4.1 集合子类的特点
-
ArrayList集合
底层是数组结构实现,查询快、增删慢
-
LinkedList集合
底层是链表结构实现,查询慢、增删快
4.2 LinkedList集合的特有功能
注意:ArrayList 的方法和 LinkedList 相同,但它没有两端操作数据的方法
特有方法
方法名 | 说明 |
---|---|
public void addFirst(E e) | 在该列表开头插入指定的元素 |
public void addLast(E e) | 将指定的元素追加到此列表的末尾 |
public E getFirst() | 返回此列表中的第一个元素 |
public E getLast() | 返回此列表中的最后一个元素 |
public E removeFirst() | 从此列表中删除并返回第一个元素 |
public E removeLast() | 从此列表中删除并返回最后一个元素 |
更多的 LinkedList的方法说明可以查看:https://www.runoob.com/manual/jdk11api/java.base/java/util/LinkedList.html
5 Set集合
5.1 Set集合概述和特点
- 不可以存储重复元素
- 没有索引,不能使用普通for循环遍历
5.2 Set集合的使用
存储字符串并遍历
public class MySet1
public static void main(String[] args)
//创建集合对象
Set<String> set = new TreeSet<>();
//添加元素
set.add("ccc");
set.add("aaa");
set.add("aaa");
set.add("bbb");
// for (int i = 0; i < set.size(); i++)
// //Set集合是没有索引的,所以不能使用通过索引获取元素的方法
//
//遍历集合
Iterator<String> it = set.iterator();
while (it.hasNext())
String s = it.next();
System.out.println(s);
System.out.println("-----------------------------------");
for (String s : set)
System.out.println(s);
6. Set集合的实现类
6.1 TreeSet集合
- 不可以存储重复元素
- 没有索引
- 可以将元素按照规则进行排序
- TreeSet():根据其元素的自然排序进行排序
- TreeSet(Comparator comparator) :根据指定的比较器进行排序
6.1.2 TreeSet集合基本使用
存储Integer类型的整数并遍历
public class TreeSetDemo01
public static void main(String[] args)
//创建集合对象
TreeSet<Integer> ts = new TreeSet<Integer>();
//添加元素
ts.add(10);
ts.add(40);
ts.add(30);
ts.add(50);
ts.add(20);
ts.add(30);
//遍历集合
for(Integer i : ts)
System.out.println(i);
6.2 HashSet集合
- 底层数据结构是哈希表
- 存取无序
- 不可以存储重复元素
- 没有索引,不能使用普通for循环遍历
6.2.1 HashSet集合的基本应用
存储字符串并遍历
public class HashSetDemo
public static void main(String[] args)
//创建集合对象
HashSet<String> set = new HashSet<String>();
//添加元素
set.add("hello");
set.add("world");
set.add("java");
//不包含重复元素的集合
set.add("world");
//遍历
for(String s : set)
System.out.println(s);
扩展:哈希值
哈希值简介:是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值,表示对象的一种特性。
-
如何获取哈希值
Object类中的public int hashCode():返回对象的哈希码值
-
哈希值的特点
- 同一个对象多次调用hashCode()方法返回的哈希值是相同的
- 默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同
以上是关于Java 单列集合方法解析与应用的主要内容,如果未能解决你的问题,请参考以下文章