JAVA集合——List系列(ArrayList、LinkedList)

  • Post author:
  • Post category:java



个人简介

  • 大家好,我是韩慧腾。一名正在努力学JAVA的大一小白,本文章为初学的笔记,希望各位多多指教。💙
  • 欢迎点赞+收藏+留言💜
  • 还在犹豫吗?就做自己吧!🧡

一、List系列

List系列有ArrayList、LinkedList类;其特点最主要的就是有序、可重复、有索引。有序就是存储和取出的元素顺序一致,有索引就是可以通过索引操作元素,重复就是存储的元素可以重复。

List特有方法:

代码演示

package Stickto;

import java.util.ArrayList;
import java.util.List;
/*
 * 讲述List特有方法
 */
public class List_00 {

	public static void main(String[] args) {
		// 用多态形式创建一个List对象
		List<String> l=new ArrayList<>();
		//为List对象添加一些元素
		l.add("JAVA");
		l.add("python");
		l.add("HTML");
		l.add("javascript");
		//在某个索引处添加元素
		l.add(2,"C");
		System.out.println(l);//在索引值为2的地方是C元素
		//用索引值删除元素,返回值是删除的元素
		System.out.println(l.remove(2));//结果:C
		//通过索引值获取该位置的元素
		System.out.println(l.get(1));//结果:python
		//修改索引位置的元素
		l.set(0, "java");//把JAVA改为java,返回值是原来元素
		System.out.println(l);//结果:[java, python, HTML, javascript]
        l.clear();//可以调用Collectiion方法,清空集合所有元素
	}

}

List集合的遍历方式:代码演示:

package Stickto;

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

public class List_01 {

	public static void main(String[] args) {
		List<String> l=new ArrayList<>();
		l.add("小明");
		l.add("小刚");
		l.add("小王");
		l.add("小韩");
		//1.for循环遍历
		for(int i=0;i<l.size();i++) {
			String s=l.get(i);
			System.out.println(s);
		}
		System.out.println("----------------");
		//2.迭代器遍历
		Iterator it=l.iterator();
		while(it.hasNext()) {
			String ss=(String) it.next();
			System.out.println(ss);
		}
		System.out.println("----------------");
		//3.foreach遍历
		for(String i:l) {
			System.out.println(i);
		}
		System.out.println("----------------");
		//4.Lambda表达式遍历
		l.forEach((s)->System.out.println(s));
	}

}

ArrayList类:底层是基于数组实现的,查询元素快,增删相对慢。第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组。存满数据会进行扩容(1.5倍)

LinkedList类:底层基于双链表实现的,查询元素慢,增删首尾元素是非常快的。

LinkedList独有方法(体现在First Last):因为LinkedList方法解决首尾元素是非常方便的

package Stickto;

import java.util.LinkedList;
//数据结构可以根据现实一些情况理解
public class LinkedList_00 {

	public static void main(String[] args) {
		//数据结构之栈
		LinkedList<String> l=new LinkedList<>();
		l.addFirst("第一颗子弹");//压栈API:push
		l.addFirst("第二颗子弹");
		l.addFirst("第三颗子弹");
		l.addFirst("第四颗子弹");
		l.addFirst("第五颗子弹");
		System.out.println(l);//结果:[第五颗子弹, 第四颗子弹, 第三颗子弹, 第二颗子弹, 第一颗子弹]
		System.out.println(l.getFirst());//结果:第五颗子弹。此处并不会影响集合l
		System.out.println(l.removeFirst());//出栈API:pop。结果:第五颗子弹
		System.out.println(l.removeFirst());//出栈。结果:第四颗子弹
		System.out.println(l.removeFirst());//出栈。结果:第三颗子弹
		System.out.println(l.removeFirst());//出栈。结果:第二颗子弹
		//队列
		LinkedList<String> s=new LinkedList<>();
		s.addLast("第一颗子弹");//入队API:offerLast
		s.addLast("第二颗子弹");
		s.addLast("第三颗子弹");
		s.addLast("第四颗子弹");
		System.out.println(s);
		//出队
		System.out.println(s.removeFirst());//第一颗子弹 
		System.out.println(s.removeFirst());//第二颗子弹
		System.out.println(s.removeFirst());//第三颗子弹
	}

}

补充:集合的并发修改异常问题(主要是在删除元素时候)

代码演示:

package Stickto;

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

public class List_002 {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		List<String> l=new ArrayList<>();
		l.add("JAVA");
		l.add("小王");
		l.add("小明");
		l.add("JAVA");
		//迭代器删除元素,注意要用迭代器对象去remove,不能用集合.remove,否则会报错
		Iterator it=l.iterator();
		while(it.hasNext()) {
			String ele=(String) it.next();
			if("JAVA".equals(ele)) {
				//l.remove("JAVA");//会出现如下的报错
	/*Exception in thread "main" java.util.ConcurrentModificationException
	at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013)
	at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967)
	at Stickto.List_002.main(List_002.java:18)*/
				it.remove();
			}
		}
		System.out.println(l);//结果:[小王, 小明]
	
	}

}

通常删除元素:用上述代码中演示的方法,迭代器的方法删除元素(注意不是用集合的remove方法,是用迭代器的remove方法);使用for循环删除元素,但是要从最后一个元素开始删除,否则会出现删除不干净的情况。不能用foreach遍历方式删除



版权声明:本文为weixin_65049289原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。