一、 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
二、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();