List接口

Posted hzhjxx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了List接口相关的知识,希望对你有一定的参考价值。

如图,是左边这部分

 技术分享图片

List:有序,可重复

Set:无序,不可重复

 

1 List接口

1.1 特点

1)它是一个元素存取有序的集合。

2)它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。

3)集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。

 

1.2常用方法

 技术分享图片

在指定位置添加元素add()

获取get(index)

删除remove()

替换set(index)

例:

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

public class ListTest1 {
	public static void main(String[] args) {
		List<String> list=new ArrayList<String>();
		list.add("a");
		list.add("b");
		
		//在指定位置添加元素
		list.add(1,"c");
		System.out.println(list);	
		
		//遍历(通过下标获取)
		for(int i=0;i<list.size();i++){
			System.out.print(list.get(i)+" ");
		}
		
		System.out.println();
		
		//删除指定位置的元素
		String str=list.remove(1);		
		System.out.println("删除:");
		System.out.println(str);
		System.out.println(list);
		
		//替换指定位置上的元素
		list.set(1, "z");
		System.out.println("替换:");
		System.out.println(list);		
	}
}

技术分享图片

 

1.3 Iterator并发修改异常

在迭代过程中,使用了集合的方法对元素进行操作。导致迭代器并不知道集合中的变化,容易引发数据的不确定性。

例:

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

public class IteratorTest {
	public static void main(String[] args) {
		List<String> list=new ArrayList<String>();
		list.add("a");
		list.add("b");
		list.add("c");
		
		Iterator<String> it=list.iterator(); //获取迭代器对象
		//循环遍历
		while(it.hasNext()){
			String s=it.next();
			//如果有元素"b",那么再添加一个元素
			if(s.equals("b")){
				list.add("d");
			}			
		}
	}
}

技术分享图片

所以用迭代器和增强for时,在遍历时不能对元素进行操作。想操作只能用普通for。

 

2集合存储数据的结构

List接口下有很多个集合,它们存储元素所采用的结构方式是不同的,这样就导致了这些集合有它们各自的特点,供给我们在不同的环境下进行使用。

数据存储的常用结构有:堆栈、队列、数组、链表。

 

2.1堆栈

特点:

1)先进后出

2)栈的入口、出口的都是栈的顶端位置

3)压栈:就是存元素

4)弹栈:就是取元素

 

2.2队列

特点:

1)先进先出

2)队列的入口、出口各占一侧。

 

2.3数组结构

特点:

1)查找元素快:因为有索引

2)增删元素慢:因为长度不可变,需要创建新数组

 

2.4链表

多个节点之间,通过地址进行连接。

有数据域和指针域,指针域中存是的下一个数据的地址。

特点:

1)查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素

2)增删元素快(如下图):

增加元素:只需要修改连接下个元素的地址即可。

删除元素:只需要修改连接下个元素的地址即可。

技术分享图片

 

3 ArrayList集合数据存储结构

ArrayList集合数据存储的结构是数组结构。

由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList是最常用的集合。

许多程序员开发时非常随意地使用ArrayList完成任何需求,并不严谨,这种用法是不提倡的。

看需求,是查询多,还是增删多。

 

4 LinkedList集合

LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。

实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。

 

4.1常用方法

技术分享图片 

1)添加

import java.util.LinkedList;
public class Test {
	public static void main(String[] args) {
		LinkedList<Integer> list=new LinkedList<Integer>();
		list.add(1);
		list.add(2);		
		list.addFirst(3);
		list.addFirst(4);
		list.addLast(5);		
		
		System.out.println(list);
	}
}

技术分享图片 

import java.util.LinkedList;
public class Test {
	public static void main(String[] args) {
		LinkedList<Integer> list=new LinkedList<Integer>();
		list.addLast(1);
		list.addLast(2);
		list.add(3);
		list.addFirst(4);
		list.addFirst(5);		
		
		System.out.println(list);
	}
}

技术分享图片

 

2)获取首尾

import java.util.LinkedList;
public class Test {
	public static void main(String[] args) {
		LinkedList<Integer> list=new LinkedList<Integer>();
		list.addLast(1);
		list.addLast(2);
		list.add(3);
		list.addFirst(4);
		list.addFirst(5);
		
		System.out.println(list);
		
		System.out.println("第一个是"+list.getFirst());
		System.out.println("最后一个是"+list.getLast());
	}
}

技术分享图片

 

3)删除首尾

import java.util.LinkedList;
public class Test {
	public static void main(String[] args) {
		LinkedList<Integer> list=new LinkedList<Integer>();
		list.addLast(1);
		list.addLast(2);
		list.add(3);
		list.addFirst(4);
		list.addFirst(5);
		
		System.out.println(list);		
		
		list.removeLast();
		list.removeFirst();
		System.out.println("删除后:");
		System.out.println(list);	
	}
}

技术分享图片

 

4)堆栈顺序存取

import java.util.LinkedList;
public class Test {
	public static void main(String[] args) {
		LinkedList<Integer> list=new LinkedList<Integer>();		
		list.push(1);
		list.push(2);
		list.push(3);
		list.push(4);
		
		System.out.println(list.pop());
		System.out.println(list.pop());
		System.out.println(list.pop());
		System.out.println(list.pop());
	}
}

技术分享图片

 

5)上面例子中,pop()方法,如果集合中没有元素了,再pop,就会报异常

 技术分享图片

所以要加个判断 list.size()!=0,也可以用isEmpty()方法

import java.util.LinkedList;
public class Test {
	public static void main(String[] args) {
		LinkedList<Integer> list=new LinkedList<Integer>();		
		list.push(1);
		list.push(2);
		list.push(3);
		list.push(4);
		
		while(!list.isEmpty()){				
			System.out.println(list.pop());
		}
	}
}

技术分享图片

isEmpty()是Collection继承来的

 

4.2 LinkedList和ArrayList的区别

1)ArrayList是基于动态数组的数据结构,LinkedList是基于链表的数据结构。 
2)对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。 
3)对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 

 

5 Vector集合(过时,了解即可,和Iterator和ArrayList一样的)

Vector集合数据存储的结构是数组结构,为JDK中最早提供的集合。

Vector中提供了一个独特的取出方式,就是枚举Enumeration,它其实就是早期的迭代器。此接口Enumeration的功能与 Iterator 接口的功能是类似的。

Vector集合已被ArrayList替代。枚举Enumeration已被迭代器Iterator替代。

 

5.1 Vector常用方法

 技术分享图片

对比ArrayList:

elementAt()就是ArrayList中的get()

elements() 就是Iterator中获取对象的iterator() 方法

 

5.2 Enumeration枚举常用方法

技术分享图片

对比Iterator:

hasMoreElements() 就是hasNext()

nextElement() 就是next()

 

5.3 Vector和ArrayList对比

Vector是同步的,安全,慢

ArrayList不同步,不安全,快

 



以上是关于List接口的主要内容,如果未能解决你的问题,请参考以下文章

java 代码片段

无法通过接口获取与片段通信的活动

将接口从片段传递到kotlin中的活动

TP5报如下的错误 Indirect modification of overloaded element of thinkpaginatorCollection has no effect(代码片段

常见的代码片段

无法从 onListItemClick 开始片段