链表和哈希Set

1 LinkedList集合类

LinkedList集合类底层是使用双向链表实现的,相较于ArrayList,更方便进行增删操作。

在增删查改方面,新增了头尾操作,比如从头部插入、尾部插入、头部删除、尾部删除、头部查询和尾部查询等操作。由于有头尾的引用地址,链表对于头尾进行操作效率很高。

节点Node的代码:

java 复制代码
private static class Node<E>{
	E item; //数据元素
	Node<E> next;
	Node<E> prev;

	//构造器
	Node(E item, Node<E> next, Node<E> prev){
		this.item = item;
		this.next = next;
		this.prev = prev;
	}
}

源码分析

add(int index): 需要先查找对应node的位置

remove(int index):同样需要循环查找位置

但是在头尾进行增删查改没有循环,时间复杂度是常量级的,效率很高。

队列和栈

队列:先进先出,应用:消息队列

栈: 后进先出, 应用:jvm方法栈

栈和队列图形化网址:http://www.rmboot.com

可以使用链表来实现栈和队列。

2. HashSet集合类

该集合类的主要作用是去除重复元素。要实现该效果,需要元素对象类的equals和hashCode方法。

2.1 使用

  • 新建HashSet对象
java 复制代码
Set<Student> set = new HashSet<>();
  • 重写学生对象的equals和hashCode方法
bash 复制代码
  @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
  • 遍历所有元素
bash 复制代码
for (Student student : hashSet) {
     System.out.println(student);
}

HashSet集合判断两个元素相等的标准:

  • 先通过hashCode来比较;
  • 再通过equals来比较是否相等

3. LinkedHashSet子类

HashSet的子类,底层是哈希表+双向链表实现的。元素特点为:

  • 元素唯一,有序。
  • 物理上先按照哈希表存储,然后使用链表来记录元素的顺序。
  • 由于需要维护链表,性能上略低于HashSet。

4. TreeSet类

Set抽象类的子类,底层是红黑树实现的,是一棵相对平衡的二叉搜索树。TreeSet会对元素进行排序,故集合内的对象必须实现Comparable接口或者在创建集合时传入一个comparator比较器。否者会报出classCastException, 因为集合默认存放的元素可以比较。

特点为:

  • 元素唯一,无序,但是实现了排序,遍历打印时已经排序好了。
java 复制代码
Set<Integer> set = new TreeSet<Integer>();
set.add(3);
set.add(2);
set.add(4);

//遍历
for(Integer i : set){
	System.out.println(i);//2 3 4
}

注意在对自定义类实现Comparable接口时,可以使用泛型来指明CompareTo方法参数中的类型。

元素排序原理:要求元素必须可以比较大小。

  • 集合元素实现Comparable接口
  • 创建集合时传入Comparator比较器

5. Map顶层接口初步认识

map<key, value>, 其中key不可以重复, value可以是重复。key只能指向一个value。

分类:LinkedMap、 TreeMap、HashMap

常用方法:

  • 创建
java 复制代码
//创建map
Map<String, String> map = new HashMap<>();
  • 添加元素
java 复制代码
//如果添加时覆盖了其他元素,返回被覆盖的值
//没有覆盖时,返回null
value = map.put(key, value);
  • 删除元素
java 复制代码
map.clear();//清空集合
value = map.remove(key);//通过key来删除元素,返回的是value
  • 查询元素
java 复制代码
String value = map.get(key);//根据key返回对应的value
map.containsKey(key);//是否包含该关键字
map.containsValue(value);
map.isEmpty();//判断是否为空
map.keySet();//返回所有的Key
map.values();//获取所有的values
map.entrySet();//获取所有的键值对
//通过key来获取对应的值,如果没有对应的key,就设置默认值
map.getOrDefault(Object key, V defaultValue);
相关推荐
全栈凯哥1 小时前
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
java·算法·leetcode·链表
全栈凯哥1 小时前
Java详解LeetCode 热题 100(27):LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)详解
java·算法·leetcode·链表
SuperCandyXu2 小时前
leetcode2368. 受限条件下可到达节点的数目-medium
数据结构·c++·算法·leetcode
lyh13442 小时前
【SpringBoot自动化部署方法】
数据结构
MSTcheng.3 小时前
【数据结构】顺序表和链表详解(下)
数据结构·链表
慢半拍iii3 小时前
数据结构——F/图
c语言·开发语言·数据结构·c++
m0_637146934 小时前
零基础入门 C 语言基础知识(含面试题):结构体、联合体、枚举、链表、环形队列、指针全解析!
c语言·开发语言·链表
iceslime4 小时前
旅行商问题(TSP)的 C++ 动态规划解法教学攻略
数据结构·c++·算法·算法设计与分析
John Song6 小时前
Redis 集群批量删除key报错 CROSSSLOT Keys in request don‘t hash to the same slot
数据库·redis·哈希算法
witton6 小时前
美化显示LLDB调试的数据结构
数据结构·python·lldb·美化·debugger·mupdf·pretty printer