arraylist

java中List集合中ArrayList详解

只谈情不闲聊 提交于 2020-02-28 12:43:06
List是collection接口的实现类 List: 特点: 有序,可重复 它有两个常用的实现类: 一。ArrayList: 特点:以数组的形式进行存储,因此随机访问速度较快,所有它适用于查询。 缺点:不适用于插入和删除的操作 因为每次操作都需要移动数组中的元素。 根据源码我们能得出以下几点: 1.ArrayList 在初始化的时候如果我们没有指定长度的话,它会有一个默认长度10, private static final int DEFAULT_CAPACITY = 10; 2.如果我们在增加新元素的时候超过了原来的容量,那么ArrayList是怎么做的呢? 这就涉及到了ArrayList的扩容机制,既然ArrayList是以数组形式存储的,那么肯定就继承了数组的特点一旦声明不可更改,那么既然不可更改,那java是怎么解决这个问题的呢? transient Object[] elementData; 开头声明的这个就是一个临时的可变的数组 为以后数组扩容做准备 public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } 上边代码的ensureCapacityInternal(size+1)

Collection,泛型,Map

最后都变了- 提交于 2020-02-28 10:56:45
1.Collection集合 集合和数组的区别? 数组的长度是固定的, 集合的长度是可变的 数组中存储的数据都是同一类型的数据。集合存储的是对象,而且对象的类型可以不一致 集合框架 单列集合 java.util.Collection Collection:单列集合的跟接口,用于存储一系列的规则的元素 两个子接口: java.util.List: List中元素是有序,元素可重复 实现类:java.util.ArrayList, java.util.LinkedList Java.util.Set: Set中元素无序,不重复 实现类:java.util.HashSet, java.util.TreeSet Collection集合的常用功能 Collection是所有单列集合的父接口,因此定义了一些通过方法 public boolean add(E, e) :添加元素到集合中 public void clear() :清空集合中所有的元素 public boolean remove(E, e) :删除指定的元素 public boolean contains(E, e) :判断当前集合是否存在给定的元素 public boolean isEmpty() :判断当前集合是否为空 public int size() :返回集合中元素的个数 public Object[] toArray(

手撕ArrayList底层,透彻分析源码

核能气质少年 提交于 2020-02-28 09:01:02
ArrayList概述 Hello大家好,今天就来介绍一下ArrayList,说到ArrayList,很多人都知道它的底层是使用数组实现的,线程不安全的,说到它的特点,都会说查找快,增删慢,因为面试题大家都是这么背过来的。今天就来说说它的底层源码吧。 ArrayList更准确的说是动态数组去实现的,这里使用动态两字,是为了能够充分体现它的特点。 再者就是ArrayList不是线程安全的,所以效率比较高,但是否这个是绝对的呢?答案是否定的 。 ArrayList底层源码 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 = {};

Java集合框架

醉酒当歌 提交于 2020-02-28 03:34:06
集合框架介绍 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下。Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。 2. 集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。 3. 抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。 4. 实现类:8个实现类(实线表示),对接口的具体实现。 5. Collection 接口是一组允许重复的对象。 6. Set 接口继承 Collection,集合元素不重复。 7. List 接口继承 Collection,允许重复,维护元素插入顺序。 8. Map接口是键-值对象,与Collection接口没有什么关系。 9.Set、List和Map可以看做集合的三大类: List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。 Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是集合里元素不允许重复的原因)。 Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。 纯手写List框架 List集合代表一个有序集合

桶排序

北慕城南 提交于 2020-02-28 00:42:15
一,介绍 ①什么是桶排序? 桶排序是在已经数据的范围的条件下,创建若干个桶,根据相应的比较规则将待排数据落入各个对应的桶中,最后扫描 桶 来实现排序。 ②桶排序需要的附加条件 数据的范围已知。 比如,输入整数数据 A(1) A(2)......A(n-1) A(n),它们都是由小于M的整数组成,此时,就可以创建 M 个桶进行桶排序了 再比如,固定长度的字母字符串数据: S(1) S(2) .....S(n-1) S(n),任意的字符串S(i),都由26个小写字母组成,在桶排序过程中,就可以创建26个桶来保存这些字符串 二,桶排序的示例 ①将10万个人的年龄进行桶排序 假设有10万个人的年龄数据, 年龄范围默认是0-99 ,如何对这10万个数据进行排序? 如果用快排啊、归并排序啊...这样的排序算法是可以。但是这样的排序问题更适合桶排序。采用桶排序的方法如下: 建立100个桶,这可以用一个 一维数组来表示。a[0...99],依次扫描10万条数据,根据每条数据的值,记录到桶中。比如,第10个人的年龄是18岁,则a[18]++ (这是将出现的频率记录在桶中,是计数,它是将待排序的元素本身进行比较,而不是将“待排序的元素的 组成部分 ”进行比较) 然后,扫描这100个桶,即可得到有序的数组。 如:一个简单的示例: 所有的数据都在0-5范围内: 4,5,2,3,1,4,3,2,1,5,2

常见面试题知识点

与世无争的帅哥 提交于 2020-02-28 00:33:44
请你讲讲数组(Array)和列表(ArrayList)的区别?什么时候应该使用Array而不是ArrayList? 考察点:Array 参考回答: Array和ArrayList的不同点: Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。 Array大小是固定的,ArrayList的大小是动态变化的。 ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。 对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。 ● 请你解释什么是值传递和引用传递? 考察点:JAVA引用传递 参考回答: 值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量. 引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。 所以对引用对象进行操作会同时改变原对象. 一般认为,java内的传递都是值传递. ● 请你讲讲Java支持的数据类型有哪些?什么是自动拆装箱? 考察点:JAVA数据类型 参考回答: Java语言支持的8种基本数据类型是: byte short int long float double boolean char 自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化

第8章 集合工具类:Collections

这一生的挚爱 提交于 2020-02-27 23:43:58
本章要点: Collections工具类 排序操作 查找、替换操作 同步控制 Collections工具类 java提供了一个操作set、List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序、查询和修改等操作,还包括将集合对象设置为不可变、对集合对象实现同步控制等方法。 排序操作 Collections提供了如下常用的类方法用于对List集合元素进行排序: void reverse(List list):反转指定List集合中元素的顺序。 void shuffle(List list):对list集合元素进行随机排序(shuffle方法模拟了“洗牌动作”)。 void sort(List list):根据元素的自然顺序对指定List集合的元素按升序进行排序。 void sort(List list, Comparator c):根据指定Comparator产生的顺序对List集合元素进行排序。 void swap(List list, int i, int j):将指定List集合中的i处元素和j处元素进行交换。 void rotate(List list, int distance):当distance为正数时,将list集合的后distance个元素“整体”移到前面:当distance为负数时,向后移。 public class

去除ArrayList重复字符串案例之方案二

廉价感情. 提交于 2020-02-27 13:18:45
问题描述: 现有一ArrayList类型集合al,al中含有重复字符串,试将 重复字符串去除 思路: 依据选择排序思想,从头开始遍历al,遍历至倒数第二个元素, 每个被遍历元素与其后面所有元素比较,若有重复,删除后面 重复元素 主要代码实现: ArrayList < String > al = new ArrayList < String > ( ) ; al . add ( "hello" ) ; al . add ( "world" ) ; al . add ( "hello" ) ; al . add ( "world" ) ; al . add ( "world" ) ; al . add ( "hello" ) ; al . add ( "world" ) ; al . add ( "world" ) ; al . add ( "world" ) ; al . add ( "hello" ) ; al . add ( "world" ) ; al . add ( "world" ) ; al . add ( "hello" ) ; al . add ( "world" ) ; for ( int a = 0 ; a < al . size ( ) - 1 ; a ++ ) { for ( int b = a + 1 ; b < al . size ( ) ; b ++ )

从尾到头打印链表

无人久伴 提交于 2020-02-27 12:26:29
输入一个链表,从尾到头打印链表每个节点的值。 递归到最后,在一个个的添加进List 1234567891011121314 public ArrayList<Integer> (ListNode listNode) { ArrayList<Integer> res = new ArrayList<>(); printListFromTailToHead(listNode, res); return res;}public void (ListNode node, List<Integer> res) { if (node != null) { printListFromTailToHead(node.next, res); res.add(node.val); }} 使用栈从头到尾装入所有节点即可,因为栈先进后出的特性,在弹出的时候就是从尾到头 123456789101112131415 public ArrayList<Integer> (ListNode listNode) { ArrayList<Integer> res = new ArrayList<>(); Stack<ListNode> stack = new Stack<>(); ListNode node = listNode; while (node != null) { stack.add(node);

ArrayList的源码分析

六眼飞鱼酱① 提交于 2020-02-27 11:38:50
前言 我思故我在 ArrayList的简介 1,ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用 ensureCapacityXXX 方法来操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。 2,它继承了 AbstractList ,实现了 List , RandomAccess , Cloneable , java.io.Serializable 这些接口。 3,插入删除元素的时间复杂度为 O(n) ,求表长以及增加元素,取第 i 元素的时间复杂度为 O(1) 4,继承AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。 5,实现 RandomAccess 接口 , RandomAccess 是一个标志接口,表明实现这个这个接口的 List 集合是支持 快速随机访问 的。在 ArrayList 中,我们即可以通过元素的序号快速获取元素对象,这就是快速随机访问。对于实现了 RandomAccess 接口 的集合在使用 Collections.binarySearch方法 ,的执行策略有所不同。 6,实现 Cloneable 接口 ,即覆盖了函数 clone(), 能被克隆 。 7,实现 java.io