JAVA刷题常用数据结构 - 集合框架

总的


JAVA集合框架图

从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。


集合框架体系

具体见:

https://www.runoob.com/java/java-collections.html

HashMap 哈希表 键值对

用法

HashMap<String, String> map = new HashMap<>(); 	
map.put("zhang", "31");//存放键值对
System.out.println(map.containsKey("zhang"));//键中是否包含这个数据
System.out.println(map.get("zhang"));//通过键拿值
System.out.println(map.isEmpty());//判空 	
System.out.println(map.size());
System.out.println(map.remove("zhang"));//从键值中删除
for (String key : map.keySet()) {
			System.out.println(key);
		}
for (String values : map.values()) {
		  System.out.println(values);
	  }

https://blog.csdn.net/wdays83892469/article/details/79615609

List接口用它的实现类ArrayList

ArrayList 动态数组

ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。但是插入、删除时都需要移动后面的元素,效率略差些。

ArrayList 继承了 AbstractList ,并实现了 List 接口。

img

用法

List<String> sites = new ArrayList<>(); // 初始化,后边的<>不用加类型,肯定是String,加了就多余了
sites.add("Google"); // add 添加元素
sites.add("Runoob");
sites.add("Taobao");
sites.add("Weibo");
sites.remove(3); // 删除第四个元素
System.out.println(sites);
System.out.println(sites.get(1));  // get 访问第二个元素
sites.set(2, "Wiki"); // set 修改元素第一个参数为索引位置,第二个为要修改的值
System.out.println(sites); // 线性打印所有元素
System.out.println(sites.size()); // size 计算ArrayList 中的元素数量
// 可以使用 for 来迭代数组列表中的元素
for (int i = 0; i < sites.size(); i++) {
  System.out.println(sites.get(i));
}
// 也可以使用 for-each 来迭代元素
for (String i : sites) {
  System.out.println(i);
}

更多用法见:

https://www.runoob.com/java/java-arraylist.html

List接口用它的实现类LinkedList 双向链表

链表实现的线性双链表,插入、删除时只需要改变前后两个节点指针指向即可,省事不少。允许元素为pull。

image-20220430191208789

链表可分为单向链表和双向链表。

一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接。

img

一个双向链表有三个整数值: 数值、向后的节点链接、向前的节点链接。

img

Java LinkedList(链表) 类似于 ArrayList,是一种常用的数据容器。

与 ArrayList 相比,LinkedList 的增加和删除的操作效率更高,而查找和修改的操作效率较低。

以下情况使用 ArrayList :

  • 频繁访问列表中的某一个元素。
  • 只需要在列表末尾进行添加和删除元素操作。

以下情况使用 LinkedList :

  • 你需要通过循环迭代来访问列表中的某些元素。
  • 需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。

其实就是想想动态数组和双链表就行~

img

LinkedList 实现了 List 接口,可进行列表的相关操作。

LinkedList 实现了 Deque 接口,可作为队列使用。

用法

LinkedList<E> list = new LinkedList<>();   // 普通创建方法
LinkedList<E> list = new LinkedList(Collection<? extends E> c); // 使用集合创建链表

上面的“Collection<? extends E> c”可用Arrays.asList()实时创建

Arrays.asList()是将数组转化成List集合的方法。

List list = Arrays.asList("a","b","c");

如果你的List只是用来遍历,就用Arrays.asList()。

如果你的List还要添加或删除元素,还是乖乖地new一个java.util.ArrayList,然后一个一个的添加元素。

https://blog.csdn.net/kzadmxz/article/details/80394351

LinkedList<String> sites = new LinkedList<String>();
sites.add("Google");
sites.add("Runoob");
sites.add("Taobao");
sites.add("Weibo");
System.out.println(sites);
sites.addFirst("Wiki"); // addFirst() 在头部添加元素
sites.addLast("Wiki");  // addLast() 在尾部添加元素
sites.removeFirst(); // removeFirst() 取头部元素并删除
sites.removeLast(); // removeLast() 取尾部元素并删除
System.out.println(sites.getFirst()); // getFirst() 获取头部元素不删除
System.out.println(sites.getLast()); // getLast() 获取头部元素不删除
// 使用 for 配合 size() 方法来迭代列表中的元素
for (int size = sites.size(), i = 0; i < size; i++) {
  System.out.println(sites.get(i));
}
// 也可以使用 for-each 来迭代元素
for (String i : sites) {
  System.out.println(i);
}

add remove 更推荐用新方法:offer poll

https://www.runoob.com/java/java-linkedlist.html

https://blog.csdn.net/cpppp66/article/details/115759578

栈和队列用Deque接口的实现类ArrayDeque

Deque是double ended queue的缩写,双端队列。

Deque 具备普通队列 FIFO 的功能,同时它也具备了 Stack 的 LIFO 功能。

ArrayDeque 是 Deque 接口的一种具体实现,是依赖于可变数组来实现的。ArrayDeque 没有容量限制,可根据需求自动进行扩容。ArrayDeque 可以作为栈来使用,效率要高于 Stack。ArrayDeque 也可以作为队列来使用,效率相较于基于双向链表的 LinkedList 也要更好一些。注意,ArrayDeque 不支持为 null 的元素。

用法

操作 Deque
添加元素到队首 offerFirst(E e)
添加元素到队尾 offerLast(E e)
队首元素并删除 E pollFirst()
队尾元素并删除 E pollLast()
队首元素但不删除 E peekFirst()
队尾元素但不删除 E peekLast()

旧方法add()、remove()、element()不推荐使用。

因为在队列满、空、空时会抛出异常,而新方法只是返回null(因此就可以在程序中进行有效的判断)。

但是如果用上isEmpty()判断语句的话 其实就可以规避这些异常。。。

总结

  • 需要链接元素到队列尾时优先用offer()
  • 查看元素优先使用peek()
  • 删除元素优先使用poll()

https://blog.csdn.net/cpppp66/article/details/115759578

因此将ArrayDeque作为队列(两头都能操作,只不过前面只能删,后面只能添)或栈(只能对一头操作)时,应用相应的方法就好啦!

image-20220430223947980

https://blog.csdn.net/SeekN/article/details/114231727

https://blog.csdn.net/lucklycoder/article/details/115381856

Set用它最主要的实现类HashSet

img

用法

Set<String> sites = new HashSet<>(); // 初始化,后边的<>不用加类型,肯定是String,加了就多余了
sites.add("Google");
sites.add("Runoob");
sites.add("Taobao");
sites.add("Zhihu");
sites.add("Runoob");  // 重复的元素不会被添加
System.out.println(sites);
sites.remove("Taobao");  // 删除元素,删除成功返回 true,否则为 false
sites.clear();  // 删除集合中所有元素
sites.size() // 计算 HashSet 中的元素数量
for (String i : sites) { // 可以使用 for-each 来迭代 HashSet 中的元素
  System.out.println(i);
}

注意:范型中的<E>只能为引用数据类型

ArrayList<E> 中的元素实际上是对象。

如果我们要存储其他类型,而<E> 只能为引用数据类型,这时我们就需要使用到基本类型的包装类。

基本类型对应的包装类表如下:

基本类型 引用类型
boolean Boolean
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character

记法:首字母大写,特别的,int->Integer,char->Character

posted @ 2022-04-30 20:35  Leventseleveil  阅读(84)  评论(0编辑  收藏  举报