arraylist

深入Java集合学习系列:ArrayList的实现原理

蓝咒 提交于 2020-01-22 00:31:26
http://zhangshixi.iteye.com/blog/674856 1. ArrayList概述: ArrayList是List接口的可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。 每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长。自动增长会带来数据向新数组的重新拷贝,因此,如果可预知数据量的多少,可在构造ArrayList时指定其容量。在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量,这可以减少递增式再分配的数量。 注意,此实现不是同步的。如果多个线程同时访问一个ArrayList实例,而其中至少一个线程从结构上修改了列表,那么它必须保持外部同步。 2. ArrayList的实现: 对于ArrayList而言,它实现List接口、底层使用数组保存所有元素。其操作基本上是对数组的操作。下面我们来分析ArrayList的源代码: 1) 底层使用数组实现: Java代码 private transient Object[] elementData; 2) 构造方法:

ArrayList实现原理分析

牧云@^-^@ 提交于 2020-01-22 00:15:17
ArrayList使用的存储的数据结构 ArrayList的初始化 ArrayList是如何动态增长 ArrayList如何实现元素的移除 ArrayList小结 ArrayList是我们经常使用的一个数据结构,我们通常把其用作一个可变长度的动态数组使用,大部分时候,可以替代数组的作用,我们不用事先设定ArrayList的长度,只需要往里不断添加元素即可,ArrayList会动态增加容量。ArrayList是作为List接口的一个实现。 那么ArrayList背后使用的数据结构是什么呢? ArrayList是如何保证动态增加容量,使得能够正确添加元素的呢? 要回答上面的问题,我们就需要对ArrayList的源码进行一番分析,深入了解其实现原理的话,我们就自然能够解答上述问题。 需要说明的是,本文所分析的源码引用自JDK 8版本 ArrayList使用的存储的数据结构 从源码中我们可以发现,ArrayList使用的存储的数据结构是Object的对象数组。 其实这也不能想象,我们知道ArrayList是支持随机存取的类似于数组,所以自然不可能是链表结构。 /** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the

API - 03

一个人想着一个人 提交于 2020-01-21 23:56:27
API (Application Programming Interface),应用程序编程接口。 Scanner 一个可以解析基本类型和字符串的简单文本扫描器。 例如,以下代码使用户能够从 System.in 中读取一个数: sc.nextInt(); sc.next(); Random 此类的实例用于生成伪随机数。 ArrayList 是大小可变的数组的实现,存储在内的数据称为元素。ArrayList 中可不断添加元素,其大小也自动增长。 java.util.ArrayList <E> :<E> ,表示一种指定的数据类型,叫做泛型。 E ,取自Element(元素)的首字母。在出现 E 的地方,我们使用一种引用数据类型将其替换即可. 成员方法: public boolean add(E e); public E remove(int index); public E get(int index); public int size(); ArrayList对象不能存储基本类型,只能存储引用类型的数据。 String 特点: 1. 字符串不变:字符串的值在创建后不能被更改。 2. 因为String对象是不可变的,所以它们可以被共享。 3. "abc" 等效于 char[] data={ 'a' , 'b' , 'c' } 。 构造方法: public String() public

Printing out ArrayList with toString

匆匆过客 提交于 2020-01-21 17:35:55
问题 When I create an ArrayList object and add other objects to it, printing out the ArrayList object will print out the memory references of the objects inside. However, if I add String to the ArrayList object, it will not print out the memory references of the String but rather the actual String value. String is also an object of a class right, so why does it not print out the String memory reference? 回答1: The toString method for a Collection in Java (which is what an ArrayList extends) uses

ArrayList排序sort

 ̄綄美尐妖づ 提交于 2020-01-21 15:10:43
ArrayList排序sort 使用ArrayList的sort(Comparator<?> comparator)进行排序 方法一:list.sort(); /** * 降序排序 */ private ArrayList<BaseItem> sortItem(ArrayList<BaseViewItem> list){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { list.sort((o1, o2) -> { long date1 = 0; long date2 = 0; if (o1 instanceof ViewItem){ ViewItem item = (ViewItem) o1; date1 = Long.valueOf(dateToStamp(item.getDate())); } else { TaskViewItem item = (TaskViewItem) o1; date1 = Long.valueOf(dateToStamp(item.getDate())); } if (o2 instanceof SheetItem){ SheetItem item = (SheetItem) o2; date2 = Long.valueOf(dateToStamp(item.getDate())); }

Java SE入门(九)——Java集合

拈花ヽ惹草 提交于 2020-01-21 12:54:09
Java SE入门(九)——Java集合   iwehdio的博客园: https://www.cnblogs.com/iwehdio/ 1、对象数组 自动生成构造方法: 无参构造方法:右键 > source > Generate Constructors from Superclass.... 有参构造方法:右键 > source > Generate Constructors using Fields.... 自动生成getXxx和setXxx方法: 右键 > source > Generate Getters and Setters 创建以对象为元素的数组: 例: Student[] students = new Student[3]; 输出方式: System.out.println(getName() + getAge()); 再堆内存中先生成了空数组 Student[3] , 然后创建了三个Student对象,最后将三个对象的地址按顺序填入空数组中。 2、集合 面向对象编程时,为了方便对多个对象进行操作。 长度可以变化的数组。 ArrayList 类 表示泛型。 在出现E的地方可以使用引用数据类型替换。 Systemo.out.println(); 获取的为集合对象的内容。 构造方法: 创建对象为字符串的集合: ArrayList<String> arrat = new

List的实现类之间的区别以及ArrayList的源码解析

爱⌒轻易说出口 提交于 2020-01-21 09:22:06
1.List的实现类有ArrayList, LinkedList, Vactor, Stack; ArrayList:底层是动态数组结构,数据查询方便、数据增删改不方便,线程不安全,本质上就是通过定义新的更大的数组,将旧数组内容拷贝到新数组,来实现扩容。 当我们调用无参构造的方法来构造Arraylist的对象时,它会在内部分配一个初始大小为10的 Object类型的数组。 当添加的数据容量超过数组的大小时,会产生一个新的数组,新的数组大小为原数组的1.5倍,接着把原数组中的数据复制到新数组中。 LinkedList:底层是双向链表结构,数据增删改方便,数据查询不方便,线程不安全; 它内部封装的是双向链表的数据结构,每个节点是一个Node对象, Node对象中封装的是你要添加的元素,还有一个指向上一个Node对象的引用和一个指向下一个Node对象的引用。 Vactor:底层是动态数组结构,线程安全,和ArrayList类似,但属于强同步类。 如果你的程序本身是线程安全的(thread-safe,没有在多个线程之间共享同一个集合/对象),那么使用ArayList是更好的选择。 当添加的数据容量超过数组的大小时,会产生一个新的数组,新的数组大小为原数组的2倍; 有句话叫越安全,效率就越低。 Stack:底层是动态数组结构,线程安全,Stack继承自Vector,实现一个后进先出的堆栈。

JAVA学习——9.Array和ArrayList类

◇◆丶佛笑我妖孽 提交于 2020-01-21 03:12:04
目录 Array类 Array类常用方法 ArrayList Array类 Arrays 类包含用于操作数组的各种方法(例如排序和搜索)。还包含一个静态工厂,允许将数组转为 List。 Array类常用方法 import java.util.Arrays 例如: import java . util . Arrays ; import java . util . Random ; public class ArraysDemo { public static void main ( String [ ] args ) { int [ ] arr = new int [ 10 ] ; //将数组元素都设为9 Arrays . fill ( arr , 9 ) ; System . out . println ( "fill:" + Arrays . toString ( arr ) ) ; Random random = new Random ( ) ; for ( int i = 0 ; i < arr . length ; i ++ ) { //使用100以内的随机数赋值数组 arr [ i ] = random . nextInt ( 101 ) ; } //重新赋值后的数组 System . out . println ( "重新赋值:" + Arrays .

Java 基础笔记 ArrayList集合存储空间变化问题

一个人想着一个人 提交于 2020-01-21 01:27:39
ArrayList在初始化时大小为10,若当集合大小不足时,则会新创建一个集合空间长度为原来的1.5倍,即增长50%,此时新集合中则多了50%的空间可以存储新的对象。 解析:在集合中,若当集合空间不足时会创建一个新的集合并且新集合存储空间比原集合大,为了可以继续增加对象。若新集合存储空间增长过少,则会出现不断创建新集合而舍弃旧集合浪费存储空间的情况;若新集合创建过大,则会出现剩余空间过多的情况,也会浪费存储空间,所以选取每次增长长度为原集合的50%最合适。 来源: CSDN 作者: 一名小白的进阶之路 链接: https://blog.csdn.net/qq_40275740/article/details/104050111

How to sort ArrayList<Object> in Ascending order android

佐手、 提交于 2020-01-21 00:05:17
问题 I have a requirement to sort ArrayList<Object> (Custom objects) in Ascending order based upon name. For that purpose I am using comparator method as like My ArrayList : ArrayList<Model> modelList = new ArrayList<Model>(); Code I am using: Comparator<Model> comparator = new Comparator<Model>() { @Override public int compare(CarsModel lhs, CarsModel rhs) { String left = lhs.getName(); String right = rhs.getName(); return left.compareTo(right); } }; ArrayList<Model> sortedModel = Collections