【java】List接口-----ArrayList、LinkedList、Vector-Stack

一、 ArrayList

   

ArrayList list = new ArrayList();   //1.声明
list.Add(T item);      //2.添加元素
list.AddRange(IEnumerable<T> collection);//3.添加一组元素
List<string> mList = new List<string>();
string[] temArr = { "a","sdg", "sddd", "0fg", "Jay", "2333" };
mList.AddRange(temArr);
或list.AddRange(new int{1,2,3,4, 5,6,7,8,9 });

//4.在index位置添加一个元素
list.Insert(int index, T item); 
list.InsertRange(0,new string[] { "张三",“李四”});
//5.遍历List中元素
foreach (T item in mList)  //T的类型与mList声明时一样
{ Console.WriteLine(item ); }
//6.删除一个值item,写谁就删谁
List.Remove(T item);
//7.删除下标为index的元素
List.RemoveAt(int index);   
//8.从下标index开始,删除count个元素
List.RemoveRange(int index, int count);
//9.判断某个元素是否在该List中(返回值为:true/false)
List.Contains(T item);  
//10.给List里面元素排序(默认是元素第一个字母按升序)
List.Sort ();  
//11.给List里面元素顺序反转 (可以与List. Sort ()配合使用,达到想要的效果)
List.Reverse ();  
//12.List清空
List.Clear ();
//13.获得List中元素数目(返回int值)
List.Count ();    

ArrayList 不是线程安全的容器,如果多个线程中至少有两个线程修改了ArrayList 的结构的话就会导致线程安全问题,作为替代条件可以使用线程安全的List,应使用Collections.synchronizedList

List list = Collections . synchronizedList ( new ArrayList (...))
ArrayList具有fail-fast 快速失败机制,能够对ArrayList作出失败检测。当在迭代集合的过程中该集合在结构上发生改变的时候,就有可能会发生fail-fast,即抛出 ConcurrentModificationException 异常。

 

二、Vector 

Vector同ArrayList 一样,都是基于数组实现的,只不过Vector是一个线程安全的容器,它对内部的每个方法都简单粗暴的上锁,避免多线程引起的安全性问题,但是通常这种同步方式需要的开销比较大,因此,访问元素的效率要远远低于ArrayList。

在扩容上,ArrayList 扩容后的数组长度会增加50%,而Vector的扩容长度后数组会增加一倍。

//Vector类有三种构造方法:
Vector v1=new Vector();//构造一个空向量;
Vector v2=new Vector(100);//指定初始存储量100
Vector v3=new Vector(100,50);//指定初始存储量100和容量增量50

//元素添加
v1.addElement("java");   //添加到尾部;
v1.insertElementAt("java", 1);  //指定位置添加;

//元素修改
v1.setElementAt("java",0); //指定位置修改元素;

//元素删除
//该方法将删除向量序列中的第一个与指定的obj对象相同的元素,同时将后面所有的元素前移一个位置,补上位置,该方法返回一个布尔值;
v1.removeElement("obj");   
v1.removeElementAt(1);    //该方法在指定位置删除一个元素;
v1.removeAllElements();  //该方法删除向量全部元素;

//元素查找
//返回一个指定位置的元素,不过这个元素是一个Object类型的对象,在使用之前要进行强制类型转换;
String str=(String) v1.elementAt(0);


boolean contains(Object obj)//该方法检查向量序列中是否包含obj这个对象;
System.out.println(v1.contains("This"));

int indexOf(Objectobj);//该方法返回obj在序列中的下标;
System.out.println(v1.indexOf("This"));

Stack 

Stack继承了Vector类,也是线程安全的

boolean empty() //测试堆栈是否为空。
Object peek( )  //查看堆栈顶部的对象,但不从堆栈中移除它。
Object pop( )  //移除堆栈顶部的对象,并作为此函数的值返回该对象。
Object push(Object element) //把项压入堆栈顶部。
int search(Object element)  //返回对象在堆栈中的位置,以 1 为基数。

(1)Stack实际上也是通过数组去实现的。
       执行push时(即,将元素推入栈中),是通过将元素追加的数组的末尾中。
       执行peek时(即,取出栈顶元素,不执行删除),是返回数组末尾的元素。
       执行pop时(即,取出栈顶元素,并将该元素从栈中删除),是取出数组末尾的元素,然后将该元素从数组中删除。

(2)Java中用来表达栈的能(push/pop/peek),更适用的是使用双端队列接口Deque,并用实现类ArrayDeque/LinkedList来进行初始化。

Deque<Integer> stack = new ArrayDeque<>();
Deque<Integer> stack = new LinkedList<>();
 

不用Stack至少有以下两点原因
1、从性能上来说应该使用Deque代替Stack。

Stack和Vector都是线程安全的,其实多数情况下并不需要做到线程安全,因此没有必要使用Stack。毕竟保证线程安全需要上锁,有额外的系统开销。

2、Stack从Vector继承是个历史遗留问题,JDK官方已建议优先使用Deque的实现类来代替Stack。
 

 三、LinkedList         

  

LinkedList是一个双向链表,允许存储任何元素(包括null )。它的主要特性如下:
        ①LinkedList所有的操作都可以表现为双向性的,索引到链表的操作将遍历从头到尾,
视哪个距离近为遍历顺序。
        ②不是线程安全的,如果多个线程并发访问链表,并且至少其中的一个线程修改了链表的结构,那么这个链表必须进行外部加锁。或者使用
 List list = Collections.synchronizedList(new LinkedList(...))
 

add(E e) //将指定元素添加到此列表的结尾。
add(int index, E element) //在此列表中指定的位置插入指定的元素。
addAll(int index, Collection<? extends E> c) //将指定 collection 中的所有元素从指定位置开始插入此列表。
addFirst(E e) //将指定元素插入此列表的开头。
addLast(E e)  //将指定元素添加到此列表的结尾。
clear()  //从此列表中移除所有元素。
contains(Object o)  //如果此列表包含指定元素,则返回 true。
get(int index)  //返回此列表中指定位置处的元素。
indexOf(Object o) //返回此列表中首次出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。
lastIndexOf(Object o)//返回此列表中最后出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。
offer(E e) //将指定元素添加到此列表的末尾(最后一个元素)。
peek()  //获取但不移除此列表的头(第一个元素)。
poll()  //获取并移除此列表的头(第一个元素)
set(int index, E element) //将此列表中指定位置的元素替换为指定的元素。
size() //返回此列表的元素数。

//创建泛型集合对象

List<T> list=new List<T>();

list.ToArray();   //List泛型集合可以转换为数组

//数组转集合

char[] chs = new char[] { ‘c’, ‘b’, ‘a’};

List<char> listChar = chs.ToList();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值