List集合
List 集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引 。 List 集合允许使用重复元素,可以通过索引来访问指定位置的集合元素 。 List 集合默认按元素的添加顺序设置元素
的索引。
import java.util.ArrayList;
import java.util.List;
/**
* @author: 随风飘的云
* @date 2022/03/19 10:43
*/
public class ListTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(6);
list.add(2);
list.add(3);
list.stream().forEach(System.out::println);
}
}
结果:
List接口和Listlterator 接口
List接口API方法
void add(int index, Object element): 将元素 element 插入到 List 集合的 index 处 。
boolean addAll(int index, Collection c): 将集合 c 所包含的所有元素都插入到 List 集合的 index处 。
Object get(int index): 返回 集合 index 索引处的元素。
int indexOf(Object 0): 返回对象 。 在 List 集合中第一次出现的位置索引 。
int lastlndexOf(Object 0): 返回对象 。 在 List 集合中最后一次出现的位置索引 。
Object remove(int index) : 删除并返回 index 索 引处的元素 。
Object set(int index, Object element): 将 index 索引处的元素替换成element对象 ,返回被替换的旧元素 。(不能超出索引范围,不能改变索引长度)
List subList(int fromIndex, int toIndex): 返回从索引 fromlndex (包含)到索引 toIndex (不包含)处所有集合元素组成的子集合 。
void replaceAll(UnaryOperator operator): 根据 operator 指定的计算规则重新设置 List 集合的所有
元素。
void sort(Comparator c): 根据 Comparator 参数对 List 集合的元素排序 。
List 集合可以根据位置索引来访问集合中的元素,因此 List 增加了 一种新的遍历集合元素的方法:使用普通的 for 循环来遍历集合元素 。List 判断两个对象相等的标准是只要通过 equals()方法比较返回 true 即可 。
实例代码:
import java.util.ArrayList;
import java.util.List;
/**
* @author: 随风飘的云
* @date 2022/03/19 11:24
*/
class student{
public boolean equals(Object obj){
return true;
}
}
public class ListTest2 {
public static void main(String[] args) {
List list = new ArrayList();
list.add(new String("我是谁?"));
list.add(new String("你还是那个大爷"));
list.add(new String("我是大爷?"));
list.add(new String("哈哈哈哈"));
// 输出全部
System.out.println(list);
System.out.println();
// 删除第一个元素
list.remove(new student());
System.out.println(list);
System.out.println();
// 再次删除第一个元素
list.remove(new student());
System.out.println(list);
System.out.println();
// 在1的位置添加
list.add(1,new String("我知道我是谁了"));
// 循环输出
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println();
// 两种方式遍历(创建list的时候没有指明泛型,所以只能用Object接收)
for (Object str : list) {
System.out.println(str);
}
System.out.println();
// 删除位置1的数据并返回
System.out.println(list.remove(2));
// 输出第一个这个字符串的位置
System.out.println(list.indexOf(new String("我是大爷?")));
// 输出0到2位置的字符串
System.out.println(list.subList(0,2));
}
}
结果:
List 集合增加了 sort()和 replaceAll()两个常用的默认方法,其中 sort()方法需要一个Comparator 对象来控制元素排序,程序可使用 Lambda 表达式来作为参数:而 replaceAll()方法则需要UnaryOperator 来替换所有集合元素, UnaryOperator 也是一个函数式接口,因此程序也可使用 Lambda表达式作为参数。
实例代码
import java.util.ArrayList;
import java.util.List;
/**
* @author: 随风飘的云
* @date 2022/03/19 11:41
*/
public class ListTest3 {
public static void main(String[] args) {
List books = new ArrayList();
// 向books集合中添加4个元素
books.add(new String("很高兴认识你"));
books.add(new String("你谁啊"));
books.add(new String("我是你爸爸"));
books.add(new String("儿子"));
// 使用目标类型为Comparator的Lambda表达式对List集合排序
books.sort((o1, o2)->((String)o1).length() - ((String)o2).length());
System.out.println(books);
// 使用目标类型为UnaryOperator的Lambda表达式来替换集合中所有元素
// 该Lambda表达式控制使用每个字符串的长度作为新的集合元素
books.replaceAll(ele->((String)ele).length());
System.out.println(books);
}
}
结果:
Listlterator 接口的API方法
List额外提供了一个listIteratorO方法,该方法返回一个Listlterator 对象,ListIterator接口继承了Iterator 接口,提供了专门操作 List 的方法 ,ListIterator 接口在Iterator 接口基础上增加了如下API方法 :
boolean hasPrevious(): 返回该迭代器关联的集合是否还有上一个元素 。
Object previous(): 返回该迭代器的上一个元素。
void add(Object 0): 在指定位置插入一个元素 。
Listlterator接口与Iterator接口对比
1、 Listlterator接口增加了向前迭代的功能。
2、Iterator接口只能向后迭代
3、ListIterator接口可以通过add方法向list集合中添加元素
4、Iterator接口只能删除元素
实例代码:
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
/**
* @author: 随风飘的云
* @date 2022/03/19 11:51
*/
public class ListIteratorTest {
public static void main(String[] args) {
String[] books = {
"12", "234",
"3456"
};
List bookList = new ArrayList();
for (int i = 0; i < books.length ; i++ )
{
bookList.add(books[i]);
}
ListIterator lit = bookList.listIterator();
while (lit.hasNext())
{
System.out.println(lit.next());
lit.add("-------分隔符-------");
}
System.out.println("=======下面开始反向迭代=======");
while(lit.hasPrevious())
{
System.out.println(lit.previous());
}
}
}
结果:
ArrayList 和 Vector 实现类
ArrayList 和 Vector 类都是基于数组实现的 List 类
,所以 ArrayList 和 Vector 类封装了 一个动态的、允许再分配的 Object[]数组 。 ArrayList 或 Vector 对象使用 initialCapacity 参数来设置该数组的长度
, 当向 ArrayList 或 Vector 中添加元素超出了该数组的长度
时,它们的 initialCapacity 会自动增加
。如果向ArrayList或 Vector 集合中添加大量元素时,可使用 ensureCapacity(int minCapacity)
方法 一次性地增加initialCapacity
。这可以减少重分配的次数,从而提高性能 。(ArrayList和Vector最显著的区别是ArrayList是线程不安全的
,程序使用ArrayList类时,如果有超过一个线程改变了ArrayList,那就必须手动保证该集合的同步性。Vector类是线程安全的
)
1、void ensureCapacity(int minCapacity): 将 ArrayList 或 Vector 集合的Object[]数组长度增加大于或等于 minCapacity 值。
2、 void trimToSize(): 调整 ArrayList 或Vector 集合 的 Object[]数组长度为当前元素 的个数 。 调用该方法可减少 ArrayList 或 Vector集合对象占用的存储空间 。
固定List长度(Arrays工具类)
一个操作数组的工具类: Arrays
,该工具类里提供了 asList(Object... a)
方法,该方法可以把一个数组或指定个数的对象转换成一个 List 集合
,这个 List 集合既不是 ArrayList 实现类的实例,也不是 Vector 实现类的实例,而是Arrays 的内部类 ArrayList 的实例 。Arrays.ArrayList 是 一个固定长度的 List 集合,程序只能遍历访问该集合里的元素,不可增加、删除该集合里的元素 。
实例代码
import java.util.Arrays;
import java.util.List;
/**
* @author: 随风飘的云
* @date 2022/03/19 13:44
*/
public class FixedSizeList {
public static void main(String[] args){
List fixedList = Arrays.asList("小红"
, "小明是小红的同学");
// 获取fixedList的实现类,将输出Arrays$ArrayList
System.out.println(fixedList.getClass());
// 使用方法引用遍历集合元素
fixedList.forEach(System.out::println);
// 试图增加、删除元素都会引发UnsupportedOperationException异常
fixedList.add("老师");
fixedList.remove("小红");
}
}
结果: