简简单单复习一哈ArrayList和Arrays.asList()

红烧土豆泥 等级 1592 0 0
标签:

1、面向对象补充(详见面试补充) 基于JDK11

静态代码块 > 非静态代码块 > 无参/有参构造

在同一次编译运行时,静态代码块只会被调用一次

List

ArrayList (数组,初始容量为10)

注:

除了通过 Iterator 自己的remove或add方法,迭代器将抛出ConcurrentModificationException 。 因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒着任意、非确定性行为的风险。

可被序列化,线程不安全

安全的List集合:

CopyOnWriteArrayList:官方解释意思大概为(由百度翻译)

ArrayList线程安全变体,其中所有可变操作( add 、 set等)都是通过制作底层数组的新副本来实现的。
这通常成本太高,但当遍历操作大大超过突变时可能比替代方法更有效,并且当您不能或不想同步遍历时很有用,但需要排除并发线程之间的干扰。 “快照”样式的迭代器方法使用对创建迭代器时数组状态的引用。 这个数组在迭代器的生命周期内永远不会改变,所以干扰是不可能的,并且迭代器保证不会抛出ConcurrentModificationException 。 自创建迭代器以来,迭代器不会反映对列表的添加、删除或更改。 不支持迭代器本身的元素更改操作( remove 、 set和add )。 这些方法抛出UnsupportedOperationException 。
允许所有元素,包括null 。
内存一致性影响:与其他并发集合一样,在将对象放入CopyOnWriteArrayList之前线程中的操作发生在另一个线程中从CopyOnWriteArrayList访问或删除该元素之后的操作之前。

Collections.synchronizedList(list);

ArrayList容量增加策略,>>1,右移一位除以2,即新容量在OldCapacity的基础上加OldCapacity的一半

/**
     * Returns a capacity at least as large as the given minimum capacity.
     * Returns the current capacity increased by 50% if that suffices.
     * Will not return a capacity greater than MAX_ARRAY_SIZE unless
     * the given minimum capacity is greater than MAX_ARRAY_SIZE.
     *
     * @param minCapacity the desired minimum capacity
     * @throws OutOfMemoryError if minCapacity is less than zero
     */
    private int newCapacity(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity <= 0) {
            if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
                return Math.max(DEFAULT_CAPACITY, minCapacity);
            if (minCapacity < 0) // overflow
                throw new OutOfMemoryError();
            return minCapacity;
        }
        return (newCapacity - MAX_ARRAY_SIZE <= 0)
            ? newCapacity
            : hugeCapacity(minCapacity);
    }

最大容量默认为Integer的最大值为2的31次方-1 -8

/**
     * The maximum size of array to allocate (unless necessary).
     * Some VMs reserve some header words in an array.
     * Attempts to allocate larger arrays may result in
     * OutOfMemoryError: Requested array size exceeds VM limit
     */
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

如果容量超过了这个值,则会使用Integer的最大值

private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE)
            ? Integer.MAX_VALUE
            : MAX_ARRAY_SIZE;
    }

List在对容量进行动态增加时,使用的是数组copy

Arrays.copyOf(elementData, size)
System.arraycopy(elementData, 0, a, 0, size);

补:数组Copy

Arrays.copyOf:

System.arraycopy:

LinkedList(链表 -> 双向链表)

注:

除了通过 Iterator 自己的remove或add方法,迭代器将抛出ConcurrentModificationException 。 因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒着任意、非确定性行为的风险。

Arrays

注意点:arrays.asList()

/**
 * 不能对Arrays.asList转换成的List进行remove或者add操作,否则会报一个异常
 * Exception in thread "main" java.lang.UnsupportedOperationException
 * 原因好像是因为Object的转换
 * 调用流程
 * @SafeVarargs
 *  @SuppressWarnings("varargs")
 *  public static <T> List<T> asList(T... a) {
 *      return new ArrayList<>(a);
 * }
 * ArrayList(E[] array) {
 *         a = Objects.requireNonNull(array);
 * }
 * public static <T> T requireNonNull(T obj) {
 *  if (obj == null)
 *      throw new NullPointerException();
 *  return obj;
 * }
 */
收藏
评论区

相关推荐

1 手写ArrayList核心源码
手写ArrayList核心源码 ArrayList是Java中常用的数据结构,不光有ArrayList,还有LinkedList,HashMap,LinkedHashMap,HashSet,Queue,PriorityQueue等等,我们将手写这些常用的数据结构的核心源码,用尽量少的代码来揭示核心原理。 下面我们来手写ArrayList的核心源码 首先
2 手写Java LinkedList核心源码
上一章我们手写了ArrayList的核心源码,ArrayList底层是用了一个数组来保存数据,数组保存数据的优点就是查找效率高,但是删除效率特别低,最坏的情况下需要移动所有的元素。在查找需求比较重要的情况下可以用ArrayList,如果是删除操作比较多的情况下,用ArrayList就不太合适了。Java为我们提供了LinkedList,是用链接来实现的,我们
从面试角度分析ArrayList源码
注:本系列文章中用到的jdk版本均为java8 ArrayList类图如下: ArrayList的底层是由数组实现的,数组的特点是固定大小,而ArrayList实现了动
说说ArrayList的扩容机制
ArrayList是List接口的实现类,它是支持根据需要而动态增长的数组。java中标准数组是定长的,在数组被创建之后,它们不能被加长或缩短。这就意味着在创建数组时需要知道数组的所需长度,但有时我们需要动态程序中获取数组长度。ArrayList就是为此而生的,但是它不是线程安全的,外ArrayList按照插入的顺序来存放数据 ①ArrayList扩容发生
HashMap的理解
HashMap在Map.Entry静态内部类实现中存储keyvalue对。HashMap使用哈希算法,在put和get方法中,它使用hashCode()和equals()方法。当我们通过传递keyvalue对调用put方法的时候, HashMap使用Key hashCode()和哈希算法来找出存储keyvalue对的索引。Entry存储在LinkedL
只需Ctrl+T,让 Excel 变身为「超级表格」
(https://imghelloworld.osscnbeijing.aliyuncs.com/d20ee220a0df038e21c47ed33c530e9d.png) 大家好,我是小五 最近发现好多软件号写起了Excel文章,哈哈哈,这是咋啦?作为一个数据号,咱也分享一些Excel技巧吧。 (https://imgh
ArrayList底层
一、ArrayList集合底层数据结构1.ArrayList集合介绍List集合的可调整大小数组实现。2.数组结构介绍 增删快:每次增加删除元素,都需要更改数组长度、拷贝以及移除元素位置。 查询快:由于数组在内存中是一块连续空间,因此可以根据地址索引的方式快速获
[C#]ArrayList、string、string[]之间的转换
1、ArrarList 转换为 string\[\] :  ArrayList list new ArrayList();  list.Add("aaa");  list.Add("bbb");  string\[\] arrString (string\[\])list.ToArray(typeof( string)) ;2、string\[\] 转换
「JDK——ArrayList源码」超强解析,图文详解
ArrayList源码解析 简介ArrayList是Java集合框架中非常常用的一种数据结构。继承自AbstractList,实现了List接口。底层基于数组来实现动态容量大小的控制,允许null值的存在。同时还实现了RandomAccess、Cloneable、Serializable接口,支持快速访问、复制、序列化操作。 了解数组数组简单来说就是将所有的
简简单单复习一哈ArrayList和Arrays.asList()
1、面向对象补充(详见面试补充) 基于JDK11静态代码块 非静态代码块 无参/有参构造在同一次编译运行时,静态代码块只会被调用一次ListArrayList (数组,初始容量为10)注: 除了通过 Iterator 自己的remove或add方法,迭代器将抛出ConcurrentModificationException 。 因此,面对并
简简单单复习一哈HashMap
HashMap可被序列化,线程不安全,允许null值和null键,安全的MapCollections.synchronizedMap(): / Returns a synchronized (threadsafe) map backed by the specified map. In order to guarantee s
世道变了,面试初级Java开发会问到Arrays!!!你不会还不知道吧!
](https://shimo.im/docs/9GTP6XrJg9J88cJD/) 一、基本定义Arrays类,全路径java.util.Arrays,主要功能为操作数组,Arrays类的所有方法均为静态方法,所以调用方式全部为Arrays.方法名 二、常用方法c1. <T List<T asList(T... a)可以将数组转化为相应的list集合,但
四大内置核心函数式编程&&Lambda表达式
1. 基于Function函数式使用Lambda表达式Function:接收一个参数并返回结果的函数;R apply(T t):将此参数应用到函数中 import java.util.Arrays;import java.util.Collections;import java.util.List;import java.util.function.Fun
Stream流式处理&&Lambda表达式
高度抽象的集合数据处理 1. 使用Stream流对List进行去重、去偶数,然后查找最大值 import java.util.Arrays;import java.util.Comparator;public class Stream1 public static void main(String[] args) int max A
Java 集合遍历与循环多种方式
前言Java中集合是非常常用非常重要的 ,应用是十分广泛的,作为集合这种数据结构,遍历循环方式也有很多种我们可以梳理总结不同的遍历方式,方便理解和运用 List 遍历方式1. List继承了Collection,是有序的列表。2. 实现类有ArrayList、LinkedList、Vector、Stack等 1. ArrayList是基于数组实现的,是