个人学习笔记之Java集合源码解析(List)

目录

  • 引言
  • List
    • List常用方法介绍
      • boolean add(E e)
        • 结果分析
        • 错误分析
      • void add(int index,E element)
        • 结果分析
      • void clear()
      • boolean contains(Object o)
      • boolean equals(Object o)
      • boolean isEmpty()
      • boolean remove(Object o)
      • E set(int index,E element)
      • int size()
      • Object[] toArray()
      • T[] toArray(T[] a)
        • 结果分析

引言

本人是第一次写博客,用于记录巩固学习过程中所理解到的知识,您若在观看中,发现其中知识残缺或表达错误,请联系我,我会非常感谢您对我的帮助。

List

List常用方法介绍

先来看一下List集合的所有方法
个人学习笔记之Java集合源码解析(List)_第1张图片

boolean add(E e)

来一睹boolean add(E e)的源码注解的风采

    /**
     * Appends the specified element to the end of this list (optional operation).
     * 

Lists that support this operation may place limitations on what * elements may be added to this list. In particular, some * lists will refuse to add null elements, and others will impose * restrictions on the type of elements that may be added. List * classes should clearly specify in their documentation any restrictions * on what elements may be added. * * @param e element to be appended to this list * @return true (as specified by {@link Collection#add}) * @throws UnsupportedOperationException if the add operation * is not supported by this list * @throws ClassCastException if the class of the specified element * prevents it from being added to this list * @throws NullPointerException if the specified element is null and this * list does not permit null elements * @throws IllegalArgumentException if some property of this element * prevents it from being added to this list */

方法说明:
支持该操作的列表可能对列表可以添加的元素有一些限制。特别是某些列表将拒绝添加 null 元素,其他列表将在可能添加的元素类型上施加限制。List 类应该在它们的文档中明确指定有关添加元素的所有限制。

param
e - 要追加到列表的元素。
throw exception
UnsupportedOperationException - 如果列表不支持 add 方法。
ClassCastException - 如果指定元素的类不允许它添加到此列表。
NullPointerException - 如果指定的元素为 null,并且此列表不支持 null 元素。
IllegalArgumentException - 如果此元素的某个方面不允许它添加到此列表。

PS:
以上摘抄JAVA_API文档

如何简单理解这段文字?
请看实例:

	@Test
	public void TestA() {
		List<String> l1 = new ArrayList<>();
		l1.add("a");
		l1.add("");
		l1.add(1);//编译报错
		l1.add('A');//编译报错
		System.out.println("TestA.List==" + l1);
	}
	@Test
	public void TestB() {
		List<Object> l2 = new ArrayList<>();
		l2.add(new Byte((byte) 1));
		l2.add(new Short((short) 1));
		l2.add(new Integer(3));
		l2.add(new Long(3));
		l2.add(new Float(5.1));
		l2.add(new Double(5.1));
		l2.add(new Character('A'));
		l2.add(new Boolean(false));
		Object[] list = l2.toArray();
		System.out.print("TestB.Object[]==");
		for (int i = 0; i < list.length - 1; i++) {
			System.out.print(list[i] + ",");
		}
		System.out.println(list[list.length - 1]);
		System.out.println("TestB.List==" + l2);
	}
	@Test
	public void TestC() {
		List<Integer> l3 = new ArrayList<>();
		l3.add("c");//编译报错
		l3.add(3);
		l3.add('C');//编译报错
		l3.add("");//编译报错
		System.out.println("TestC.List==" + l3);
	}
 
  

输出结果

TestB.Object[]==1,1,3,3,5.1,5.1,A,false
TestB.List<Object>==[1, 1, 3, 3, 5.1, 5.1, A, false]

结果分析

1):当List<>集合内置元素限定为String或其他类型时,不能往集合中添加除了String类型的其他元素。但是当集合内置元素设置为Object类型时,可以往集合中添加任意类型的数据。
2):add()方法往集合中添加元素时,从元素末尾开始加入。
3):List集合是有序的、允许重复值存入
4):通过toArray(T[] a)方法,可以将集合转换成数组,其数组类型为集合内置元素类型。例如:

List<Integer> list = new ArrayList<>();
Integer[] intList =  list.toArray(new Integer[10]);

错误分析

TestA与TestC报错原因:java.lang.Error:Unresolved compilation problems
TestA与TestC报错的主要原因是:add()方法添加的元素与数组定义的元素不匹配。

void add(int index,E element)

注:以下暂不注源码英文,均用JAVA_API文档方法说明代替。

方法说明:
在列表的指定位置插入指定元素(可选操作)。将当前处于该位置的元素(如果有的话)和所有后续元素向右移动(在其索引中加 1)。

param
index - 要在其中插入指定元素处的索引。(集合下标从0开始计数)
element - 要插入的元素。
throw exception
UnsupportedOperationException - 如果列表不支持 add 方法。
ClassCastException - 如果指定元素的类不允许它添加到此列表。
NullPointerException - 如果指定的元素为 null,并且此列表不支持 null 元素。
IllegalArgumentException - 如果此元素的某个方面不允许它添加到此列表。
IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index > size())。
PS:
以上摘抄JAVA_API文档

请看实例:

	@Test
	public void TestA() {
		List<String> insert = new ArrayList<>();
		insert.add("AA");
		insert.add("BB");
		List<String> List = new ArrayList<>();
		List.add("1");
		List.add("2");
		List.add("3");
		
		List.add(0, "A");
		List.add(2, "B");
		System.out.println("在集合下标为'0,2'的位置上插入指定元素'A,B'--->" + List);
		
		System.out.println("与add()方法相同原理的addAll(),如下");
		
		List.addAll(insert);
		System.out.println("在集合元素的末尾插入指定集合" + insert + "--->" + List);
		
		List.addAll(0, insert);
		System.out.println("在集合下标为'0'的位置上插入指定集合" + insert + "--->" + List);
	}

输出结果

在集合下标为'0,2'的位置上插入指定元素'A,B'--->[A, 1, B, 2, 3]add()方法相同原理的addAll(),如下
在集合元素的末尾插入指定集合[AA, BB]--->[A, 1, B, 2, 3, AA, BB]
在集合下标为'0'的位置上插入指定集合[AA, BB]--->[AA, BB, A, 1, B, 2, 3, AA, BB]

结果分析

void add(int index,E element)方法中的参数,index是要在集合中插入指定元素处的索引,element是插入的元素。
那么,java中,既然有向集合添加指定元素的方法,那就一定有向集合添加指定元素集(也就是集合)的方法,且两者之间的方法原理是一模一样的,既然已经知道boolean add(E o)与void add(int index,E element)的原理,那么另外两种addAll()方法想必也是信手拈来。在此不做说明

void clear()

方法说明:
从列表中移除所有元素(可选操作)。此调用返回后列表将是空的(除非它抛出异常)。

请看实例:

	@Test
	public void TestClear() {
		List<String> insert = new ArrayList<>();
		insert.add("别删我");
		insert.add("秋梨膏");
		insert.clear();
		System.out.println("TestClear.List=="+insert);
	}

输出结果

TestClear.List<String>==[]

boolean contains(Object o)

方法说明:
如果列表包含指定的元素,则返回 true。更正式地说,当且仅当列表包含的元素 e 满足下列条件时才返回 true。

param
o - 要测试列表中是否存在的元素
throw exception
ClassCastException - 如果指定元素的类型和此列表不兼容(可选)。
NullPointerException - 如果指定的元素为 null,并且此列表不支持 null 元素(可选)。
boolean containsAll(Collection c)
NullPointerException - 如果指定的 collection 为 null。

请看实例:

	@Test
	public void TestContains() {
		List<String> insert = new ArrayList<>();
		insert.add("ABC");
		insert.add("C");
		insert.add("CDE");
		String flag="C";
		System.out.println("\n判断"+insert+"集合中是否包含["+flag+"]元素"+insert.contains("C"));
		//insert.containsAll(list)
		List<String> list = new ArrayList<>();
		list.add("A");
		list.add("B");
		list.add("C");
		System.out.println("判断"+insert+"集合中是否包含"+list+"集合的所有元素--->" + insert.containsAll(list));
	}

其中contains()方法的底层原理就是通过遍历集合元素,逐个判断。

		for(String s : insert) {//for(int i=0;i
			System.out.println( s == flag);
		}

输出结果

判断集合是否包含'C'元素--->false
判断insert集合中是否包含list集合的所有元素--->false

boolean equals(Object o)

方法说明:
比较指定的对象与列表是否相等。当且仅当指定的对象也是一个列表、两个列表有相同的大小,并且两个列表中的所有相应的元素对相等时才返回 true,此时这两个元素 e1 和 e2 是相等的)。换句话说,如果所定义的两个列表以相同的顺序包含相同的元素,那么它们是相等的。该定义确保了 equals 方法在 List 接口的不同实现间正常工作。

param
o - 要与此列表进行相等性比较的对象。

请看实例:

	@Test
	public void TestEquals() {
		List<String> ListA = new ArrayList<>();
		ListA.add("ABC");

		List<String> ListB = new ArrayList<>();
		ListB.add("ABC");

		System.out.println("ListA.equals(ListB)--->(" + ListA + "==" + ListB + ")==" + ListA.equals(ListB));
	}

输出结果

ListA.equals(ListB)--->([ABC]==[ABC])==true

boolean isEmpty()

方法说明:
如果列表不包含元素,则返回 true。

请看实例:

	@Test
	public void TestIsEmpty() {
		List<String> ListA = new ArrayList<>();
		ListA.add("ABC");
		System.out.println("判断当前集合内元素是否存在ListA.isEmpty()--->判断"+ListA+"是否为空:"+ListA.isEmpty());
	}

输出结果

判断当前集合内元素是否存在 ListA.isEmpty()--->判断[ABC]是否为空:false

boolean remove(Object o)

方法说明:
移除列表中出现的首个指定元素(可选操作)。如果列表不包含元素,则不更改列表。更正式地说,移除具有满足下面条件的最低索引 i 的元素:(o==null ? get(i)==null : o.equals(get(i)))(如果存在这样的元素)。
请看实例:

param
o - 要从该列表中移除的元素,如果存在的话。
throw exception
ClassCastException - 如果指定元素的类型和此列表不兼容(可选)。
NullPointerException - 如果指定的元素是 null,并且此列表不支持 null 元素(可选)。
UnsupportedOperationException - 如果列表不支持 remove 方法。

请看实例:

	@Test
	public void TestMove() {
		List<String> list = new ArrayList<>();
		list.add("AB");
		System.out.println("若list集合不存在指定元素,则返回false且原集合元素不改变--->" + list.remove("A") + "," + list + "");
		list.add("A");
		list.add("A");
		System.out.println("原list集合元素--->" + list);
		System.out.println("执行list.remove(A)--->"+list.remove("A"));
		System.out.println("list集合剩余元素--->"+list);
		System.out.println();
		// boolean removeAll(Collection c)
		List<String> lists = new ArrayList<>();
		lists.add("A");
		lists.add("B");
		List<String> DeleteList = new ArrayList<>();
		DeleteList.add("B");
		DeleteList.add("C");
		System.out.println("原lists集合元素--->" + lists);
		System.out.println("执行lists.removeAll(listsDelte)操作--->" + lists.removeAll(DeleteList));
		System.out.println("剩下的lists元素--->" + lists);
	}

输出结果

若list集合不存在指定元素,则返回false且原集合元素不改变--->false,[AB]
原list集合元素--->[AB, A, A]
执行list.remove(A)--->true
list集合剩余元素--->[AB, A]

原lists集合元素--->[A, B]
执行lists.removeAll(listsDelte)操作--->true
剩下的lists元素--->[A]

E set(int index,E element)

方法说明:
用指定元素替换列表中指定位置的元素(可选操作)。

param
index - 要替换的元素的索引。
element - 要在指定位置存储的元素。
throw exception
UnsupportedOperationException - 如果列表不支持 set 方法。
ClassCastException - 如果指定元素的类不允许它添加到此列表。
NullPointerException - 如果指定的元素为 null,并且此列表不支持 null 元素。
IllegalArgumentException - 如果指定元素的某个方面不允许它添加到此列表。
IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index >= size())。

请看实例:

	@Test
	public void TestSet() {
		List<String> lists = new ArrayList<>();
		lists.add("A");
		lists.add("B");
		lists.add("C");
		System.out.println("原lists集合--->"+lists);
		lists.set(1,"G");
		System.out.println("将'G'覆盖指定下标的元素后,lists集合--->"+lists);
	}

输出结果

原lists集合--->[A, B, C]'G'替换指定位子的元素后,lists集合--->[A, G, C]

int size()

方法说明:
返回列表中的元素数。如果列表包含多于 Integer.MAX_VALUE 个元素,则返回 Integer.MAX_VALUE。

请看实例:

	@Test
	public void TestSize() {
		List<Integer> lists=new ArrayList<>();
		System.out.println("Integer.MAX_VALUE=="+Integer.MAX_VALUE);
		System.out.println("Long.MAX_VALUE=="+Long.MAX_VALUE);
		int a=0;
		while(lists.size()<5) {
			lists.add(a);
			a++;
			System.out.print(lists);
		}
		System.out.println("\nlists集合大小--->"+lists.size());
	}

输出结果

Integer.MAX_VALUE==2147483647
Long.MAX_VALUE==9223372036854775807
[0][0, 1][0, 1, 2][0, 1, 2, 3][0, 1, 2, 3, 4]
lists集合大小--->5

Object[] toArray()

个人学习笔记之Java集合源码解析(List)_第2张图片

方法说明:
返回以正确顺序包含列表中的所有元素的数组。遵守 Collection.toArray 方法的常规协定。

请看实例:

	@Test
	public void TestToArray() {
		List<Character> lists=new ArrayList<>();
		lists.add('A');
		lists.add('B');
		lists.add('C');
		Object[] arrayList = lists.toArray();
		System.out.println("arrayList.length数组长度--->"+arrayList.length);
		System.out.println("数组不能这样直接输出,否则就是这样--->"+arrayList);
		System.out.print("[");
		for (int i = 0; i < arrayList.length - 1; i++) {
			System.out.print(arrayList[i] + ",");
		}
		System.out.println("arrayList数组元素--->"+arrayList[arrayList.length - 1]+"]");
	}

输出结果

arrayList.length数组长度--->3
数组不能这样直接输出,否则就是这样--->[Ljava.lang.Object;@5680a178
[A,B,arrayList数组元素--->C]

T[] toArray(T[] a)

方法说明:
返回以正确顺序包含列表中的所有元素的数组。遵守 Collection.toArray 方法的常规协定。

param
a - 要存储列表中元素的数组,如果它足够大的话;否则为此目的分配一个运行时类型相同的新数组。
throw exception
ArrayStoreException - 如果指定数组的运行时类型不是此列表中每个元素的运行时类型的超类型。
NullPointerException - 如果指定数组为 null。

请看实例:

	@Test
	public void TestToArray2() {
		List<String> list=new ArrayList<>();
		list.add("Q");
		list.add("W");
		list.add("E");
		String[] strList = list.toArray(new String[5]);
		System.out.print("arrayList数组元素--->[");
		for (int i = 0; i < strList.length - 1; i++) {
			System.out.print(strList[i] + ",");
		}
		System.out.println(""+strList[strList.length - 1]+"]");
	}

输出结果

arrayList数组元素--->[Q,W,E,null,null]

结果分析

输出strList数组中的null是由于new String[5]将strList数组长度定义为5,这表明strList数组里一共有5个元素,若toArray()方法转换时,集合元素不够数组长度,则数组会按照String类型的初始值(null)定义为剩余数组元素。

你可能感兴趣的:(Java集合,List,学习笔记,集合源码,List集合)