JAVA刷题常用数据结构 - 集合框架
总的
JAVA集合框架图
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。
集合框架体系
具体见:
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 接口。
用法
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);
}
更多用法见:
List接口用它的实现类LinkedList 双向链表
链表实现的线性双链表,插入、删除时只需要改变前后两个节点指针指向即可,省事不少。允许元素为pull。
链表可分为单向链表和双向链表。
一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接。
一个双向链表有三个整数值: 数值、向后的节点链接、向前的节点链接。
Java LinkedList(链表) 类似于 ArrayList,是一种常用的数据容器。
与 ArrayList 相比,LinkedList 的增加和删除的操作效率更高,而查找和修改的操作效率较低。
以下情况使用 ArrayList :
- 频繁访问列表中的某一个元素。
- 只需要在列表末尾进行添加和删除元素操作。
以下情况使用 LinkedList :
- 你需要通过循环迭代来访问列表中的某些元素。
- 需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。
其实就是想想动态数组和双链表就行~
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,然后一个一个的添加元素。
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
栈和队列用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()
因此将ArrayDeque作为队列(两头都能操作,只不过前面只能删,后面只能添)或栈(只能对一头操作)时,应用相应的方法就好啦!
Set用它最主要的实现类HashSet
用法
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