java List集合

java List集合

List集合是一个元素有序,可以重复的集合,元素默认按照添加顺序设置其索引,集合可以通过索引来对集合中的元素进行操作。(索引从0开始)

ArrayList和Vector类

ArrayList和Vectory是List接口两个常用实现类,它们的底层都是数组,所以它们封装了一个动态允许再分配的Object[]数组,创建集合的时候可以指定数组的长度,如果放入集合的元素超过数组长度,数组的长度初始长度会自动增加。如果不指定集合长度,默认值是10。

ArrayList和Vector还提供了两个方法来重新分配Object[]数组

  1. void ensureCapacity(int minCapacity):
    将ArrayList和Vector集合的Object[]数组长度增加大于等于minCapacity值。

  2. void trimToSize():
    调整ArrayList和Vector集合的Object[]数组长度为当前元素个数。调用该方法可以减少集合对象占用的存储空间

ArrayList和Vector最显著的区别是:ArrayList是线程不安全的,Vector线程是安全的,所以Vector的性能比ArrayList低。Vector是比较古老一个集合,具有很多的缺点所以不推荐使用。

java操作数组有一个工具类Arrays,该工具类提供了asList(Object.. a)方法,该方法可以把一个数组转换成一个List集合,这个集合即不是ArrayList实现类的实例,也不是Vector实现类的实例,而是Arrays的内部类ArrayList的实例。Arrays.ArrayList是一个固定长度的List集合,改集合里的元素不可增加,删除,只能遍历。

public class Test
{
public static void main(String[] args)
{
String[] array = {"aa", "bb", "cc"};
List list = Arrays.asList(array);
System.out.println(list);
list.add("dd"); (1)
System.out.println(array);
}
}

程序编译不会报错,但程序执行到(1)时会报java.lang.UnsupportedOperationException

LinkedList类

LinkedLsit也是List接口实现类,除此之外,还实现了Deque接口,可以被 当成双端队列来使用,因此即可以你被当成栈来使用,也可以当成队列使用。

public class Test
{
public static void main(String[] args)
{
LinkedList linkedList = new LinkedList();
linkedList.addFirst("0"); // 添加元素到列表开头
linkedList.add("1"); // 在列表结尾添加元素
linkedList.add(2,"2"); // 在指定位置添加元素
linkedList.addLast("3"); // 添加元素到列表结尾

System.out.println("LinkedList: "+ linkedList);
System.out.println("getFirst():" + linkedList.getFirst()); // 返回此列表的第一个元素
System.out.println("getLast(): "+ linkedList.getLast()); // 返回此列表的最后一个元素 
System.out.println("removeFirst(): " + linkedList.removeFirst()); // 移除并返回此列表的第一个元素 
System.out.println("removeLast():" + linkedList.removeLast()); // 移除并返回此列表的最后一个元素
System.out.println("After remove:" + linkedList); 
System.out.println("contains(1) is :" + linkedList.contains("1")); // 判断此列表包含指定元素,如果是,则返回true 
System.out.println("size is : " + linkedList.size()); // 返回此列表的元素个数

/************************** 位置访问操作 ************************/
System.out.println("------------------位置访问操作-----------------------");
linkedList.set(1, "3"); // 将此列表中指定位置的元素替换为指定的元素
System.out.println("After set(1, 3):" + linkedList); 
System.out.println("get(1): " + linkedList.get(1)); // 返回此列表中指定位置处的元素


/************************** Queue操作 ************************/
System.out.println("------------------Queue操作-----------------------");
System.out.println("peek():" + linkedList.peek()); // 获取但不移除此列表的头
System.out.println("element(): " + linkedList.element()); // 获取但不移除此列表的头
linkedList.poll(); // 获取并移除此列表的头
System.out.println("After poll():" + linkedList);
linkedList.remove();
System.out.println("After remove():" + linkedList); // 获取并移除此列表的头
linkedList.offer("4");
System.out.println("After offer(4):" + linkedList); // 将指定元素添加到此列表的末尾 

/************************** Deque操作 ************************/
System.out.println("-----------------Deque操作 ------------------------");
linkedList.offerFirst("2"); // 在此列表的开头插入指定的元素
System.out.println("After offerFirst(2):" + linkedList);
linkedList.offerLast("5"); // 在此列表末尾插入指定的元素
System.out.println("After offerLast(5):" + linkedList);
System.out.println("peekFirst(): "+ linkedList.peekFirst()); // 获取但不移除此列表的第一个元素
System.out.println("peekLast(): "+ linkedList.peekLast()); // 获取但不移除此列表的第一个元素
linkedList.pollFirst(); // 获取并移除此列表的第一个元素
System.out.println("After pollFirst():" + linkedList);
linkedList.pollLast();
// 获取并移除此列表的最后一个元素
System.out.println("After pollLast():" + linkedList);
linkedList.push("2"); // 将元素推入此列表所表示的堆栈(插入到列表的头)
System.out.println("After push(2):" + linkedList);
linkedList.pop(); // 从此列表所表示的堆栈处弹出一个元素(获取并移除列表第一个元素)
System.out.println("After pop():" + linkedList);
}
}
LinkedList: [0, 1, 2, 3]
getFirst(): 0
getLast(): 3
removeFirst(): 0
removeLast(): 3
After remove:[1, 2]
contains(1) is :true
size is : 2
------------------位置访问操作-----------------------
After set(1, 3):[1, 3]
get(1): 3
------------------Queue操作-----------------------
peek(): 1
element(): 1
After poll():[3]
After remove():[]
After offer(4):[4]
----------------Deque操作 ------------------------
After offerFirst(2):[2, 4]
After offerLast(5):[2, 4, 5]
peekFirst(): 2
peekLast(): 5
After pollFirst():[4, 5]
After pollLast():[4]
After push(2):[2, 4]
After pop():[4]

LinkedList底层是链表,所以查询性能较差,插入删除性能较好。ArrayList和Vector底层是数组,所以遍历查询性能较好,插入删除性能较差。但总的来说ArrayList的性能比LinkedList的性能要好,因此大部分的时候建议考虑使用ArrayList。

注意:
ArrayList 的 subList 结果不可强转成 ArrayList ,否则会抛出 ClassCastException异常,即 java . util . RandomAccessSubList cannot be cast to java . util . ArrayList 。subList 返回的是 ArrayList 的内部类 SubList ,并不是 ArrayList ,而是ArrayList 的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。在 subList 场景中,高度注意对原集合元素个数的修改,会导致子列表的遍历、增加、删除均会产生 ConcurrentModificationException 异常。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值