常用集合的使用

概述
  • List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口

  • Set下有HashSet,LinkedHashSet,TreeSet

  • List下有ArrayList,Vector,LinkedList

  • Collection接口下还有个Queue接口,有PriorityQueue类

  • Map下有Hashtable,LinkedHashMap,HashMapTreeMap

  • Queue, Stack, Deque

Map 接口下面的集合类

 

Collection 接口下面的集合类

 

Set

Set 保证了元素唯一,同一个元素只会出现一次。

所以 Set 可以用来去除重复元素。

HashSet

 

HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时就是使用这个实现类。HashSet 是按照 Hash 算法来存储集合中的元素。因此具有很好的存取和查找性能

HashSet 具有以下特点:

  • 不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。

  • HashSet 线程不安全的,如果多个线程同时访问或修改一个 HashSet,则必须通过代码来保证其线程安全。

  • 集合元素值可以是 null。

 

 

HashSet检查相同的元素:

HashSet不存入重复元素的规则.使用hashcode和equals

把对象加入HashSet的时候,HashSet会使用对象的hashCode来判断对象加入的位置。同时也会与其他已经加入的对象的hashCode进行比较,如果没有相等的hashCode,HashSet就会假设对象没有重复出现。


如果元素的hashCode值相同,会继续使用equals 进行比较.如果 equals为true 那么HashSet认为新加入的对象重复了。如果equals 为false那么HashSet 认为新加入的对象没有重复.新元素可以存入.

小总结:

元素的哈希值是通过元素的hashcode方法 来获取的, HashSet首先判断两个元素的哈希值,如果哈希值一样,接着会比较equals方法 如果 equls结果为true ,HashSet就视为同一个元素。如果equals 为false就不是同一个元素。

 

元素一样, hashcode 一定一样,元素不一样,hashcode也有可能一样。

 

TreeSet

继承了 Set 的接口,也有Set 的特性, 同时保证了元素是有序的。

 

TreeSet 底层是由红黑树实现的,存取速度为 log。红黑树的性质保证了当前节点大于左节点,小于右节点。中序遍历一遍就是顺序结构了。

 

TreeSet 比较规则:

一、添加的元素自带比较规则

 

二、自定义元素的比较规则

  • 如果元素是类的话, 可以在类里面写比较的规则。

  • 可以写一个比较器,实现比较规则。

 

TreeSet 判断相同的元素:

就是在比较的时候判断元素是不是一样。由于红黑树的性质,最多比较 log 次就可以知道元素是不是存在。

比较器的使用可以看 https://km.sankuai.com/page/626813559

import java.util.*;

public class Person implements Comparable<Person>{
    private String name;
    private Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public int compareTo(Person o) {
        return this.age - o.age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public static void main(String[] args) {
        Person p1 = new Person("0001", 220);
        Person p2 = new Person("0002",204);
        Person p3 = new Person("0003",25);
        Person p4 = new Person("0004",211);
        Person p5 = new Person("0005",25);
      
        Set<Person> set = new TreeSet(new idComparator());
        set.add(p1);
        set.add(p2);
        set.add(p3);
        set.add(p4);
        for (Person person : set) {
            System.out.println(person.getName() + " " + person.getAge());
        }

    }
}
class idComparator implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        return o2.getAge() - o1.getAge();
    }
}

 

总结:

 

 

Map

Map 的一个元素分成两个部分,分别是 Key 和 Value。Key 是不能重复的,Value 是可以重复的。 所以Map就是保存有映射关系的数据结构。

Set 就是用了 Map 里面的 Key。

常用的方法:

1、添加:
	1、V put(K key, V value)    (可以相同的key值,但是添加的value值会覆盖前面的,返回值是前一个,如果没有就返回null)                                          
2、删除
	1、remove()    删除关联对象,指定key对象
	2、clear()     清空集合对象
3、获取
     1:value get(key); 可以用于判断键是否存在的情况。当指定的键不存在的时候,返回的是null。
     
3、判断:
	1、boolean isEmpty()   长度为0返回true否则false
  2、boolean containsKey(Object key)  判断集合中是否包含指定的key
3、boolean containsValue(Object value)  判断集合中是否包含指定的value
4、长度:
Int size()

HashMap

HashMap 底层用的是哈希表 + 链表。

如果HashCode 一样的话,后面就会跟一个链表。

 

判断key是不是存在:

同上面 HashSet 一样。

 

 

TreeMap

底层结构用的是二叉树,二叉树的遍历就可以实现排序功能。

所以元素的 Key 要有比较性质,或者写一个比较器。

import java.util.Map;
import java.util.TreeMap;

public class Demo1 {
    public static void main(String[] args) {
        Map<String, String> map = new TreeMap<>();
        map.put("444", "444");
        map.put("222", "222");
        map.put("111", "111");
        map.put("999", "999");
        map.put("100", "999");

        for (Map.Entry<String, String> StringEntry : map.entrySet()) {
            System.out.println(StringEntry.toString());
        }
    }
}

 

总结

 

List

List 是一个有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List 集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List 集合默认按元素的添加顺序设置元素的索引,第一个添加到 List 集合中的元素的索引为 0,第二个为 1,依此类推。

LinkedList

LinkedList 类采用链表结构保存对象,这种结构的优点是便于向集合中插入或者删除元素。需要频繁向集合中插入和删除元素时,使用 LinkedList 类比 ArrayList 类效果高,但是 LinkedList 类随机访问元素的速度则相对较慢。这里的随机访问是指检索集合中特定索引位置的元素。

LinkedList 的常用方法:

addFirst()可以在列表头增加元素
addLast()可以在列表尾部增加元素
getFirst()可以获取第一个元素
removeFirst()可以删除第一个元素
removeLast()可以删除最后一个元素
getFirst() 返回此列表的第一个元素
getLast() 返回此列表的最后一个元素

 

ArrayList

ArrayList 类实现了可变数组的大小,存储在内的数据称为元素。它还提供了快速基于索引访问元素的方式,对尾部成员的增加和删除支持较好。使用 ArrayList 创建的集合,允许对集合中的元素进行快速的随机访问,不过向 ArrayList 中插入与删除元素的速度相对较慢。

 

add()            可以在数组尾部增加一个元素
get(int index)   获取 index 位置的元素
indexOf()        返回此集合中第一次出现指定元素的索引,如果此集合不包含该元素,则返回 -1
lastIndexOf()    返回此集合中最后一次出现指定元素的索引,如果此集合不包含该元素,则返回 -1
set(int index, int element)            修改index 位置元素的值

 

总结

  • ArrayList
    优点: 底层数据结构是数组,查询快,增删慢。
    缺点: 线程不安全,效率高

  • LinkedList
    优点: 底层数据结构是链表,查询慢,增删快。
    缺点: 线程不安全,效率高

 

其他

队列是先进先出的。可以直接用LinkedList模拟,从队尾插入,然后从队首取出来。

栈是先进后出的。 也可以用LinkedList模拟,从队尾插入,然后从队尾取出来。

双端队列就像一个链表,队首队尾都可以插入和删除。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值