什么是容器?
一个容器包含了完整的运行时环境:除了应用程序本身之外,这个应用所需的全部依赖、类库、其他二进制文件、配置文件等,都统一被打入了一个称为容器镜像的包中。通过将应用程序本身,和其依赖容器化,操作系统发行版本和其他基础环境造成的差异,都被抽象掉了。
为什么要使用容器?
1.可移植性
容器提供了一种可移植的方式来打包和交付应用程序。这意味着开发人员可以在其本地机器上构建和测试应用程序,然后在云端或者其它机器上部署相同的容器。这大大简化了开发和部署的过程,提高了开发和交付速度。
2. 一致性
在一个容器中,应用程序及其所有依赖项都是在同一个环境中运行的。这意味着你可以确保应用程序在任何地方都会以相同的方式运行。此外,在容器中运行应用程序也可以帮助避免由于底层操作系统和依赖项的变化而导致的一些常见问题。
3. 可伸缩性
容器使得应用程序可以在不同的应用程序之间移动,而不会导致任何中断。这意味着你可以根据需求增加或减少容器的数量,从而动态地调整应用程序的资源。此外,容器还为应用程序提供了更好的隔离,从而能够更好地保护应用程序的性能和安全性。
4. 更高的效率
容器与传统的虚拟机相比,启动速度更快,资源占用更少,更加轻量化。这意味着你可以更快地启动和部署应用程序。此外,容器的轻量级架构还能够更好地利用硬件资源,从而提高系统的整体效率和性能
参考:为什么要使用docker容器-Docker-PHP中文网
集合类简介
Java集合就像一种容器,可以把多个对象(实际上是对象的引用,但习惯上都称对象)“丢进”该容器中。从Java 5 增加了泛型以后,Java集合可以记住容器中对象的数据类型,使得编码更加简洁、健壮。
Java集合大致可以分为两大体系,一个是Collection,另一个是Map
1.Collection:一个独立元素的序列,这些元素都服从一条或者多条规则。 List必须按照插入的顺序保存元素,而set不能有重复的元素。Queue按照排队规则来确定对象产生的顺序。
2.Map:一组成对的“键值对”对象,允许你使用键来查找值。
java.util.Collection下的接口和继承类关系简易结构图:
java.util.Map下的接口和继承类关系简易结构图:
Collection
public interface Collection<E> extends Iterable<E>
public interface List<E> extends Collection<E>
public interface Set<E> extends Collection<E>
public interface Queue<E> extends Collection<E>
List<E>的3个子类
public class ArrayList<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
Set<E> 的3个子类
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
public class TreeSet<E>
extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable
public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable
Map
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable
Java中四大容器的简介与区别
- List:特定顺序保存一组数据。
- Set:集合:不允许有重复的数据。
- Queue:队列:在一端插入数据,一端弹出数据。
- Map:关联数据,字典。存储一组(Key-Value)值。
区别如下图
java集合框架图(一)_集合框架体系图_慕城南风的博客-CSDN博客
java集合框架图(二)_集合框架对比图_慕城南风的博客-CSDN博客
ArrayList和LinkList的区别?
ArrayList(数组结构):
- 底层:基于动态数组的数据结构Object[]
-
优点:对于随机访问get和set,ArrayList实现了RandomAccess接口,所以在随机访问时效率比较高
-
缺点:添加删除的速度慢,除非是在数组末尾,因为ArrayList要移动数据。
LinkedList(链表结构):
- 底层:LinkedList基于链表的数据结构Node[]
-
优点:添加删除的速度快
-
缺点:对get和set的调用花费昂贵,不适合做查询
随机访问:
LinkedList的随机访问他是先判断location 的值是不是大于中间索引的值,如果大于从链表的后面开始查找,反之从前面开始查找;
ArrayList是直接返回。故在随机访问上面ArrayList是比LinkedList是要强的。
随机插入、删除
LinkedList的随机插入、删除,他先是找到插入点Location,然后在插入点的后面直接插入,其中还有一个加速过程,Location的值如果小于中间索引值,那么从前面开始查找,反之从后面开始查找。
ArrayList的随机插入、删除,和普通数组的插入,删除一样,他将会移动大量的数据,所以造成效率低下。故在随机插入和随机删除上来说,ArrayList的效率比不上LinkedList。
List、Set、Map 之间的区别是什么?
List、Set、Map 的区别主要体现在两个方面:元素是否有序、是否允许元素重复。
三者之间的区别,如下表:
HashMap 和 Hashtable 有什么区别?
-
存储:HashMap 运行 key 和 value 为 null,而 Hashtable 不允许。
-
线程安全:Hashtable 是线程安全的,而 HashMap 是非线程安全的。
-
推荐使用:在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用则用 ConcurrentHashMap 替代。
Comparable和Comparator区别?
Comparable接口
-
实现Comparable接口类表示这个类型的对象可以进行比较大小的。 这种可以比较大小的对象可以进行自然排序。
Comparator接口
-
比较器用于实现对象任意属性进行比较大小。
-
在排序时候可以通过指定属性比较器实现任意属性排序。
在排序时候Comparable接口用于进行自然排序,而Comparator接口进行自定义排序,自定义排序更加灵活方便而常用。
设计上Comparable不推荐使用,因为对程序本身具有侵入性。