廖雪峰Java5集合-2List-1使用List
1.List定义
List
- List内部按照元素的先后顺序存放
- 每个元素都可以通过索引确定自己的位置
- 类似数组,但大小可变
//List<E>是一种有序链表:
//* List的元素可以重复
//* List的元素可以是null
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args){
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(2);
list.add(null);
list.add(3);
System.out.println(list.size());
System.out.println(list.toString());
}
}
## 2.List常用方法:
* void add(E e) 在末尾添加一个元素
* void add(int index, E e) 在指定索引添加一个元素
* int remove(int index) 删除指定索引的元素
* int remove(Object e) 删除某个元素
* E get(int index) 获取指定索引的元素
* int size() 获取链表大小(包含元素的个数)
3.List特点
List
数组也是有序结构,但是大小固定,且删除元素时需要移动后续元素;因此使用数组添加和删除元素非常不方便。ArrayList是在内部使用数组存储所有元素的的链表。
https://blog.csdn.net/tangyaya8/article/details/76595488/
List有ArrayList和LinkedList两种实现
ArrayList | LinkedList | |
---|---|---|
获取指定元素 | 速度很快 | 需要从头开始查找元素 |
添加元素到末尾 | 速度很快(如果当前List已满,需要重新复制一个新数组) | 速度很快 |
在指定位置添加、删除 | 需要移动元素 | 不需要移动元素 |
内存占用 | 少 | 较大 |
通常情况下,优先使用ArrayList
4.遍历List使用Iterator或者foreach循环
4.1方法一:使用for循环
for循环对于ArrayList效率比较高,对于LinkedList效率比较低
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args){
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("world");
list.add("java");
list.add(null);
list.add("python");
for(int i=0;i<list.size();i++){
String s = list.get(i);
System.out.println(s);
}
}
}
### 4.2方法二:使用iterator
```#java
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main {
public static void main(String[] args){
List
list.add("Hello");
list.add("world");
list.add("java");
list.add(null);
list.add("python");
for(Iterator
String s = it.next();
System.out.println(s);
}
}
}
<img src="https://img2018.cnblogs.com/blog/1418970/201903/1418970-20190306192903671-902400506.png" width="500" />
### 4.3方法三:使用for each循环
```#java
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args){
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("world");
list.add("java");
list.add(null);
list.add("python");
for(String s:list){
System.out.println(s);
}
}
}
5.List和Array可以相互转换
5.1List-->Array
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args){
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("world");
list.add("java");
list.add(null);
list.add("python");
//方法1
Object[] array1 = list.toArray();
System.out.println(Arrays.toString(array1));
//方法2
String[] array2 = list.toArray(new String[5]);
System.out.println(Arrays.toString(array2));
//多余的元素置为null
String[] array3 = list.toArray(new String[6]);
System.out.println(Arrays.toString(array3));
//通常情况下,我们创建长度相等的数组,这样保证list的每一个元素和数组的每个元素一一对应
String[] array4 = list.toArray(new String[list.size()]);
}
}
### 5.2Array-->List
* 方法1:
```#java
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args){
String[] array = {"hello","java","python",null,"world"};
List
//返回的list不是list,而是Arrays内部实现的ArrayList类,
// 而且是只读的,不能增加和删除
System.out.println(list1.getClass());
System.out.println(Arrays.asList(array).getClass());
}
}
<img src="https://img2018.cnblogs.com/blog/1418970/201903/1418970-20190306201100790-399710292.png" width="500" />
* 方法2:
```#java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args){
String[] array = {"hello","java","python",null,"world"};
//创建ArrayList并将只读list添加进去
List<String> list1 = Arrays.asList(array);
List<String> list2 = new ArrayList<>();
list2.addAll(list1);
System.out.println(list2.toString());
System.out.println(list2.getClass());
//将上面的代码整合到一行中
List<String> list3 = new ArrayList<>(Arrays.asList(array));
System.out.println(list3.toString());
System.out.println(list3.getClass());
}
}
6.示例:
import java.util.*;
public class Main {
public static void main(String[] args){
// List<String> list = new ArrayList<>();
List<String> list = new LinkedList<>();
list.add("hello");
list.add("world");
list.add(null);
list.add(3,"java");
list.add(4,"python");
System.out.println(list.getClass()+list.toString());
String[] array = list.toArray(new String[list.size()]);
System.out.println(array.getClass()+Arrays.toString(array));
}
}
7.总结:
List的特点:
- 按索引顺序访问的长度可变的链表
- 优先使用ArrayList而不是LinkedList
- 可以直接使用for each遍历
- 可以和Array相互转换