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 异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值