链表和哈希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);
相关推荐
Victoria.a27 分钟前
顺序表和链表(详解)
数据结构·链表
笔耕不辍cj2 小时前
两两交换链表中的节点
数据结构·windows·链表
csj502 小时前
数据结构基础之《(16)—链表题目》
数据结构
謓泽2 小时前
【数据结构】二分查找
数据结构·算法
攻城狮7号3 小时前
【10.2】队列-设计循环队列
数据结构·c++·算法
写代码超菜的4 小时前
数据结构(四) B树/跳表
数据结构
小小志爱学习5 小时前
提升 Go 开发效率的利器:calc_util 工具库
数据结构·算法·golang
egoist20235 小时前
数据结构之堆排序
c语言·开发语言·数据结构·算法·学习方法·堆排序·复杂度
吴天德少侠5 小时前
c++中的链表list
c++·链表·list
小猿_005 小时前
C语言程序设计十大排序—希尔排序
数据结构·算法·排序算法