Java:List(一)——概述
说明
在集合类中,List是最基础的一种集合——有序List。
List的行为和数组几乎相同:List内部按照放入元素先后顺序存放,每个元素都可以通过索引确定自己的位置,List的索引和数组相同,都是从0开始。
我们使用List而不是数组的原因是,使用数组增删元素时,会非常不方便。
在实际应用中,需要增删元素的有序List,我们使用最多的是ArrayList。
0、增删元素的原理
内部数组如果已满,就生成一个更大的数组,把原数组元素复制到新数组,接着用新数组代替原数组。
ArrayList把添加和删除元素的操作封装起来,让我们操作List类似操作数组,却不用关心内部元素如何移动。
1、主要方法
List<E>接口的几个主要方法:
方法返回值 |
方法 |
说明 |
| int | size() | 获取List大小(实际元素个数) |
| boolean | add(E e) | 在末尾加一个元素 |
| boolean | add(int index , E e) | 在指定索引添加一个元素 |
| E | remove(int index) | 删除指定索引处的元素 |
| boolean | remove(Object e) | 删除第一次出现的元素o |
| E | get(int index) | 获取指定索引的元素 |
2、ArrayList与LinkedList
以上方法就是实现List接口的实际类之一ArrayList的主要方法,这种类型内部实际是数组。
还有一种实现List接口的实际类LinkedList,这种类型内部实现是链表。
两者比较:

通常情况下,总是优先使用ArrayList。
3、List的特点
- List内部元素可以重复;
- List可以添加null。
4、创建List
4.1、List.of( ... ):自己指定List中的元素,参数可以是若干元素或者若干元素构成的Array T[]
除了使用ArrayList与LinkedList,我们还可以通过List的of()方法,根据给定元素快速创建List:
List <Integer> list = List.of(1,2,5);
但是List.of( )不接受null值,如果传入null,会抛出NullPointerException异常。
4.2、List.copyOf( Collection<? extends E> coll ):返回指定Collection中的元素构成的List
5、遍历List
5.1、for循环+get方法;
List <String> list = List.of("apple","pear","banana");
for(int i=0; i<list.size(); i++){
String s = list.get(i);
...
}
5.2、迭代器Iterator;
Iterator本身也是一个对象,它由List实例通过Iterator()创建。
使用Iterator,不需要关心List中元素的实际类型,访问效率也是最高的。
Iterator利用两个方法实现遍历:
- boolean hasNext():判断是否有下一个元素;
- E next():返回下一个元素。
List <String> list = List.of("apple","pear","banana");
for ( Iterator <String> it = list.iterator() ; it.hasNext() ; ){
String s = it.next();
...
}
5.3、for each循环(最常用);
Java的for each循环就是利用Iterator遍历的,用起来更方便:
List<String> list = List.of("apple", "pear", "banana");
for (String s : list) {
System.out.println(s);
}
实际上,只要实现了Iterator接口的集合类都可以直接用for each循环来遍历,Java编译器本身不知道如何遍历集合,它只会把for each变成Iterator调用,原因就在于Iterator接口定义了一个Iterator <E> iterator(),强迫集合类必须返回一个Iterator实例。
6、List与Array转换
①List→Array
1、list.toArray():List→Object[ ]
Object [] array = list.toArray();
for (Object s : array){
System.out.println(s);
}
这种方法会丢失类型信息,所以不常用。
2、list.toArray( T[ ] ):List→T[ ]
Integer [] array = list.toArray(new Integer[3]);
//或
Integer [] array = new Integer [3];
list.toArray( array ); for( Integer n : array ){
System.out.println(n);
}
这里的T与构建List接口时定义的泛型E可以不同。比如,我们可以传入一个Number作为T,返回的仍然是Number类型:
List <Integer> list = List.of(1,2,3);
Number [] array = list.toArray(new Number [3]);
for (Number n : list){
System.out.println(n);
}
但是T和E不能不匹配,比如用String[ ]数组去承接List的Integer元素,就会抛出ArrayStoreException这个异常。
如果我们传入的数组大小和实际的List大小不同,那么会有两种情况:
- 传入小数组,会在List内部创建一个新的大小正好的数组,返回;
- 传入大数组,填充元素后多余元素补null。
最常用
实际使用时,为了确保传入一个大小适当的数组,通常在用list.size构建数组:
Integer [] array = list.toArray( new Integer [ list.size() ] );
3、list.toArray( IntFunction <T[ ]> generator )
还有一种更简洁的写法是通过List接口定义的T [ ] toArray( IntFunction <T[ ]> generator )方法:
Integer [] array = list.toArray(Integer[] :: new)
这种函数式写法我们在之后会讲到。
②Array→List
把Array变为List很简单,可以直接通过List.of( T... ):
Integer [] array = [1,2,3];
List<Integer> list = List.of( array );
对于JDK 11之前的版本,可以用Arrays.asList( T... )把Array转为List。
不过,返回的List不一定是ArrayList或LinkedList,因为List只是一个接口,所有返回的List(包括List.of( ... ))都是Read-Only List,只能访问它的元素,而不能对其增删(add、remove方法),如果调用remove、add会抛出UnsupportedOperationException。
Java:List(一)——概述的更多相关文章
- Java Reference简要概述
@(Java)[Reference] Java Reference简要概述 Reference对象封装了其它对象的引用,可以和普通的对象一样操作. Java提供了四种不同类型的引用,引用级别从高到低分 ...
- Notes 20180506 : Java程序设计语言概述
2.Java程序设计语言概述 如果对于开发语言的排行榜有所关注的话,那么会发现很长一段时间以来Java都是位居榜首的高级开发语言,作为一个Java开发者,为此感到骄傲的同时也深感忧虑,骄傲的是自己接触 ...
- (转)Hibernate框架基础——Java对象持久化概述
http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构 说明 ...
- Java:多线程概述与创建方式
目录 Java:多线程概述与创建方式 进程和线程 并发与并行 多线程的优势 线程的创建和启动 继承Thread类 start()和run() 实现Runnable接口 实现Callable接口 创建方 ...
- Java面向对象(概述,构造函数,类与对象的关系,this关键字,成员、局部),匿名对象的调用,构造代码块(5)
Java面向对象(概述,构造函数,类与对象的关系,this关键字,成员.局部),匿名对象的帝爱用,构造代码块(5)
- Java类加载器概述
Java类加载器概述 Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由Java 应用开发人员编写的. 系统提供的类加载器 引导类加载器 它用来加载 Java 的核心库,是用原生 ...
- java基础总结——概述
一.java语言概述 来自维基百科 https://zh.wikipedia.org/wiki/Java Java是一种计算机编程语言,拥有跨平台.面向对象.泛型编程的特性,广泛应用于企业级Web ...
- Java Collection Framework概述
文章出自:听云博客 Collection概述 Java collection是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等. Java集合主要可以划分为4个部分:Li ...
- 【JAVA Properties类概述】
一.概述. 之前说过,该对象是和IO流相结合的技术,所以和IO流结合在一起来讲比较合适. public class Propertiesextends Hashtable<Object,Obje ...
- java容器简要概述
java中集合框架的概述 java集合类主要用于保存对象的. 常用的集合对象: Colletion接口,Collection接口是集合中的顶层容器,表示的是一组对象,它的下面有两个子接口List接口和 ...
随机推荐
- linux下怎么挂载U盘
一般来说linux系统会自动挂载u盘,如果是图形界面,你一插上u盘会自动弹出来文件夹. 如果是命令行界面 使用命令 fdisk -l (root下执行) 显示如下 一般u盘都是fat32格式 ...
- Android开发----Button组件的使用与练习
Button 学习目标: 文字大小.颜色 自定义背景形状 自定义按压效果 点击事件 创建一个新的Activity以增加控件 1.文字大小.颜色 直接在xml文件中定义即可 <Button and ...
- Linux身份鉴别机制原理
传统的UNIX身份鉴别机制原理 传统的UNIX身份鉴别即口令认证方式,它主要通过识别用户的用户名或者UID号获取在/etc/shadow中存放的对应用户密码密文等信息,然后获取用户输入密码并采用cry ...
- v76.01 鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式 | 百篇博客分析OpenHarmony源码
百篇博客分析|本篇为:(共享内存篇) | 进程间最快通讯方式 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) | 同样 ...
- SP5971 LCMSUM - LCM Sum
一个基于观察不依赖于反演的做法. 首先 \(\rm lcm\) 是不好算的,转化为计算 \(\rm gcd\) 的问题,求: \[\sum\limits_{i = 1} ^ n \frac{in}{\ ...
- js 对象的深克隆
前端笔试或者面试的时候,很喜欢问的一个问题就是对象的深度克隆,或者说是对象的深度复制.其实这个问题说容易很容易,但是要说全面也挺不易. 要弄明白对象的克隆,首先要明白js中对象的组成.在js中一切实例 ...
- spring filter详解
一.Filter基本工作原理 1.Filter 程序是一个实现了特殊接口的 Java 类,与 Servlet 类似,也是由 Servlet 容器进行调用和执行的. 2.当在 web.xml 注册了一个 ...
- 认识BufferedReader的readLine、ready,以及InputStream的available
最近,同学做实验的时候,在读取服务器端返回的时候,使用了BufferedReader类的readLine,他是这么写的,while(reader.ready()) {//执行读取操作,即readLin ...
- Java多线程经典案例分享
汇总 案例一 案例二 案例三 案例四 案例五 案例六 案例七 案例一 实现一个容器,提供两个方法,add(),count() 写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数 ...
- 如何快速为团队打造自己的组件库(下)—— 基于 element-ui 为团队打造自己的组件库
文章已收录到 github,欢迎 Watch 和 Star. 简介 在了解 Element 源码架构 的基础上,接下来我们基于 element-ui 为团队打造自己的组件库. 主题配置 基础组件库在 ...