容器

作者: d24b5d9a8312 | 来源:发表于2019-08-12 10:22 被阅读0次

1、java容器有哪些?

容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。




从 JDK 1.5 之后可以使用 foreach 方法来遍历实现了 Iterable 接口的聚合对象。


2、Collection和Collections区别

Collection是集合类的上层接口。本身是一个Interface,里面包含了一些集合的基本操作。Collection接口时Set接口和List接口的父接口。



Collections是一个集合框架的帮助类,里面包含一些对集合的排序,搜索以及序列化的操作。


List、Map、Set区别

List 是可重复集合,Set 是不可重复集合,这两个接口都实现了 Collection 父接口。

Map 未继承 Collection,而是独立的接口,Map 是一种把键对象和值对象进行映射的集合,它的每一个元素都包含了一对键对象和值对象,Map 中存储的数据是没有顺序的, 其 key 是不能重复的,它的值是可以有重复的。

HashMap HashTable区别

HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。

HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。

另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。

由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。

HashMap不能保证随着时间的推移Map中的元素次序是不变的。

TreeMap<K,V>的Key值是要求实现java.lang.Comparable,所以迭代的时候TreeMap默认是按照Key值升序排序的;TreeMap的实现也是基于红黑树结构。

如何决定使用HashMap还是TreeMap

而HashMap<K,V>的Key值实现散列hashCode(),分布是散列的均匀的,不支持排序;数据结构主要是桶(数组),链表或红黑树。

大多情况下HashMap有更好的性能,所以大多不需要排序的时候我们会使用HashMap.

HashMap实现原理

HashMap 数组(大小整成2的指数次幂,扩容乘2)、链表(超过8)-->红黑树
根据Key的值求扰乱的hashcode确定数组位置
jdk7死循环:并发扩容时,链表产生环
Jdk8 移位不会发生位置倒变,并发情况下不建议用hashmap用ConcurrentHashMap

HashSet实现原理

HashSet实际上是一个HashMap实例,都是一个存放链表的数组。它不保证存储元素的迭代顺序;此类允许使用null元素。HashSet中不允许有重复元素,这是因为HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个固定对象private static final Object PRESENT = new Object();

HashSet中add方法调用的是底层HashMap中的put()方法,而如果是在HashMap中调用put,首先会判断key是否存在,如果key存在则修改value值,如果key不存在这插入这个key-value。而在set中,因为value值没有用,也就不存在修改value值的说法,因此往HashSet中添加元素,首先判断元素(也就是key)是否存在,如果不存在这插入,如果存在着不插入,这样HashSet中就不存在重复值。

所以判断key是否存在就要重写元素的类的equals()和hashCode()方法,当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算次对象的哈希值,此哈希值决定了此对象在Set中存放的位置;若此位置没有被存储对象则直接存储,若已有对象则通过对象所在类的equals()比较两个对象是否相同,相同则不能被添加。

ArrayList LinkList区别

Arraylist动态数组
LinkList链表
随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

如何实现数组和List切换

int size=arrayList.size();
String[] a = arrayList.toArray(new String[size]);
List<String> list=Arrays.asList(a);

ArrayList和Vector区别

相同点:

1、ArrayList和Vector都是继承了相同的父类和实现了相同的接口

2、底层都是数组实现的

3、初始默认长度都为10。

不同点:
1) Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
2) 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小

Array和ArrayList区别

Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
Array大小是固定的,ArrayList的大小是动态变化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型

Queue中poll

如果队列中没有元素, poll()会返回 null,而 remove()会直接抛出 NoSuchElementException 异常。

相关文章

  • Docker入门(3)---Docker容器

    Docker 容器操作 启动容器 启动已终止容器 容器查看 停止容器 进入容器 删除容器

  • Docker容器管理

    目录 创建容器 启动容器 停止容器 进入容器 删除容器 容器迁移 1. 创建容器 docker创建容器可以用doc...

  • Docker 容器命令

    运行容器 运行Redis容器: 容器列表 停止容器 停止Redis 启动容器 停止Redis 端口映射 删除容器 ...

  • 一、容器

    (1)容器分类 <1>顺序容器(序列容器) <2>关联容器 <3>容器适配器 (2)vector容器 <1>概念 ...

  • docker容器命令

    1、查看运行的容器 2、查看所有的容器 3、创建容器 4、进入容器 5、启动容器 6、停止容器 7、删除容器 8、...

  • spring的父子容器及配置

    spring父子容器 spring总的上下文容器有父子之分,父容器和子容器。** 父容器对子容器可见,子容器对父容...

  • STL--vector、deque、list、set、map、s

    vector(向量容器) deque(双端队列容器) list(链表容器) set(集合容器) map(映射容器)

  • docker容器基本操作

    启动交互式容器 查看容器 自定义容器的名字 重启启动停止的容器 删除停止的容器 守护式容器 什么是守护式容器: 能...

  • 面试知识点(5)STL

    容器类型 STL容器主要分为 顺序容器 vector(向量容器) deque(双端队列容器) list(双向链...

  • 标准模板库(容器)

    vector 向量容器 List 容器 map 容器

网友评论

      本文标题:容器

      本文链接:https://www.haomeiwen.com/subject/guvljctx.html