List集合详细讲解

本文详细介绍了Java List集合的不同实现(ArrayList、LinkedList和Vector),包括它们的关系、特点、遍历方式、扩容机制,以及删除元素的正确方法。特别关注了ArrayList的删除问题和迭代器的使用技巧。
摘要由CSDN通过智能技术生成

  list集合想必大家都是不陌生的,我们用的也是非常的多,但是可能大家在使用中,也不是对list集合有非常详细的讲解,今天小编就详细的带大家了解list集合。

目录

 一.集合之间的关系

 二.List集合

三.ArrayList集合 

for循环删除方法01

 for循环删除方法02

for循环删除方法03

foreach删除方法

迭代器删除01

迭代器删除元素02

list集合删除方法

  四.LinkedList集合

五.Vector集合 

六.CopyOnWriteArrayList集合 


 一.集合之间的关系

下方是一张UML图,vector,ArrayList,LinkedList继承List,今天也是详细讲解该三个集合,下一篇文章在给大家详细Set集合。

  


 二.List集合

  List集合特点:

       元素有序的,且可重复。(元素有序不是指,我们存进Lits集合中的什么1,3,7,6他给我们从小到大,或者从大到小这样子,所谓的有序是我们该集合有下标,下标从0开始,然后我们按照什么顺序增加到list集合的,那么他就是什么样子的顺序)。 

  

 List集合遍历:

      根据下标,foreach,迭代器遍历数据。

 

 Lits集合扩容:

      Lits集合当我们实例出来,它的默认初始容量为10,当往List集合里面增加的数据超过10个以后,他就会扩容增加0.5倍,扩容以后就是15。

      新容量 = 原容量 + 原容量 * 0.5

 

  注:vector,ArrayList,LinkedList都是继承List,所以和Lits集合以上三点都是一样的。


三.ArrayList集合 

 ArrayList集合是继承List的集合的,所以Lits集合具备的一些特点,ArrayList也是具备的。

 ArrayList集合的特点:

  • 简单数据结构,超出容量会自动扩容,也是和List集合的扩容是一样的。
  • ArrayList集合动态数组,为什么说是动态数组,因为数组一般能存放多少数据,一般都是定好的,而ArrayList数组是可以根据数据扩容的,所以是一个动态的数组。
  • 内部实现是基于基础的对象数组的,也就是ArrayList集合存放的是对象。
  • ArrayList集合不适合随机的删除和增加。

   

  ArrayList删除几种删除

  • for循环删除方法01

       这种方法存在一个非常致命的问题,我这里的判断是删除为3的数据,集合中有两个为3的,但是只删除了一个3,得到的结果为[1, 2, 3, 4, 5, 6]

      为什么没有将2个3全部删除?

      因为在进行删除的时候会,本来集合数据为[1,2,3,3,4,5,6],但是在我们删除3的时候,集合立马就会变成[1,2,3,4,5,6]第二个3的下标网上移动了,而for循环已经走到下标为3的,而第一个3被在删除的那一刻第二个3的下标本来是3,但是立马下标为2了,所以这就是为什么结果为[1, 2, 3, 4, 5, 6],所以这种方法非常大的bug存在,因为想删除的数据没有删除成功。
 

package patterndemo02;

import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;


public class Test01 {
	 
	 private List<Integer> list=new ArrayList<Integer>();
	 /**
	  * 第一种删除方法
	  */
	
	 @Before
	 public void list() {
		
		 //往集合中增加数据
		 list.add(1);
		 list.add(2);
		 list.add(3);
		 list.add(3);
		 list.add(4);
		 list.add(5);
		 list.add(6);
		 
	 }
	 
	 @Test
	 public void test01() {
		 for(int i=0;i<list.size();i++) {
			 //判断当找到该对象值为3的删除
			 if(list.get(i)==3) {
				 list.remove(i);
			 }
		 }
		 System.out.println(list);
	 }

}

   得到结果 

   

  

  •  for循环删除方法02

       这种方法将3全部删除了,因为首先判断为3的进行删除,但是i--的特点在于,第一遍不会立马执行i=i-1,等第二次的执行才会执行i=i-1,所以第一遍正常删除第一个三,第二遍删除第二个3所以结果为[1,2,4,5,6]

       

package patterndemo02;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.junit.Before;
import org.junit.Test;


public class Test01 {
	 
	 private List<Integer> list=new ArrayList<Integer>();
	 /**
	  * 第一种删除方法
	  */
	
	 @Before
	 public void list() {
		
		 //往集合中增加数据
		 list.add(1);
		 list.add(2);
		 list.add(3);
		 list.add(3);
		 list.add(4);
		 list.add(5);
		 list.add(6);
		 
	 }
	 

	 
	 @Test
	 public void test02() {
		 for(int i=0;i<list.size();i++) {
			 if(list.get(i)==3) {
				 list.remove(i--);
			 }
		 }
		 System.out.println(list);
	 }

}

 得到结果:

    

  

  • for循环删除方法03

    大家看这个图更好理解,图片画的有点丑。

   

 

package patterndemo02;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.junit.Before;
import org.junit.Test;


public class Test01 {
	 
	 private List<Integer> list=new ArrayList<Integer>();
	 /**
	  * 第一种删除方法
	  */
	
	 @Before
	 public void list() {
		
		 //往集合中增加数据
		 list.add(1);
		 list.add(2);
		 list.add(3);
		 list.add(3);
		 list.add(4);
		 list.add(5);
		 list.add(6);
		 
	 }
	 

	 @Test
	 public void test03() {
		 for(int i=list.size()-1;i>=0;i--){
			 if(list.get(i)==3){
			  list.remove(i);
			 }
			}
	 }
	 
	 

}

 得出结果

 

 

    

  • foreach删除方法

  

     这种方法就是非常严重的问题,因为报错,所以不要使用foreach删除。

    

	 public void test04() {
		 for(Integer i:list){
			    if(i==3) list.remove(i);
			}
		 System.out.println(list);
	 }
	 

    这种方法有一个非常有意思的地方,就是他可以删除倒数第二个元素,不会报错,会删除成功,这也算是一个小bug。

   

	 @Test
	 public void test04() {
		 for(Integer i:list){
			    if(i==3) {
			    	list.remove(5);
			    }
			}
		 System.out.println(list);
	 }

  

   为什么使用foreach删除报错???
    首先foreach在本质上创建了迭代器,我们先看下源码。

     

private class Itr implements Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;

        Itr() {}
		
		//1.
        public boolean hasNext() {
            return cursor != size;
        }

		//2.
        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }

		//3.
        public void remove() {
            if (lastRet < 0)
                throw new IllegalStateException();
            checkForComodification();

            try {
                ArrayList.this.remove(lastRet);
                cursor = lastRet;
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
        }
        
        //4.
        final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }
    }

     注意看这个方法 

        

​
   //4.
        final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }

​

 modCount:修改次数 

当list调动add方法时,add方法会对 modCount 实现++操作,如上例,共调用了add()4次,
则modCount=4。
而在迭代器初始化过程中会将这个值赋给迭代器的 expectedModCount,
则此时:modCount==expectedModCount==4。

 

当我们对list修改,则modCount+1,此时,modCount==5

expectedModCount依然为 4,

因为:modCount != expectedModCount,所以抛出异常!
 

注:

所以我们使用迭代器来进行删除,因为迭代器可以维持这两个数相同,使用使用迭代器就不会出现像使用foreach这种情况的出现。

 

  • 迭代器删除01

      使用迭代器进行删除集合中的数据,首先不会存在数据想要删除的数据,没有被删除,或者多删,报错这种情况不会出现,使用迭代器不报错的原因,是因为迭代器可以维持那两个数的相等,所以不会像foreach出现那种情况。

   
	 @Test
	  public void test05() {
		  Iterator<Integer> it=list.iterator();
		  while(it.hasNext()) {
			  Integer vaule=it.next();
			  if(vaule==3) {
				  it.remove();
			  }
		  }
	  }

    得到的结果:[1, 2, 4, 5, 6] 

  

  • 迭代器删除元素02

    第二种使用迭代器的方法,但是这种方法咋就是一整个漏住,会直接报错。

    为什么报错嘞?

   迭代器其实在另外一个线程复制了一个一摸一样的集合进行遍历的。当用集合的remove方法删除元素时,迭代器是不会知道的,所以就会抛出异常。 

    

 @Test
	  public void test06() {
		 Iterator<Integer> it=list.iterator();
		 while(it.hasNext()){
		  Integer value=it.next();
		   if(value==3){
		   list.remove(value);
		  }
		}
		System.out.println(list);
		
	  }
  • list集合删除方法

    这句语句是删除下标为2的元素

list.remove(2);

     这句是删除元素为2的

 

list.remove(Integer.valueOf(2));

  四.LinkedList集合

  •  和List集合用法一样
  •  线程不安全
  • LinkedList集合实现双向 链表接口,实现从头元素到尾元素的链表和从尾到头元素的链表,目标为了增加元素的检索效率 
  • 适合做随机的增加或者删除

五.Vector集合 

  • 线程安全
  • Vector中所有的方法都是线程同步的,都带有synchronized关键字,所以他的并行性能慢,不建议使用

为什么性能慢?

打个比方,比如一个厕所有三个位置,有一个人去上厕所了,他就直接把最外面的那个门给关了,他一个人进去上厕所,但是他只需要一个位置,但是他把大门锁了,其他人只能在外面等待,结果他自己就上一个位置,其他两个都空着。也就是Vector进去一个他就会上锁,等里面执行完成,在到另外一个。也就是同步锁的一个原理。

六.CopyOnWriteArrayList集合 

  • 线程安全,相比Veator性能更加好
  • 适合读多,写少的的场景
  • 写时复刻
  • 最终一致性

    CopyOnWriteArrayList集合写时复刻和最终一致性什么意思?

   CopyOnWriteArrayList集合这个集合,我觉得是非常有意思的,当我们需要对该数据进行操作时,他会将原本集合中的数据复制过去,然后在复制过去的集合里的元素进行操作,这就是写时复刻,等修改完成,这个修改过的集合就会给到原本的数组哪里,这是最终一致性。

 

 今天的学习就到这里啦!!!下篇文章为大家带来set集合的一个详细讲解。 

客行.
关注 关注
  • 11
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
集合框架·List集合简介
weixin_54877075的博客
05-16 2016
相信大家初学Java时对集合的概念也有一定的了解,那么java里面的集合又是什么呢? 一、集合是什么? 它和数组不同,数组既可以存储基本数据类型,也可以存储引用数据类型。而集合只能存储引用数据类型,比如你存入一个int型数据18放入集合中,其实它是自动转换成Integer类后存入的,Java中每一种基本数据类型都有对应的引用类型,如果存储基本数据类型,会被自动装箱。 它就像一个容器,专门用来存储java对象(实际上是对象名,即指向地址的指针),这些对象可以是任意数据类型,并且长度可变。其中,这些集..
java高级编程必须知道的集合详细讲解
08-09
这份资源详细讲解了Java集合框架的各个方面,旨在帮助开发者更好地理解和使用集合。 首先,集合框架中的`Collection`接口是最基础的集合接口,它分为几个主要的子类,包括`List`、`Set`和`Queue`。`List`接口的实现...
List集合
weixin_45300957的博客
04-24 1781
List是一个接口,它继承自Collection接口。List表示的是一个元素有序的集合,可以根据插入顺序或其他某个规则来存储元素。List还提供了访问下标、添加、删除、查询等常规操作。这些操作受到集合的大小、容量、对内存的影响等多个因素的影响,因此我们需要在使用时选择具体的子类。List的底层实现可以是数组或链表。对于数组实现的List,元素的插入和删除是相对耗时的操作,因为需要进行数组的移位操作。而对于链表实现的List,插入和删除则可以达到O(1)的时间复杂度。
集合框架——List集合
最新发布
KKTT01的博客
08-26 574
Collection集合概述是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现创建Collection集合的对象多态的方式具体的实现类ArrayListCollection集合常用方法方法名说明添加元素从集合中移除指定的元素根据条件进行移除清空集合中的元素判断集合中是否存在指定的元素判断集合是否为空int size()集合的长度,也就是集合中元素的个数。
java实现把一个List集合拆分成多个的操作
09-07
本篇文章将详细讲解如何使用Java实现将一个List集合拆分成多个固定长度的小集合。 首先,我们来看一个简单的例子,这个例子中定义了一个名为`groupList`的方法,它接受一个List类型的参数,并将其拆分成多个子集合...
Java集合Collection、List、Set、Map使用详细讲解.doc
10-11
集合框架包括了多种接口和类,如Collection、List、Set、Map等,它们各自有特定的功能和用途。 1. **集合框架概述** - **容器简介**:集合框架就是一组接口和类,它们定义了存储、检索和操作对象的标准方式。这些...
java实现jdbc查询结果集result转换成对应list集合
09-03
本篇文章将详细讲解如何将ResultSet转换为对应的List集合。 首先,我们了解ResultSet对象。ResultSet是JDBC中的一个接口,它代表了SQL查询的结果。它是一个迭代器,可以按顺序访问每一行数据。然而,由于ResultSet...
List集合之间内连接
12-27
首先,让我们详细讲解Linq查询语句实现内连接的步骤。假设我们有两个List集合,一个是`List<Person>`,另一个是`List<Address>`,我们想找到Person列表中与Address列表匹配的元素,基于它们的ID字段。 ```csharp ...
List集合详解
weixin_74268571的博客
06-13 1238
集合体系结构,list集合的特点及遍历方式,linkedlist与arraylist两者的区别,list扩容和list去重的底层原理
List详解
weixin_45032905的博客
02-20 814
Java文档上的信息 介绍 java.util Interface List 参数类型 < E > - 此列表中元素的类型 All Superinterfaces: Collection , Iterable 所有已知实现类: AbstractList , AbstractSequentialList , ArrayList , AttributeList , CopyOnWriteArrayList , LinkedList , RoleList , RoleUnresolvedList
Java中的List
gushendezhufu的博客
11-07 218
List集合概述 有序集合(也称为序列),用户可以精确控制列表中每一个元素的插入位置。用户可以通过整数索引访问元素,并搜索列表中的元素 与Set集合不同,列表通常允许重复的元素 List集合的特点 有序:存储和取出的元素顺序一致 可重复:存储的元素可以重复 ...
写文章

热门文章

  • List集合详细讲解 14373
  • JavaWeb 购物车项目 13601
  • JavaScript 如何使用JS操作CSS 13429
  • JavaScript DOM编程(如何获取HTML标签的父元素和子元素) 12355
  • 使用BootStrap制作网页页面 9170

最新评论

  • JavaScript 网页购物车项目

    weixin_52324306: 有数据库没

  • JavaWeb 购物车项目(一)

    m0_73873922: 请问博主可以提供一下DBHeper.java源码吗,求求了qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 谢谢!!!

  • JavaWeb 购物车项目(一)

    qq_59863554: 请问一下index中的items=“${goods}” 这个goods是哪来的

  • JavaWeb 购物车项目

    Mosesmo: 表情包提醒一下,购物车数据处理页面还有一些空指针异常问题表情包

  • JavaWeb 购物车项目

    Mosesmo: 购物车数据处理页面,c.setSum(c.getSum()*c.getCount());这个语句逻辑错了,应该要用 商品单价*c.getCount()

最新文章

  • XML建模(简单易学)
  • XML文件解析
  • JSP自定义标签01
2022年53篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家大理市玻璃钢雕塑设计如何昆山商场美陈策划丽水景观玻璃钢雕塑设计云溪玻璃钢花盆花器宁德玻璃钢门头雕塑欧式玻璃钢雕塑批发东莞玻璃钢厨师人物雕塑厂家山西定制玻璃钢雕塑制作晋城玻璃钢雕塑河北玻璃钢花盆批发价格伊春玻璃钢雕塑制作厂家常熟商场美陈布展手糊法玻璃钢雕塑设计品牌玻璃钢雕塑设计麻章玻璃钢雕塑厂家玻璃钢雕塑如何挂装青岛玻璃钢花盆销售厂家西宁玻璃钢卡通雕塑定做通化学校玻璃钢雕塑价格长春玻璃钢南瓜屋雕塑三乡玻璃钢雕塑宜春定制玻璃钢雕塑玉树商场美陈广安玻璃钢仿铜雕塑定制革命主题玻璃钢雕塑量大从优通辽景区玻璃钢雕塑厂家北京特色商场美陈费用洛阳镂空校园玻璃钢景观雕塑厂家建邺百货商场美陈安徽水果玻璃钢雕塑哪家便宜香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化