Notes 14 day14 集合

Java集合框架:Set与Map接口详解,
文章详细介绍了Java中的Set集合接口,包括其无序和唯一性的特点,以及HashSet、LinkedHashSet和TreeSet的具体实现和数据结构。同时,讨论了Map集合,如HashMap和TreeMap,强调了它们的特点和遍历方式,以及线程安全的考虑。还提到了保证元素唯一性的关键方法hashCode()和equals()。

day14 集合

Set集合

概述

java.util.Set接口和java.util.List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。

Set集合的特点

无序,唯一,无索引

HashSet集合

底层是HashMap的底层

特点

无序,唯一,无索引

如何保证Hashset集合唯一?

底层依赖 两个方法:hashCode()和equals()。 步骤: 首先比较哈希值 如果相同,继续走,比较地址值或者走equals() 如果不同,就直接添加到集合中 按照方法的步骤来说: 先看hashCode()值是否相同 相同:继续走equals()方法 返回true: 说明元素重复,就不添加 返回false:说明元素不重复,就添加到集合 不同:就直接把元素添加到集合 如果类没有重写这两个方法,默认使用的Object()。一般来说一样。 而String类重写了hashCode()和equals()方法,所以,它就可以把内容相同的字符串去掉。只留下一个。

HashSet集合存储数据的结构

  • JDK8之前:数组+链表(哈希表)

  • JDK8之后:数组+链表+红黑树(哈希表)

哈希表图示

 

LinkedHashSet

底层是 LinkedHashMap的底层

特点

唯一,有序,无索引

数据结构

哈希表+双链表

双向链表优缺点

1、优点:查询方便,可以找到前驱和后继,可进可退;

2、缺点:增加删除节点复杂,多需要分配一个指针存储空间

TreeSet

底层是 TreeMap 的底层

特点

唯一,无索引,有序(通过自然排序进行排序)

数据结构

二叉查找树

二叉树的遍历方式

前序遍历、中序遍历、后序遍历

前序:根 左 右

中序:左 根 右

后续:右 根 左

TreeSet 默认 中序遍历

比较器排序

自己定义的类比较来使用

Comparable

Comparable<T> 是一个内部有比较器

实现Comparable接口 重写 comparaTo 方法

   TreeSet<Student> ts = new TreeSet<Student>();
   Student s1 = new Student("b",23);
    Student s2 = new Student("a",23);
    ts.add(s1);
    ts.add(s2);
public class Student implements  Comparable<Student>{
     @Override
    public int compareTo(Student s) {
        //按照年龄排序 ,主要条件
        int num = this.age - s.age;//年龄相同就不存储
        int num2 = num == 0 ? this.name.compareTo(s.name) : num ;//年龄相同的的时同,比较一下名是否相同
        return num2;
    }
}

缺点

需要修改原代码,不符合OCP(对修改关闭,对扩展打开)原则

Comparator

Comparator<T> 可以看成一个外部比较器

需要单独创建一个类实现Comparator接口 重写 compara方法

 TreeSet<Student> ts = new TreeSet<Student>(new MyComparator());
        Student s1 = new Student("b",23);
        Student s2 = new Student("a",23);
​
public class MyComparator implements Comparator<Student> {
    @Override
    public int compare(Student s1, Student s2) {
        // 姓名长度
        int num = s1.getName().length() - s2.getName().length();
        // 姓名内容
        int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
        // 年龄
        int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
        return num3;
​
}
​
}

注意

二者比较器重写 返回值类型:int 等于0 表示相等不排序 大于> 0(右子树)表示升序 小于< 0(左子树)表示是降序

支持使用内部比较器的集合

TreeMap 、TreeSet

支持使用外部比较器的集合有

TreeMap 、TreeSet

ArrayList、LinkedList

后二者需要通过用 Collections.sort()来使用

举例

public class ExternalComparatorExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");
        list.add("Kiwi");
​
        Collections.sort(list, new LengthComparator());
​
        for (String fruit : list) {
            System.out.println(fruit);
        }
    }
      
    static class LengthComparator implements Comparator<String> {
        @Override
        public int compare(String o1, String o2) {
            return Integer.compare(o1.length(), o2.length());
        }
    }
}

Map集合

概述

身份证号与个人这种一一对应的关系,就叫做映射。专门存储这种映射的结合就是Map集合

Map与Collection集合区别

Collection集合

单列集合,一次只能添加一个元素
有的是有索引,有的没有索引
有的集合可以存储重复的元素,有的则不可以
有的元素是无序的,有的是有序的

Map集合

Map集合是双列集合,由Key和Value组成
Key是不允许重复的,Value是允许重复
Key允许存null值的,但是HashTable除外,但是只能存储唯一的一个
无索引

HashMap集合

特点

key唯一,无序,不重复,key和value允许为空

无索引

数据结构

数组+链表+红黑树(哈希表)

常用方法

方法名说明
public V put(K key, V value)把指定的键与指定的值添加到Map集合中。
public V remove(Object key)把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
public V get(Object key)根据指定的键,在Map集合中获取对应的值。
boolean containsKey(Object key)判断集合中是否包含指定的键。
public Set<K> keySet()获取Map集合中所有的键,存储到Set集合中。
public Set<Map.Entry<K,V>> entrySet()获取到Map集合中所有的键值对对象的集合(Set集合)。

value() 获取到Map集合中的所有值,存储到Collection集合中

LinkedHashMap 集合

概述

LinkedHashMapHashMap的一个子类,底层实现基本上和HashMap一样,只是在原来的单链表的基础上改成了双向链表,这样做的目的是为了让它能够实现插入数据的排序。也就是说如果遍历整个LinkedHashMap时,是会按照插入数据的顺序来遍历数据的

特点

key值唯一,不重复

key值有序

无索引

数据结构

数组+红黑树+双向链表

TreeMap

特点

key值 排序 唯一 无索引

数据结构

红黑树,可以保证键的排序和唯一

Map集合的遍历

第一种

通过 keyset() 方法 返回一个 Set 集合对象

可以用增强for 或者 Iterator迭代器来遍历 key值,然后通过key值得到value值

第二种

通过 entrySet() 方法 返回一个 Set 集合对象

可以用增强for 或者 Iterator迭代器来遍历 键值对 ,然后通过键值对调用 getKey() 方法返回 键值对中的key

,或者通过调用键值对中的 getValue() 方法,得到 键值对中的value值

第三种

通过 value() 方法 返回一个 Colletion 集合对象

可以用增强for 或者 Iterator迭代器来遍历 value值

HashMap和Hashtable的区别?

  • * Hashtable:线程安全,效率低。不允许null键和null值
    * HashMap:线程不安全,效率高。允许null键和null值
    * 
    * 2:List,Set,Map等接口是否都继承子Map接口?
    * List,Set不是继承自Map接口,它们继承自Collection接口
    * Map接口本身就是一个顶层接口
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值