链表和哈希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);
相关推荐
泉崎22 分钟前
11.7比赛总结
数据结构·算法
有梦想的咸鱼_23 分钟前
go实现并发安全hashtable 拉链法
开发语言·golang·哈希算法
你好helloworld23 分钟前
滑动窗口最大值
数据结构·算法·leetcode
JSU_曾是此间年少2 小时前
数据结构——线性表与链表
数据结构·c++·算法
sjsjs112 小时前
【数据结构-合法括号字符串】【hard】【拼多多面试题】力扣32. 最长有效括号
数据结构·leetcode
blammmp3 小时前
Java:数据结构-枚举
java·开发语言·数据结构
昂子的博客3 小时前
基础数据结构——队列(链表实现)
数据结构
lulu_gh_yu4 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
~yY…s<#>5 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode
XuanRanDev6 小时前
【每日一题】LeetCode - 三数之和
数据结构·算法·leetcode·1024程序员节