arraylist

Jdk源码学习之:ArrayList

喜欢而已 提交于 2020-02-29 14:08:36
1. ArrayList简介 首先看看ArrayList与Collection的关系: ArrayList的继承关系如下: java.lang.Object ↳ java.util.AbstractCollection ArrayList继承了AbstractList,实现了List。它是一个数组队列,相当于动态数组。提供了相关的添加、删除、修改和遍历等功能。 ArrayList实现了RandomAccess接口,即提供了随机访问功能。RandomAccess是java中用来被List实现,为List提供快速访问功能的。在ArrayList中,我们即可以通过元素的序号来快速获取元素对象,这就是快速随机访问。下文会比较List的“快速随机访问”和使用“Iterator迭代器访问”的效率。 ArrayList实现了Cloneable接口,即覆盖了函数clone,能被克隆。 ArrayList实现了java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。 和Vector不同,ArrayList中的操作是非线程安全的。所以建议在单线程中使用ArrayList,在多线程中选择Vector或者CopyOnWriteArrayList。 我们先总览下ArrayList的构造函数和API: /******************

集合类题目

我的梦境 提交于 2020-02-29 13:18:10
1.Java 集合类框架的基本接口有哪些? Java 集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。 Java 集合类里面最基本的接口有: Collection :代表一组对象,每一个对象都是它的子元素。 Set :不包含重复元素的 Collection 。 List :有顺序的 collection ,并且可以包含重复元素。 Map :可以把键 (key) 映射到值 (value) 的对象,键不能重复。 2. 为什么集合类没有实现 Cloneable 和 Serializable 接口? 集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它 自己的方式对元素进行保存和排序。有的集合类允许重复的键,有些不允许。 3. 什么是迭代器 (Iterator) ? Iterator 接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代 器实例的 迭代方法。迭代器可以在迭代的过程中删除底层集合的元素。 克隆 (cloning) 或者是序列化 (serialization) 的语义和含义是跟具体的实现相关的。因此,应该由 集合类的具体实现来决定如何被克隆或者是序列化。 4.Iterator 和 ListIterator 的区别是什么? 他们的区别:Iterator 可用来遍历 Set 和 List 集合,但是

ArrayList

瘦欲@ 提交于 2020-02-29 11:56:53
ArrayList ArrayList 以数组存储数据的集合。 默认数组长度为10 ,是一个 Object[] elementData 的数组。 以构建不带构造参数的 ArrayList 来看看运行逻辑。 这里的默认就是一个空数组 DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {} ; public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } size 是数组的大小默认为0。 modCount 表示数组 新增,删除 次数,默认为0,当使用方法为数组增加元素,删除元素时modCount会递增。 public boolean add(E e) { modCount++;//操作次数递增 add(e, elementData, size); return true; } /** 注意:该方法不是静态方法,且是私有方法。 e : 要添加到数组的元素 elementData:被添加元素的数组 s:被添加元素的数组大小 */ private void add(E e, Object[] elementData, int s) { //判断了传递的大小 == 数组的长度,这样不能避免空指针。 //这样设计有个好处。此处elementData是持有对象数组的引用

Java8 Stream

谁都会走 提交于 2020-02-29 09:22:35
java8 的 Stream 开始之前先叙述一些相关的概念, 流的操作类型分为两种: Intermediate :一个流可以后面跟随零个或多个 intermediate 操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。 Terminal :一个流只能有一个 terminal 操作,当这个操作执行后,流就会被,无法再被操作。所以这必定是流的最后一个操作。Terminal 操作的执行,才会真正开始流的遍历,并且会生成一个结果,或者一个 side effect。 short-circuiting 对于一个无限大(infinite/unbounded)的 Stream,返回有限的新的Stream或者能在有限的时间内返回结果 通过以上的概念,可以归类如下的方法 Intermediate: map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered Terminal: forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、

从零写一个编译器(三):语法分析之几个基础数据结构

空扰寡人 提交于 2020-02-29 09:04:47
项目的完整代码在 C2j-Compiler 写在前面 这个系列算作为我自己在学习写一个编译器的过程的一些记录,算法之类的都没有记录原理性的东西,想知道原理的在龙书里都写得非常清楚,但是我自己一开始是不怎么看得下来,到现在都还没有完整的看完,它像是一本给已经有基础的人写的书。 在parse包里一共有8个文件,就是语法分析阶段写的所有东西啦 Symbols.java Production.java SyntaxProductionInit.java FirstSetBuilder.java ProductionManager.java ProductionsStateNode.java StateNodeManager.java LRStateTableParser.java 项目的完整代码在 C2j-Compiler SyntaxProductionInit 语法初始化 在上一篇说了,竟然要验证句子正确与否,自然就需要语法,也就是给出相应的语法推导式 所有语法的初始化工作都在SyntaxProductionInit里完成 ///EXT_DECL_LIST ->EXT_DECL_LIST COMMA EXT_DECL right = getProductionRight(new int[]{Token.EXT_DECL_LIST.ordinal(), Token.COMMA

How to convert 2Darray into 2D ArrayList in java?

巧了我就是萌 提交于 2020-02-29 07:33:09
问题 I have searched similar questions and I still cannot find the solution for my case. So basically, I have a 2D array called 'array2D' and I am trying to convert those into 2D arrayList. I tried to create an arrayList and used for loop to copy each of the elements from my array2D, which is a primitive 2D Array. I wonder if there is any clean and efficient way to do it. Here is my code: List<List<String>> arrayList2D = new ArrayList<List<String>>(); List<String> eachRecord = new ArrayList<String

How to convert 2Darray into 2D ArrayList in java?

大城市里の小女人 提交于 2020-02-29 07:32:15
问题 I have searched similar questions and I still cannot find the solution for my case. So basically, I have a 2D array called 'array2D' and I am trying to convert those into 2D arrayList. I tried to create an arrayList and used for loop to copy each of the elements from my array2D, which is a primitive 2D Array. I wonder if there is any clean and efficient way to do it. Here is my code: List<List<String>> arrayList2D = new ArrayList<List<String>>(); List<String> eachRecord = new ArrayList<String

剑指Offer编程题(Java实现)——从尾到头打印链表

五迷三道 提交于 2020-02-29 01:07:13
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。 解题思路 思路一:使用头插法 使用头插法可以得到一个逆序的链表。遍历链表,每次将所遍历节点插入到链表的头部。 头结点和第一个节点的区别: 头结点是在头插法中使用的一个额外节点,这个节点不存储值; 第一个节点就是链表的第一个真正存储值的节点。 /** * public class ListNode { * int val; * ListNode next = null; * * ListNode(int val) { * this.val = val; * } * } * */ import java.util.ArrayList; public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> res = new ArrayList<Integer>(); if(listNode == null) return res; ListNode newList = new ListNode(-1); while(listNode != null){ ListNode tmp = listNode.next; listNode.next =

JAVA集合 - ArrayList

删除回忆录丶 提交于 2020-02-29 00:00:01
集合可实现增删改查,下面的项目用ArrayList集合来做实例,ArrayList集合几个常用的函数   .size()  集合大小   .add()  添加对象到集合   .remove() 删除集合的对象 用到的其他函数   .equals() 字符串比较   System.exit(-1) 退出系统,非零 1 /* 2 * 作者:白客C 3 * 时间:2020年02月28日 4 * 内容:简单员工管理系统 5 */ 6 7 package com.beekc.www; 8 import java.io.*; 9 import java.util.*; 10 11 public class Beekc { 12 public static void main(String[] args) throws Exception{ 13 14 //创建EmpManage 15 EmpManage em = new EmpManage(); 16 17 //输入流 18 InputStreamReader isr = new InputStreamReader(System.in); 19 BufferedReader br = new BufferedReader(isr); 20 21 //简易菜单 22 em.menu(); 23 while (true) 24 { 25 26

Android 序列化 & 反序列化

女生的网名这么多〃 提交于 2020-02-28 23:01:46
###What? 何为序列化与反序列化? ***序列化:***将对象转化为二进制序列的过程 ***反序列化:***将二进制序列恢复为原始对象的过程 ###Why? 为什么需要序列化? 由于在系统底层,数据以简单的字节序列形式进行传递,即在底层,系统不认识对象,只认识字节序列,所以为了达到跨进程通讯的目的,需要先对数据进行序列化;其次,在进行网络数据传输或者activity间对象传递时,也需要先将对象转化为字节序列。 ###How? 如何进行序列化? 在Android中,序列化操作有两种方式:实现Serializabale接口或实现Parcelable接口。 Serializabale接口 Serializabale接口是一个空接口,实际上只提供标记的功能,标记实现了该接口的对象是可以进行序列化的,而具体的序列化与反序列化操作是由ObjectOutputStream和ObjectInputStream完成的。序列化与反序列化过程均对用户透明,其中需要保存许多额外的字段以保证反序列化过程能够顺利完成,同时,在这个过程中,还涉及到Java反射机制,所以整体时空开销比较大。 Parcelable接口 Parcelable是Android提供的接口,它主要是通过writeToParcel(),将需要持久化的字段保存到一个Parcel对象里面,然后通过CREATOR从Parcel对象中