Java 基础回顾-5:容器类

【微信小程序 | 实战开发】常用的视图容器类组件介绍和使用(1) 小程序中的组件也是由宿主环境提供的开发者可以基于组件快速搭建出漂亮的页面结构。 3. view组件的基本使用 4. scroll-view组件的基本使用 5. swiper和swiper-item组件的基本使用 6. swiper组件常用属性 阅读详情

0、基础

数组的效率比容器高,但是我们应该优先选择容器而不是数组,只有在已证明性能成为问题时,才应该将程序重构为使用数组。

1、容器的框架

下面是 Java 中的容器框架的基础关系图,

Java 容器框架的继承关系

根据容器的存储方式,我们可以将 Java 容器类划分成下面两个大类:

  1. Collection:一组独立元素的列表,它有三个子类型 List、Set 和 Queue. 它们之间的区别是 List 必须按照插入的顺序保存元素,Set 不能有重复元素,Queue 是队列性质的列表。
  2. Map:表示存储的是键值对类型的对象。

此外,还有两个工具类可以使用:Arrays 和 Collections. 前者提供了适用于数组类型的一系列静态工具方法,后者提供了许多适用于各种类型的静态工具方法。

2、Collection

顾名思义,它的作用效果与数学中的 “集合” 的概念是相似的。

这里给出 Java 中 Collection 接口的定义。Collection 作为框架中顶层的基接口,规定了其实现类应该实现哪些功能,

	public interface Collection<E> extends Iterable<E> {
	    int size();
	    boolean isEmpty();
	    boolean contains(Object o);
	    Iterator<E> iterator();
	
	    // 返回列表元素组成的数组
	    Object[] toArray();
	
	    // 返回列表元素组成的数组,不同的是它可以根据传入的泛型数组,返回指定类型的数组
	    <T> T[] toArray(T[] a);
	
	    boolean add(E e);
	    boolean remove(Object o);
	    boolean containsAll(Collection<?> c);
	    boolean addAll(Collection<? extends E> c);
	    boolean removeAll(Collection<?> c);
	
	    // 只保留该集合中处于c中的元素,即只保留当前集合与c的交集元素
	    boolean retainAll(Collection<?> c);
	
	    void clear();
	}

2.1 List

List 在 Collection 的基础之上又增加了几个方法。从下面的方法的定义中,我们可以看出这些方法是针对列表类型的容器定义的方法:

    boolean addAll(int index, Collection<? extends E> c);
    E get(int index);
    E set(int index, E element);
    void add(int index, E element);
    E remove(int index);
    int indexOf(Object o);
    int lastIndexOf(Object o);
    ListIterator<E> listIterator();
    ListIterator<E> listIterator(int index);
    List<E> subList(int fromIndex, int toIndex);

这里的前面的几个方法从字面意思中就可以看出大致的作用。后面的 listIterator() 方法的作用是返回一个迭代器,这个迭代器不仅能向后遍历,还能向前遍历;而 subList() 的作用是返回容器中元素的一个视图(如果在视图中添加元素,添加的元素也会反应到原来的容器上)。

subList 视图实现插入元素的具体方式是(以 ArrayList 为例):在创建 SubList(通常继承自 AbstractList,作为一个 List 实现)的时候,将外部类作为参数传入到 Sublist 的构造方法中,然后当用户调用视图的添加元素的方法的时候,它调用外部类 ArrayList 的 add() 方法,同时将元素添加到外部类容器中。(装饰器模式)

List 的一个顶层实现是 AbstractList,它是一个抽象的类,为我们实现了 List 中定义的一些方法。我们熟知的 ArrayList 和 LinkedList 是在它的基础之上拓展的。

2.1.1 ArrayList

它内部是基于 动态数组 来实现的,所以它具有数组的一些特性。比如,访问固定位置的某一元素效率比较高,而对容器中的元素查找效率比较低(需要遍历数组进行查找)。

它默认的初始容量是10,每次加入一个新的元素的时候,会将加入元素之前的容量与新加入的元素数量的和与加入元素之前的容量的 3/2 进行对比,选择较大的一个作为将要拓充到的容量。具体的调整数组大小的操作是由 System.arrayCopy() 来实现的。

至于在 ArrayList 中的删除操作,也是先将元素置为 null,之后使用动态 System.arrayCopy() 来调整数组的大小。

在 Arrays 中还有一个 ArrayList 的实现 Arrays.ArrayList,它跟这里的 ArrayList 是不同的。虽然后者也继承了 AbstractList,但是它在实现的时候没有实现 add() 等方法,所以是不能向其中添加新元素的。(不可变)

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    private static final long serialVersionUID = 8683452581122892189L;

    private static final int DEFAULT_CAPACITY = 10;

    private static final Object[] EMPTY_ELEMENTDATA = {};

    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

    transient Object[] elementData; // 数据
    
    private int size;

    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
        }
    }

    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

    // ...
}
2.1.2 LinkedList

它内部是使用双向链表来实现的,所以它的一些操作和双向链表逻辑相同。比如查找某个元素的时候需要对链表进行遍历,而插入元素的时候效率比较高。

我们可以很容易地将它改造成队列、栈或双端队列。

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, Serializable {

    transient int size = 0; // 链表大小

    transient Node<E> first; // 链表尾

    transient Node<E> last; // 链表头

    // 结点类
    private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

    // ...
}
2.1.3 Stack

队列数据结构,我们可以使用 LinkedList 来实现一个队列,但是在 Java 提供的 API 中,队列是继承自 Vector 的,而 Vector 内部使用数组来实现。这就导致了 Stack 在性能上,相比于使用链表的方式还有值得提升的地方。

public class Stack<E> extends Vector<E> {

    public Stack() {
    }

    public E push(E item) {
        addElement(item);
        return item;
    }

    public synchronized E pop() {
        E       obj;
        int     len = size();
        obj = peek();
        removeElementAt(len - 1);
        return obj;
    }

    public synchronized E peek() {
        int     len = size();
        if (len == 0) throw new EmptyStackException();
        return elementAt(len - 1);
    }

    // ...
}

Stack 与 Vector 类似,是线程安全的,实现线程安全的方式是对所有的 API 方法进行加锁。虽然可以在多线程环境中运行,但是非多线程环境下效率比较低。

2.2 Set

它不允许插入两个重复的元素。

Java 中的 Set 并没有在 Collection 的基础之上再增加新的方法。它的一个抽象基类的实现是 AbstractSet,不过在 AbstractSet 中并没有实现太多的方法。

它有几个重要的实现:

  1. TreeSet 将元素存储在红黑树数据结构中;
  2. HashSet 使用的是散列函数;
  3. LinkedHashList 使用了散列,但是看起来它使用了链表来维护元素的插入顺序。
2.2.1 HashSet

内部是借助于 HashMap 来实现的:当向 HashSet 中插入一个元素的时候,我们将插入的元素作为 HashMap 的键,一个默认的 Object 作为值插入到 HashMap 中。因为 HashMap 中不会有两个相同的键,所以在 HashSet 中就不会有两个相同的值。

HashSet 没有提供普通的 get() 方法,我们只能对其进行遍历。它在遍历的时候当然返回的是HashMap 的键的迭代器。

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable {
    static final long serialVersionUID = -5024744406713321676L;

    private transient HashMap<E,Object> map;

    private static final Object PRESENT = new Object();

    public HashSet() {
        map = new HashMap<>();
    }

    public boolean add(E e) {
        return map.put(e, PRESENT) == null;
    }

    public boolean remove(Object o) {
        return map.remove(o) == PRESENT;
    }

    // ...
}
2.2.2 TreeSet

与 HashSet 类似,它内部使用了 TreeMap 来实现自己的功能。

public class TreeSet<E> extends AbstractSet<E>
    implements NavigableSet<E>, Cloneable, java.io.Serializable {
    private transient NavigableMap<E,Object> m;

    private static final Object PRESENT = new Object();

    TreeSet(NavigableMap<E,Object> m) {
        this.m = m;
    }

    public TreeSet() {
        this(new TreeMap<E,Object>());
    }

    public boolean add(E e) {
        return m.put(e, PRESENT) == null;
    }

    public boolean remove(Object o) {
        return m.remove(o) == PRESENT;
    }

    // ...
}

3、Map

与 Collection 相似,Map 是所有的基于键值对的容器的顶层接口。下面是它内部定义的一些方法:

	public interface Map<K,V> {
	    int size();
	    boolean isEmpty();
	    boolean containsKey(Object key);
	    boolean containsValue(Object value);
	    V get(Object key);
	    V put(K key, V value);
	    V remove(Object key);
	    void putAll(Map<? extends K, ? extends V> m);
	    void clear();
	    Set<K> keySet();
	    Collection<V> values();
	    Set<Map.Entry<K, V>> entrySet();
	    interface Entry<K,V> {
	        K getKey();
	        V getValue();
	        V setValue(V value);
	        boolean equals(Object o);
	        int hashCode();
	        public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K,V>> comparingByKey() {
	            return (Comparator<Map.Entry<K, V>> & Serializable)
	                (c1, c2) -> c1.getKey().compareTo(c2.getKey());
	        }
	        public static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K,V>> comparingByValue() {
	            return (Comparator<Map.Entry<K, V>> & Serializable)
	                (c1, c2) -> c1.getValue().compareTo(c2.getValue());
	        }
	        public static <K, V> Comparator<Map.Entry<K, V>> comparingByKey(Comparator<? super K> cmp) {
	            Objects.requireNonNull(cmp);
	            return (Comparator<Map.Entry<K, V>> & Serializable)
	                (c1, c2) -> cmp.compare(c1.getKey(), c2.getKey());
	        }
	        public static <K, V> Comparator<Map.Entry<K, V>> comparingByValue(Comparator<? super V> cmp) {
	            Objects.requireNonNull(cmp);
	            return (Comparator<Map.Entry<K, V>> & Serializable)
	                (c1, c2) -> cmp.compare(c1.getValue(), c2.getValue());
	        }
	    }
	    boolean equals(Object o);
	    int hashCode();
	}

从上面我们可以看出,在 Map 接口内部,除了定义了一些常用的操作方法之外,还定义了 Map 中键值对的接口 Entry.

3.1 HashMap

因为 HashMap 的源码比较重要,而且需要很长的篇幅来进行分析,我们将其作为一个单独的文章:《Java 基础回顾-6:HashMap 源码分析》。

3.2 HashTable

相比于HashMap,HashTable的实现就显得简单得多。它内部同样自己定义了一个结点:

    private static class Entry<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        V value;
        Entry<K,V> next;
    }

而且也是采用了基于拉链法的碰撞处理机制。它定义了一个

    private transient Entry<?,?>[] table;

下面是它的根据哈希码计算数组的索引的方法:

    Entry<?,?> tab[] = table;
    int hash = key.hashCode();
    int index = (hash & 0x7FFFFFFF) % tab.length;

虽然,当插入的元素的数量超过指定的阈值的时候,它也会重新调整数组的大小。但是它的插入操作中是不存在将链表改变成红黑树的优化的。并且这里直接使用了取余的方式获取索引,不存在扰动,从而也不会强制要求容量必须为2的整数次幂。

因为它的散列的均匀性没有 HashMap 调节得那么好,所以它的性能可能会比 HashMap 要差一些。而且,它的每个方法上面都加了 sychronized 关键字进行修饰,这样虽然保证了在多线程环境中的数据一致性,但是,在非多线程环境中,无疑是一种不必要的开销。

4、同步容器

4.1 Collections.synchronizedXXX() 方法

该方法用来对指定的集合进行装饰,它使用了装饰者模式,我们看下面的一个例子

    Map m = Collections.synchronizedMap(new HashMap(...));

这里使用了一个匿名的 HashMap,因为 HashMap 不是线程安全的,但是这封装了之后返回的集合就是线程安全的了。下面我们看该 API 究竟做了什么操作:

它返回了 SynchronizedMap:

    public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
        return new SynchronizedMap<>(m);
    }

该 Map 的定义是

    private static class SynchronizedMap<K,V> implements Map<K,V>, Serializable {
        private final Map<K,V> m;     // Backing Map
        final Object      mutex;        // Object on which to synchronize

        SynchronizedMap(Map<K,V> m) {
            this.m = Objects.requireNonNull(m);
            mutex = this;
        }

        public V get(Object key) {
            synchronized (mutex) {return m.get(key);}
        }

        public V put(K key, V value) {
            synchronized (mutex) {return m.put(key, value);}
        }

        // ...
    }

在上面的代码中,我们只给出了它的一部分内容的定义,从上面我们就很容易地看出来。它实际上就是对我们定义的 Map 进行了一层包装,我们称其为装饰者模式。它的锁不是加在每个方法上面的,而是使用了粒度更小的私有锁——对每个操作,对一个全局的实例进行加锁。这样能够保证每个 put() 和 get() 方法本身是原子的和线程安全的,而实际的值的获取和插入,还是对原始的容器进行操作的。


Java 基础回顾系列文章,给你的 Java 查缺补漏:

本系列以及其他系列的文章均维护在 Github 上面:Github / Awesome-Java,欢迎 Star & Fork. 如果你喜欢这篇文章,愿意支持作者的工作,请为这篇文章点个赞?!

087、DAMO-YOLO Efficient-RepGFPN:重参数化加皇后融合加黄金分割的创新 Neck DAMO-YOLO的Efficient-RepGFPN创新性Neck结构摘要: 该结构通过三重创新提升目标检测性能: 重参数化卷积:训练时多分支(3x3卷积+1x1卷积+BN分支)提升特征表达能力,推理时合并为单路3x3卷积保证效率; 皇后融合机制:采用可学习权重对不同尺度特征进行自适应加权融合,而非简单相加,通过Softmax归一化权重实现特征选择; 黄金分割连接:优化特征金字塔层间连接方式,按比例分配相邻层特征权重(如P3:P5≈0.618:0.382),减少冗余连接噪声。 实验表明,该结构有效解决了传 阅读详情

相关推荐

常用的数据结构以及常用的算法

常用的数据结构以及常用的算法 常用数据结构 数据结构是计算机存储、组织数据的方式。 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。 数据结构往往同高效的检索算法和索引技术有关。 一、线性表 线性结构: 最常用、最简单的一种数据结构。 线性表: 典型的线性结构。基本特点是线性表中的 数据元素有序且有限。结构中: ① 存在一个唯一的被称为“第一个”的数据元素; ② 存在一个唯一的被称为“最后一个”的数据元素; ③ 除第一个元素外,每

qq_47605698的博客 1445

Java笔试题库之选题题篇(61-140题)

61.关于sleep()和wait(),以下描述错误的一项是( ) A. sleep是线程类(Thread)的静态方法,wait是Object类的方法; B. sleep不释放对象锁,wait放弃对象锁; C. sleep暂停线程、但监控状态仍然保持,结束后会自动恢复; D. wait后进入等待锁定池,只有针对此对象发出notify方法后获得对象锁进入运行状态。 解答:D sleep是线程类(Thread)的静态方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后

Dream Lad的博客 3244

Android Qcom USB Driver学习(十三)

该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) Android Qcom USB Driver学习(八) Android Qcom USB Driver学习(九)deals with the USB Power Delivery resources used by one or more ports on the basis of the local device policy the basis of the local device policy.opera

Android驱动开发 2611

查找里程————mooc《面向对象程序设计——Java语言》-(浙大翁凯)第三周编程题...

容器是现代程序设计非常基础而重要的手段。 所谓容器,就是“放东西的东西”。数组可以看作是一种容器,但是数组的元素个数一旦确定就无法改变,这在实际使用中是很大的不足。一般意义上的容器,是指具有自动增长容量能力的存放数据的一种数据结构。在面向对象语言中,这种数据结构本身表达为一个对象。所以才有“放东西的东西”的说法。 Java具有丰富的容器,Java的容器具有丰富的功能和良好的性能。...

dieshi8689的博客 867

ESP8266 + MQTT :如何实现 LED 灯的远程控制

MQTT 是轻量级的、灵活的物联网消息交换和数据传递协议,致力于为 IoT 开发人员实现灵活性与硬件/网络资源的平衡。 NodeMCU 是一个开源的物联网平台。它使用 Lua 语言编程。该平台基于eLua开源项目,底层使用ESP8266 sdk 0.9.5版本。 在此项目中我们将实现 NodeMCU(ESP8266) 与 EMQ X Cloud 运营和维护的免费公共 MQTT 服务器远程控制 LED 灯,并使用 Arduino IDE 来对 NodeMCU ESP8266 进行编程。 EMQ X Cloud

emqx_broker的博客 3356

开放自己本机的mysql允许别人连接

需要在左下角搜索记事本应用,右键以管理员身份运行,之后按照上述地址找到my.ini文件,ctrl+F搜索到[mysqld],修改或添加 bind-address 设置,将其更改为 0.0.0.0 或你的计算机的 IP 地址。打开 MySQL 的配置文件 my.ini。username和密码是第3步创建能从远程地址访问的用户和密码,ip地址是ipconfig查看的地址(前提是能ping通,才能连接该地址对应的数据库)。使用 MySQL 命令行连接到自己的数据库,并创建一个能够从远程地址访问的用户。

m0_74824687的博客 1167

java的容器类有哪些实现方式_Java基础--容器类

面试官:Java的容器类你有什么了解吗?-:额,没有用过....面试官:你肯定用过,但你没有注意过....-:应该是吧....你知道什么是容器类吗?Java容器可以说是增强程序员编程能力的基本工具,本文将与您一起理解容器类,看完之后你也许会恍然大悟,这原来就是容器类啊,一起避免面试时的尴尬!!!!1.容器的用途如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构。我们可以通过创建...

weixin_39788131的博客 212

25、BDS-3卫星信号性能与PPP-B2b增强消息完整性分析

本文对BDS-3卫星信号性能及PPP-B2b增强消息的完整性进行了系统分析。评估了MEO、IGSO和GEO卫星的轨道与时钟精度,得出BDS-3总体SISRE为0.25 m,系统完整性可覆盖99.999%的误差。分析表明SIS中断主要由时钟调整和轨道机动引起,个别卫星存在因境外监测受限导致的非计划中断。通过自研解码软件对PPP-B2b增强消息进行采集与解析,实验结果显示BDS-3和GPS的平均历元完整性率均高于98.55%,其中卫星掩码和时钟校正消息的完整性率超过99.8%。研究还发现IGSO卫星相比MEO卫

quiet的专栏 143

Java基础知识回顾第五篇 - 各种容器类的选择

    在Java实际开发中,我们会常常用到容器,那么各种容器类我们该如何进行抉择呢?在这里进行一个简单的总结。   1、对List的选择     对于随机访问的get()和set()操作,背后有数组支撑的List仅仅ArrayList稍微快一点,但是对于LinkedList,相同的操作会产生高昂的性能消耗,因为它本身就不是针对随机访问操作而设计的。     避免使用Vector,它只...

flappy tortoise 181

【从零到一】Jetson Nano上YOLOv5部署完全攻略:零基础小白也能玩转边缘AI推理

文章摘要: 本文详细介绍了在Jetson Nano边缘设备上部署YOLOv5目标检测模型的完整流程。从硬件准备、系统镜像烧录、基础环境配置,到CUDA/cuDNN验证、Python虚拟环境搭建及PyTorch安装,逐步指导开发者完成部署准备。教程兼顾理论原理与实践操作,提供Python和C++两种实现方案,并涵盖TensorRT优化、实时检测等生产级应用场景,帮助零基础开发者快速掌握边缘AI推理技术,实现高性能目标检测应用。

LXY_LOVE36的博客 367

A算法的蒙特卡洛树搜索

A*算法的蒙特卡洛树搜索 作者:禅与计算机程序设计艺术 1. 背景介绍 在人工智能和游戏开发领域,搜索算法是一个非常重要的研究方向。其中A算法和蒙特卡洛树搜索是两种广泛应用的经典算法。A算法是一种启发式搜索算法,通过评估各个节点到目标节点的启发式代价来引导搜索方向,在

AI天才研究院 1730

Java基础回顾系列-第六天-Java集合

Java基础回顾系列-Java集合集合概述集合框架的优点java.util.Collection接口方法 集合概述 Java 集合就像一种容器,可以把多个对象的引用放入容器中。 Java 集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组。 Java 集合可分为 Set、List 和 Map 三种体系: Set:无序、不可重复的集合 List:有序,可重复的集合 Map:具...

java 600

Open3D 基于法向量夹角的特征点提取

基于法向量夹角的特征点提取是一种在点云处理中用于识别表面变化显著区域的技术。通过计算点云中每个点的法向量与其邻域点法向量之间的夹角,可以判断点云表面的局部变化程度,并提取那些法向量变化较大的点作为特征点。这种方法特别适用于提取边缘、角点等关键几何特征。

纵马踏花向自由 1552

java复盘笔记(包括java基础知识、jdbc数据库连接、sql语句操作等知识)

一、java基础知识 Hello Word小程序 1)工具准备:jdk安装:jdk1.6或jdk1.7 2)环境配置:配置环境变量JAVA_HOME 3)编写Hello World代码 4)执行Hello World程序。 public class Helloword{ public static void main(String[] agres){ System.out.println("...

qq_38963095的博客 811

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

黑马程序员---------java 基础知识复习(foreach、Arrays、String、StringBuffer、容器类)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- java 基础知识复习 1、foreach语句遍历数组 2、使用Arrays类对数组进行操作 3、String/StringBuffer类的使用 4、Date/Calendar/DateForat等类的使用 5、容器类介绍 List/Set/Map ArrayList/

Maiuiie的专栏 1029

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

JUC(Lock锁、线程间通信、并发容器类、JUC强大的辅助类、Callable接口、CompletableFuture、阻塞队列、ThreadPool线程池、多线程高并发底层原理)

文章目录1. JUC概述及回顾1.1. JUC是什么?1.2. 进程和线程1.3. 并行和并发1.4. wait/sleep的区别1.5. 创建线程回顾1.6. lambda表达式1.6.1. 什么是lambda1.6.2. 案例1.6.3. 函数式接口1.6.4. 小结1.7. synchronized回顾1.8. synchronized的8锁问题2. Lock锁2.1. ReentrantLock可重入锁(递归锁)2.1.1. 测试可重入性2.1.2. 测试公平锁2.1.3. 限时等待2.1.4. R

小丁的博客 584

Java 容器 回顾

java.util容器用于管理对象的生命周期,对象与对象之间的关系;容器类中存放的都是对象的引用,而非对象本身。容器vs数组 : 数组时Java的内置数据类型,是一个线性序列,可以快速访问。一个数组创建后,其容量就固定了,并在其生命周期内不变。Java在运行时会对数组做越界检查。与容器相比,Java在编译时会做类型检查,防止插入错误类型的对象。数组效率高于容

wsh622827的专栏 614

JUC概述及回顾

在 Java 5.0 提供了 (简称JUC)包,在此包中增加了在并发编程中很常用的工具类。此包包括了几个小的、已标准化的可扩展框架,并提供一些功能实用的类,没有这些类,一些功能会很难实现或实现起来冗长乏味。参照JDK文档: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/module-summary.html** 进程:**进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系

qq_50517871的博客 452

java中的容器类

容器的作用和概览............................................................................................................ 1 Collection接口........

程序员Monkey的专栏 1254

[Java] Learning_Notes for J2SE

Java Learning-------------------------------- Java 主讲教师 : 马士兵 课程内容 * Java 基础 * 语法基础 * OO * Exception * Array * 基础类 - 常用类 * I / O Stream * Collection / Generic * Thread * TCP / U

知行天下 1371

第十四章 JDK新特性回顾

14.1、JDK5新特性回顾 自动装箱、拆箱 静态导入 增强for循环 可变参数 枚举 泛型 元数据 14.2、JDK7新特性回顾 对Java集合(Collections)的增强支持 在switch中可用String 数值可加下划线 支持二进制文字 泛型简化 异常的多个catch合并 自动资源管理 14.3、JDK8新特性回顾 Lambda表达式 函数式接口 方法引用与构造器引用 Stream API Optional容器类 接口中的默认方法与静态方法 新时间日期 API 重复注解 ...

轻松的小希 4145

Android 知识简记 快速回顾各种知识

【Android 详细知识点思维脑图(技能树)】其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

2401_86400095的博客 1656

JAVA基础知识总结(万字长文一文了解JAVA所有基础知识)(中)

这期是Java长文总结的中篇,主要总结Java中常用的类、泛型、容器相关知识。长文预警!!!容器类有两个根接口,分别是Collection和Map, Collection表示单个元素的集合,Map表示键值对的集合。Collection表示的数据集合有基本的增、删、查、遍历等方法,但没有定义元素间的顺序或位置,也没有规定是否有重复元素。List是Collection的子接口,表示有顺序或位置的数据集合,增加了根据索引位置进行操作的方法。

wxchyy的博客 2520

java 双向链表_Java多线程并发之同步容器和并发容器-第一篇

Java多线程并发之同步容器和并发容器-第一篇概述本文主要讲解在Java多线程并发开发中,集合中有哪些支持并发的的。什么是同步容器(集合),什么是并发容器(集合)?并发容器分类有哪些?每个分类都有哪些类?本文是《凯哥分享Java并发编程之J.U.C包讲解》系列教程中的第五篇。如果想系统学习,凯哥(kaigejava)建议从第一篇开始看。从本篇开始,我们就来讲解讲解Java的并发容器。大致思路:先介...

weixin_39623716的博客 196
上一篇: Java 基础回顾-7:IO 体系
下一篇: 设计模式--命令模式
开发者如是说
博客等级 码龄10年 67粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值