1、Java常用容器:List,Set,Map

List:

  • 继承了Collection接口(public interface List<E> extends Collection<E> ),有序且允许出现重复值。

Set:

  • 继承了Collection接口(public interface Set<E> extends Collection<E> ),无序且不允许出现重复值。

Map:

  • 是一个使用键值对存储的容器(public interface Map<K,V> )。

2、Collection 和 Collections 的区别

Collection:

  • Collection是一个集合类的通用接口(源码:public interface Collection<E> extends Iterable<E>)。
  • 通过查看源码可以发现,其中包含的都是一些通用的集合操作接口,他的直接继承接口有List和Set。

Collections:

  • Collections是一个集合工具类(源码:public class Collections)。
  • 其中提供一系列对集合操作的静态方法,比如排序:sort(),集合安全:synchronizedCollection(),反转:reverse()等等。

3、ArrayList 和 LinkedList 的区别

ArrayList:

  • 底层数据结构是一个数组,查询效率比较高,添加删除较慢(默认添加在末尾,在指定位置添加元素效率比较低,因为需要将指定位置后续的元素都往后移位)。

LinkedList:

  • 底层数据结构是一个双向链表(prev指向前节点,next指向后节点),查询效率比较慢,添加删除比较快。

4、ArrayList 和 Vector 的区别

ArrayList:

  • 非线程安全,读取效率较高。

Vector:

  • 线程安全(源码中显示该类的方法使用了synchronized),读取效率较低(推荐使用CopyOnWriteArrayList,该类适合读多写少的场景)。

5、HashMap 和 Hashtable 的区别

HashMap:

  • 非线程安全,允许空键值,执行效率相对较高(底层使用的数据结构是数组+链表+红黑树(jdk8)或者数组+链表(jdk7))。

Hashtable:

  • 线程安全,不允许空键值,执行效率相对较低(推荐使用ConcurrentHashMap)。

6、HashMap 和 TreeMap 的使用场景

HashMap:

  • 一般情况下进行插入,删除,定位元素的话,使用HashMap(常用)。

TreeMap:

  • 如果需要使用有序的集合,推荐用TreeMap。

7、HashMap 实现原理

以put操作为例:

  • 首先会根据key的hashCode得到hash值(部分源码:return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16)),依据hash值得到该元素在数组的位置(下标),如果该位置不存在元素,则将该元素直接放入此位置上;否则判断元素是否相等,如果是,则覆盖,否则使用拉链法解决冲突(创建一个链表,先加入的放到链头,后加入的放在链尾(JDK8,JDK7插入是插到了链头),超过8位时,使用红黑树存储)。
  • 放入的元素是包含了键值对的元素,而非仅仅只有值。

8、HashSet 实现原理

以add操作为例:

  • 进入add源码(return map.put(e, PRESENT)==null),可以看到其底层是用map来实现的,只是传入的值当做了map的key,而map的value使用的是统一的PRESENT。

9、迭代器:Iterator

Iterator:

  • 是一个轻量级的对象(创建代价小),主要用来对集合进行遍历移除等操作。
  • 示例代码如下
package com.spring.test.service.demo;

import java.util.*;

/**
 * @Author: philosopherZB
 * @Date: 2019/10/1
 */
public class Demo {
    public static void main(String[] args){
        List<String> list = new ArrayList<>(5);
        for(int i=0;i<5;i++){
            list.add("Test" + i);
            System.out.println("输入:Test" + i);
        }
        //利用iterator()返回一个Iterator对象
        Iterator<String> it = list.iterator();
        //判断是否还存在元素
        while(it.hasNext()){
            //第一次调用next()会返回集合中的第一个元素,之后返回下一个
            String s = it.next();
            if("Test3".equals(s))
                //移除某个元素
                it.remove();
        }
        list.forEach(l->{
            System.out.println(l);
        });
    }
}
View Code

相关文章:

  • 2021-10-08
  • 2021-06-04
  • 2022-01-13
  • 2021-10-10
  • 2022-03-01
  • 2021-12-31
  • 2022-12-23
猜你喜欢
  • 2021-07-04
  • 2021-10-08
  • 2022-12-23
  • 2021-07-02
  • 2021-06-17
  • 2021-11-23
  • 2021-07-28
相关资源
相似解决方案