arraylist

java集合框架01

你。 提交于 2020-03-23 06:20:36
List 接口存储一组不唯一(可以重复),有序(插入顺序)的对象 01. ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高 通过看ArrayList的源码得知: /** * Constructs an empty list with an initial capacity of ten. 构造一个初始容量为十的空列表 */ public ArrayList() { this(10); 调用带参的构造 参数为10 } ArrayList创建的时候,数组初始化长度为10! List list=new ArrayList(-1); 这句话会运行错误! 看源码得知! /** * Constructs an empty list with the specified initial capacity. * * @param initialCapacity the initial capacity of the list * @exception IllegalArgumentException if the specified initial capacity * is negative */ public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) /

List的徒子徒孙们

安稳与你 提交于 2020-03-22 23:44:39
3 月,跳不动了?>>> 1. 徒子徒孙报道 从 Collection家族成员 中可以知道List的徒子徒孙们有(绿色为实现,橙色为继承): AbstractList : SubList : RandomAccessSubList AbstractSequentialList : LinkedList ArrayList Vector : Stack ArrayList LinkedList Vector : Stack 问题:从这些关系里很明显发现AbstractList已经实现了List接口,而ArrayList和Vector是继承它的,为什么ArrayList和Vector还实现List接口? 2. AbstractCollection、AbstractList两个抽象类的功能 AbstractCollection:实现了移除指定元素返回boolean值的功能(依靠迭代器实现的,但此类并未实现迭代器的功能);判断集合包含元素功能;转化成数组的功能。 AbstractList:只实现了迭代器功能,继承AbstractCollection实现的功能。 总结:(1) 这两个抽象类都未实现元素的添加操作,但却定义了各种用到add的方法,算是搭了骨架,只要后面的徒子徒孙们实现add操作,remove操作即可融汇贯通。 (2) 集合的接口和抽象类都未见存储元素的容器

报空指针的问题

一世执手 提交于 2020-03-21 19:24:16
null List list = new ArrayList(); List<StageDO> list = new ArrayList(); list使用时要实例化,否则报空指针 list.addAll(不能为空) (不能为空).equals(不能为空) 来源: https://www.cnblogs.com/wuhen8866/p/11102754.html

2019-05-26 Java学习日记 day16

有些话、适合烂在心里 提交于 2020-03-21 08:19:05
集合框架 List ArrayList去重复方法 public class demo1_ArrayList { public static void main(String[] args) { //创建新集合将重复元素去掉 ArrayList list =new ArrayList(); list.add("a"); list.add("a"); list.add("c"); list.add("c"); list.add("a"); ArrayList newlist=getSing(list); System.out.println(newlist); } public static ArrayList getSing(ArrayList list){ ArrayList newlist = new ArrayList<>();//创建新集合 Iterator it = list.iterator(); //根据传入的集合(老集合)获取迭代器 while (it.hasNext()) { //遍历老集合 Object obj1= it.next(); //记录每一个元素 if (!newlist.contains(obj1)) { //如果新集合不包含老集合中的元素 newlist.add(obj1); //将该元素添加 } } return newlist; } } 练习题

描述一下 ArrayList,LinkedList,Vestor各自实现和区别

大城市里の小女人 提交于 2020-03-21 07:16:56
ArrayList,LinkedList,Vestor这三个类都实现了java.util.List接口,但它们有各自不同的特性,主要如下: 一、同步性 ArrayList,LinkedList是不同步的,而Vestor是同步的。所以如果不要求线程安全的话,可以使用ArrayList或LinkedList,可以节省为同步而耗费的开销。但在多线程的情况下,有时候就不得不使用Vector了。当然,也可以通过一些办法包装ArrayList,LinkedList,使他们也达到同步,但效率可能会有所降低。 二、数据增长 从内部实现机制来讲ArrayList和Vector都是使用Objec的数组形式来存储的。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。 三、检索、插入、删除对象的效率 ArrayList和Vector中,从指定的位置(用index)检索一个对象,或在集合的末尾插入、删除一个对象的时间是一样的,可表示为O(1)。但是

java集合框架——List

∥☆過路亽.° 提交于 2020-03-21 06:19:23
一、List接口概述 List有个很大的特点就是可以操作角标。 下面开始介绍List接口中相对于Collection接口比较特别的方法。在Collection接口中已经介绍的方法此处就不再赘述。 1.添加 void add (int index, E element) 在列表的指定位置插入指定元素(可选操作)。 boolean addAll (int index, Collection <? extends E > c) 将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。 这两个方法相对于Collection接口,可以直接在特定的地方插入新的元素或者集合。 2.删除。 E remove (int index) 移除列表中指定位置的元素(可选操作)。 这个方法相对于Collection接口来说,可以直接删除特定位置上的元素。 3.修改 E set (int index, E element) 用指定元素替换列表中指定位置的元素(可选操作)。 这个方法可以将指定位置上的元素替换为另外一个元素(对象)。 4.查找 E get (int index) 返回列表中指定位置的元素。 int indexOf ( Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。 int lastIndexOf ( Object o)

day14_集合框架1(ArrayList,LinkedList,HashSet)

我的梦境 提交于 2020-03-21 04:15:34
1.集合框架大致示意图: 2.集合概述: /* 数据 -封装在-> 对象 -存储在-> 集合 集合类: 1.为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对 多个对象的操作,就对 对象进行存储,集合就是存储对象最常用的 一种方式 2.数组和集合类同是容器,有何不同? 数组虽然也可以存储对象,但长度是固定的,只能存储同一类型对象 集合长度是可变的. 数组中可以存储基本数据类型,集合只能存储对象 集合类的特点: 集合只用于存储对象 集合长度是可变的 集合可以存储不同类型的对象 关于数组: 例如: Person p=new int[3]; p[0]=new Person("zhangsan"); ... 为什么有这么多容器?(集合) 因为每一个容器对数据的存储方式都有不同 这个存储方式称为数据结构. */ 3.Collection中的一些方法: /* 1.add方法的参数类型是Object,以便于接收任意类型的对象 2.集合中存储的都是对象的地址(引用) */ import java.util.*; class CollectionDemo { public static void sop(Object obj) { System.out.println(obj); } public static void base_method() { ArrayList

java第十三天_集合,List集合

大兔子大兔子 提交于 2020-03-21 04:02:47
集合类: 为什么出现集合类:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。 数组和集合类同时容器,有何不同? 数组虽然也可以存储对象,但长度是固定的;集合 长度是可变的 。 数组中可以存储基本数据类型,集合 只能存储对象 。 集合类的特点: 集合只能用于存储对象( 对象的引用(地址 ) ) 集合长度是可变的 集合可以存储不同类型的对象。 集合框架的构成及分类: 迭代器: 基本格式: Iterator it = al iterator ( ) ;//获取迭代器,用于取出集合中的元素。 while ( it.hasNext ( ) ) //使用for循环更加节约内存。 { sop ( it.next ( ) ) ; } 使用迭代器的需求: 把取出方式定义在集合的内部,这样取出方式就可以直接访问集合内容的元素。那么取出方式就被定义成了内部类。而每一个容器的数据结构不同,所以取出的动作细节也不一样。但是都有共性的内容,判断和取出。那么可以将写共性抽取。那么这些内部类都符合一个规则。该规则是Iterator如何获取及诶和的取出对象呢?通过一个对外提供的方法。Iterator (); 在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。

java8 ArrayList源码阅读

拥有回忆 提交于 2020-03-21 03:26:45
转载自 java8 ArrayList源码阅读 本文基于jdk1.8 Java Collection库中有三类: List,Queue,Set 其中List,有三个子实现类: ArrayList,Vector,LinkedList http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/java/util/ArrayList.java 实现原理 transient Object[] elementData; // 存放元素的数组 private int size; // 实际存放元素的数量 ArrayList底层是使用一个Object类型的数组来存放数据的,size变量代表List实际存放元素的数量 add,remove,get,set,contains操作 get和set方法,都是通过数组下标,直接操作数据的,时间复杂度为O(1) public boolean contains(Object o) { return indexOf(o) >= 0; } public int indexOf(Object o) { // 遍历所有元素找到相同的元素,返回元素的下标, // 如果是元素为null,则直接比较地址,否则使用equals的方法比较 if (o == null) { for (int i = 0

给定一个(ArrayList)将其改写成一个简单的阻塞队列

一笑奈何 提交于 2020-03-21 01:58:37
给定一个(ArrayList)将其改写成一个简单的阻塞队列,要求拥有put和get方法,以及getSize方法,能够支持多个生产者和多个消费者线程拥塞调用。 1】使用synchronized锁或ReentrantLock锁实现 1】使用Object的wait、notify、notifyAll来实现 基本思路:使用put方法向容器中添加元素,使用get方法从容器中取出元素,在使用put方法添加元素的时候进行判断,如果容器已经满了,此时调用wait()方法,使用添加线程阻塞,等待消费线程取出元素,腾出容器空间后才能再向其中添加元素,同理当使用get方法获取元素的时候,如果容器已经为空,此时要调用wait()方法,使得取出元素线程阻塞,等待添加线程添加元素,容器不为空时才能再从容器中取出元素 public class MyArrayBlockingQueue<T>{ /* * 调用无参构造方法,阻塞队列的默认长度 */ public static final int SIZE_VALUE=10; /* * 队列的容器存放队列的元素 */ public final List<T> lists=new ArrayList<>(); /* * 队列的最大容量 */ private final int maxSize; /* * 队列当前元素个数 */ private int size=0;