链表和哈希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);
相关推荐
kitesxian11 分钟前
Leetcode448. 找到所有数组中消失的数字(HOT100)+Leetcode139. 单词拆分(HOT100)
数据结构·算法·leetcode
做人不要太理性36 分钟前
【C++】深入哈希表核心:从改造到封装,解锁 unordered_set 与 unordered_map 的终极奥义!
c++·哈希算法·散列表·unordered_map·unordered_set
薯条不要番茄酱2 小时前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea
盼海4 小时前
排序算法(五)--归并排序
数据结构·算法·排序算法
‘’林花谢了春红‘’9 小时前
C++ list (链表)容器
c++·链表·list
搬砖的小码农_Sky10 小时前
C语言:数组
c语言·数据结构
先鱼鲨生12 小时前
数据结构——栈、队列
数据结构
一念之坤12 小时前
零基础学Python之数据结构 -- 01篇
数据结构·python
IT 青年12 小时前
数据结构 (1)基本概念和术语
数据结构·算法
熬夜学编程的小王12 小时前
【初阶数据结构篇】双向链表的实现(赋源码)
数据结构·c++·链表·双向链表