数据结构( List、Set、Map、Queue)

本文详细介绍了Java集合框架中的List、Set、Map和Queue。List中包括ArrayList、LinkedList和Vector,重点讲解了它们的特性与适用场景。Set部分探讨了HashSet和LinkedHashSet,强调了HashSet的元素唯一性和LinkedHashSet的有序性。在Map部分,HashMap、TreeMap和LinkedHashMap的特性被逐一阐述,特别是HashMap的高效与TreeMap的排序功能。最后,简要概述了Queue作为先进先出的数据结构在Java中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. List

单列元素的集合,iterator遍历,有序,可重复。

1.增:
    public void add(int index, E ele) : 将元素ele添加到index位置。
2.删:
    public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
3.改:
    public E set(int index, E ele) :用指定元素替换集合中指定位置的元素,返回值为被替换的元素。
4.查:
    public E get(int index) :返回集合中指定位置的元素。
以上所有方法都有一个"index(索引)"参数,一般是从0开始;这个索引在使用时要保证在正确的范围,否则会抛出异常;
1.1 ArrayList

线程相对不安全,无特有方法,内部数组实现(查询快,增删慢)。

    ArrayList<String> list = new ArrayList<>();
    list.add("花无缺");
    list.add("小鱼儿");
    list.add("四大恶人");
    //遍历:方式一:迭代器(for each)Collection接口
    Iterator<String> it = list.iterator();
    while(it.hasNext()){
        System.out.println(it.next());
    }
    //遍历:方式二:get(index)List接口
    for(int i = 0;i < list.size(); i++){
        System.out.println(list.get(i));
    }
1.2 LinkedList
  1. 有一些特有方法,可以模拟栈、队列;
 	1).addFirst():可以模拟进栈
    2).addLast():可以模拟排队;
    3).push():可以模拟进栈
    4).pop():从列表的开头取出,并删除一个元素;可以模拟出栈;
       poll():从列表的开头取出,并删除一个元素;可以模拟出栈;(如果列表为空,不抛异常,比较常用);
  1. 内部是“链表”实现;查询慢;增删快;

  2. 使用LinkedList模拟栈:

public class Demo {
public static void main(String[] args) {
    LinkedList<String> list = new LinkedList<>();

    //压栈
    list.push("张无忌");
    list.push("周芷若");
    list.push("赵敏");
    list.push("小昭");

    //弹栈
    while (list.size() > 0) {
        System.out.println("出栈:" + list.poll());
    }
}
1.3 Vector

线程相对安全,适合多线程,一次扩容为原来的两倍。

2 Set

除LinkedHashSet外,是无序的不可重复的单列元素的集合,无法指定获取第几个元素。

2.1 HashSet

将对象存储在HashSet之前,要先确保对象重写equals()方法和HashCode方法,去比较对象的值是否相等。

public class Demo {
public static void main(String[] args) {
    Set<Student> stuSet = new HashSet<>();

 //Student类要重写hashCode()和equals()方法
    stuSet.add(new Student("刘亦菲",18));
    stuSet.add(new Student("刘亦菲", 19));
    stuSet.add(new Student("刘亦菲", 19));

    for (Student stu : stuSet) {
        System.out.println(stu);
    }
}
2.2 LinkedHashSet
  • LinkedHashSet是Set的特例:有序的由链表 + 哈希表实现;
  • 链表:保证元素的顺序;
  • 哈希表:保证元素的唯一;
public class Demo {
public static void main(String[] args) {
    Set<String> set = new LinkedHashSet<>();

    set.add("孙悟空");
    set.add("猪八戒");
    set.add("白龙马");
    set.add("曹操");

    for (String s : set) {
        System.out.println(s);//有序的
    }
}
3 Map

双列集合,通过key-value键值对,用于保存具有映射关系的数据。

3.1 HashMap

线程相对不安全,key或value可为null,适合增删改。HashTable:相对线程安全,key或value不可为null。

3.2 TreeMap

存储key-value时,根据key对节点进行排序,所有的key-value处于有序状态,它的排序分为自然排序和定制排序。三个map中最慢,因为要排序。比较适合遍历用。

3.3 LinkedHashMap

使用链表维护key-value的次序,可以记住键值对的插入顺序。比hashmap慢,因为要维护键值对。

4 Queue

队列,先进先出,队头删除元素,队尾插入元素,线性结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jason_LS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值