专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

【Java】(机考常用)类集

类集框架集合框架)是一个用来代表和操纵集合的统一架构。所有的类集框架都包含如下内容:

  • 接口:是代表类集的抽象数据类型。之所以定义多个接口,是为了以不同的方式操作集合对象。

    例如:Collection、List、Set、Map、Queue等。

  • 实现(类):是类集接口的具体实现。从本质上讲,它们是可重复使用的数据结构。

    例如:ArrayList、LinkedList、HashSet、HashMap。

  • 算法:是实现类集接口的对象里的方法执行的一些有用的计算。

    例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。

部分类集框架体系如图:
50_1.png

类集的关系框架图:
50_2.png

常用类集

下面较为常用的方法我都用粗体标识了,希望大家注意。
下面的类都是集合,即 一组数据,而不是单一的一个。

Collection接口

Collection:集合

方法 返回类型 描述 备注
add(E o) boolean 向集合中插入对象
addAll(Collection<? extends E> c) boolean 将一个集合的内容插入进来
clear() void 清除此集合中的所有元素
contains(Object o) boolean 判断某一个对象是否在集合中存在
containsAll(Collection<?> c) boolean 判断某一组对象是否在集合中存在
equals(Object o) boolean 对象比较
hashCode() int 哈希码
isEmpty() boolean 集合是否为空
iterator() Iterator<E> 为Iterator接口实例化
remove(Object o) boolean 删除指定对象
removeAll(Collection<?> c) boolean 删除一组对象
retainAll(Collection<?> c) boolean 保存指定内容
size() int 求出集合的大小
toArray() Object[] 将一个集合变为对象数组
toArray(E[] a) <E> E[] 指定好返回的对象数组类型

在一般的开发中,往往很少直接使用Collection接口进行开发,基本思都是使用其子接口。

子接口主要有:List、Set、Queue、SortedSet。

List接口

List:线性表

方法 返回类型 描述 备注
get(int index) E 返回指定位置的元素
indexOf(Object o) int 查找指定元素的位置
set(int index, E element) E 替换指定位置的元素
remove(int index) E 按指定的位置删除元素
add(int index, E element) void 在指定位置增加元素
addAll(int index, Collection<? extends E> c) boolean 在指定位置增加一组元素
lastIndexOf(Object o) int 从后往前查找指定元素的位置
listIterator() ListIterator<E> 为ListIterator接口实例化
subList(int fromIndex, int toIndex) List<E> 取出集合中的子集合

ArrayList

ArrayList:数组

方法 返回类型 描述 备注
get(int index) E 返回指定位置的元素
indexOf(Object o) int 查找指定元素的位置
set(int index, E element) E 替换指定位置的元素
remove(int index) E 按指定的位置删除元素
add(int index, E element) void 在指定位置增加元素
addAll(int index, Collection<? extends E> c) boolean 在指定位置增加一组元素
lastIndexOf(Object o) int 从后往前查找指定元素的位置
listIterator() ListIterator<E> 为ListIterator接口实例化
subList(int fromIndex, int toIndex) List<E> 取出集合中的子集合

注意:一般用List接口实例化ArrayList类,即 List<String> all = new ArrayList<String>();

原因:编程是要面向对象编程,针对抽象(接口),而非具体。List 是接口,ArrayList是实现。
这是一种很好的设计模式.一个接口有多种实现,这种写法是java面向对象的一种思想,依赖倒置原则,即 依赖于抽象不依赖于实现(具体)。
从Java语法上,这种方式是使用接口引用指向具体实现,这样大大提高了代码使用的灵活性。
比如,你若希望用LinkedList的实现来替代ArrayList的话,只需改动一行即可。

LinkedList

LinkedList:链表

方法 返回类型 描述 备注
addFirst(E o) void 在链表开头增加元素
addLast(E o) void 在链表结尾增加元素
offer(E o) boolean 将指定元素增加到链表的结尾
removeFirst() E 删除链表的第一个元素
removeLast() E 删除链表的最后一个元素

输出

Iterator

Iterator:迭代输出

方法 返回类型 描述 备注
hasNext() boolean 判断是否有下一个值 是否有下一个
next() E 后移取出当前元素 取出
remove() void 移除当前元素 移除

注意:Iterator是从头节点(无数据)开始的,而不是第一个有效节点,所以我们用hasNext()判断是否有值,next()来取值。

例子:

List<String> all = new ArrayList<String>(); //实例化List接口
all.add("hello");
all.add("_");
all.add("world");

Iterator<String> iter = all.iterator(); //直接实例化Iterator接口

while(iter.hasNext()) {
    System.out.print(iter.next() + "、");
}

程序运行结果:

hello、_、world、

ListIterator

ListIterator:双向迭代输出

方法 返回类型 描述 备注
remove() void 移除当前元素
add(E o) void 将指定元素增加集合
hasNext() boolean 判断是否有下一个值
next() E 取出当前元素
nextIndex() int 返回下一个元素的索引号
hasPrevious() boolean 判断是否有上一个元素
previous() E 取出当前元素
previousIndex() int 返回上一个元素的索引号
set(E o) void 替换元素

例子:

List<String> all = new ArrayList<String>();
all.add("hello");
all.add("_");
all.add("world");

ListIterator<String> iter = all.listIterator(); // 实例化ListIterator接口

System.out.print("由前向后输出:");
while(iter.hasNext()) {
    String s = iter.next();
    System.out.print(str + "、");
}

System.out.print("由后向前输出:");
while(iter.hasPrevious()) {
    String s = iter.previous();
    System.out.print(str + "、");
}

程序运行结果:

由前向后输出:hello、_、world、
由后向前输出:world、_、hello、

foreach

格式:对象遍历集合数组

for(类 对象: 集合数组) {
    //操作
}

例子:

List<String> all = new ArrayList<String>();
all.add("hello");
all.add("_");
all.add("world");

for(String s: all) {
    System.out.print(s + "、");
}

程序运行结果:

hello、_、world、

Stack

Stack:栈

方法 返回类型 描述 备注
empty() boolean 测试栈是否为空 检查是否空
push(E item) E 入栈 入栈
pop() E 出栈,同时删除 出栈
peek() E 查看栈顶,但不删除 栈顶
search(Object o) int 在栈中查找 查找

例子:

Stack<String> s = new Stack<String>();
s.push("A");
s.push("B");
s.push("C");

System.out.print(s.pop + '、');
System.out.print(s.pop + '、');
System.out.print(s.pop + '、');

程序运行结果:

C、B、A、

Queue

Queue:队列
作为一个接口,它没有实现任何具体功能(都是抽象方法),所以我们只能用其他的类来实现Queue接口。

LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用
Queue<String> queue = new LinkedList<String>();

队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。

方法 返回类型 描述 备注
offer(E o) boolean 将指定元素增加到队尾 如果队列已满,则返回false
poll() E 找到并删除队头 (获取)如果队列为空,则返回null
peek() E 找到但不删除队头 (读取)如果队列为空,则返回null
add(E o) void 将指定元素增加到队尾 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove() E 找到并移除队头 (移除本应有的)如果队列为空,则抛出一个NoSuchElementException异常
element() E 找到队头 (找到本应有的元素)如果队列为空,则抛出一个NoSuchElementException异常
  • offer,add 区别:
    一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。
    这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。
  • poll,remove 区别:
    remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似, 但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。
  • peek,element区别:
    element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。

注意:add()和remove()是继承于Collection类的,所以我们尽量用前三个方法来操作队列。

例子:

注意:Queue接口是用LinkedList类实现的,Queue<String> queue = new LinkedList<String>();

Queue<String> queue=new LinkedList<String>();
queue.offer("Hello");
queue.offer("World!");
queue.offer("你好!");

System.out.println(queue.size());

for(String str: queue){
    System.out.printf(str + " ");
}
System.out.printf("\n");

System.out.println(queue.size());
String str;

while((str=queue.poll()) != null) {
    System.out.printf(str + " ");
}
System.out.println();
System.out.println(queue.size());

程序运行结果:

3
Hello World! 你好!
3
Hello World! 你好!
0

Set

Set:集合(无序、不重复)

Set可以用于去掉重复元素,遇到重复元素不准加入。

方法 返回类型 描述 备注
add(E o) boolean 向集合中插入对象
addAll(Collection<? extends E> c) boolean 将一个集合的内容插入进来
clear() void 清除此集合中的所有元素
contains(Object o) boolean 判断某一个对象是否在集合中存在
containsAll(Collection<?> c) boolean 判断某一组对象是否在集合中存在
equals(Object o) boolean 对象比较
hashCode() int 哈希码
isEmpty() boolean 集合是否为空
iterator() Iterator<E> 为Iterator接口实例化
remove(Object o) boolean 删除指定对象
removeAll(Collection<?> c) boolean 删除一组对象
retainAll(Collection<?> c) boolean 保存指定内容
size() int 求出集合的大小
toArray() Object[] 将一个集合变为对象数组
toArray(E[] a) <E> E[] 指定好返回的对象数组类型

Set和List的区别:

1、 Set 接口实例存储的是无序的,不重复的数据。
List 接口实例存储的是有序的,可以重复的元素。
2、 Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。
3、 List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector>。

Map

Map:映射(键值对表)(一组键值对,不是单一的一个)

Map接口定义的集合又称为查找表,用于存储所谓“key-value”映射对。
Key可以看成是Value的索引,作为key的对象在集合中不可重复。

注意:是集合,查找表,即 一组键值对,不是单一的一个。

与Collection类似,如果想要使用Map接口也必须依靠其子类实例化。Map 接口中常用的子类介绍如下:

  • HashMap:无序存放的,是新的操作类,key不允许重复。(常用
  • Hashtable:无序存放的,是旧的操作类,key不允许重复。
  • TreeMap:可以排序的Map集合,按集合中的key排序,不允许key重复。
  • WeakHashMap:弱引用的Map集合,当集合中的某些内容不再使用时清除掉无用的数据,使用gc进行回收。
  • IdentityHashMap:key可以重复的Map集合。

文章永久链接:https://tech.souyunku.com/20017

未经允许不得转载:搜云库技术团队 » 【Java】(机考常用)类集

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们