collection集合--List
List
list(有序、可重复)
1. 有下标,怎么存的怎么取出来,可以存重复值;
2. 用户可以根据元素插入集合中的位置准确的找到相关元素,并通过下标对存进去的元素进行操作
List接口的子类:
ArrayList(查询用的多)
LinkedList(存储用的多);
从Collection继承来的方法带有下标的就是List独有的方法
List及其子类的存储的特点:
堆栈:
1.先进后出(就是在它后面存进去的集合在提取时先被依次取出,待它们取出结束后再取出)
压栈的入口和出口都是栈的顶端位置;
压栈:就是存入元素;
弹栈:就是取出元素
队列:
1.先进先出(存进去的元素要在它前面的元素依次取出后才能取出);
2.入口,出口各占一侧
数组类型的数组集合(ArrayList):
1.查找元素快(通过索引可以快速的找到指定位置的元素;因为有下标所以查询快)
增删元素慢:因为它的长度不可改变,增加或删除一个元素时需要先创建一个新 +++的数组,然后把增加或删除后的数组整个粘进去
2.链表类型的数组集合(LinkedList):由数值域+指针域(存的是下一个元素的地址)组成;多个元素节点之间通过地址链接
查找元素慢(因为没有下标,得通过地址一个一个找);想查找某个元素,需要通过连接的节点,依次向后查找指定元素
2.增删速度快:因为新增或者删除一个元素直接改变元素链接的下一个地址就行;
.ArrayList与LinkedList对比:
。ArrayList是数组类型的集合:查询速度快,增删速度慢,所以多用ArrayList集合存储经常需要查询的数据;多用于查询业务。
。LinkedList是链表类型的集合:增删速度快,查询速度慢,所以多用LinkedList进行存储业务
LinkedList是List的子类,List中的方法LinkedList都是可以使用,这里就不做详细介绍,
我们只需要了解LinkedList的特有方法即可。在开发时,LinkedList集合也可以作为堆栈,队列的结构使用。
Vector集合;就是早期的ArrayList(方法也一样)(和ArrayList一样都是数组类型的);枚举就是现在的迭代器(方法也一样)
List:
增加元素
add(Object e):向集合末尾处,添加指定的元素
add(int index, Object e):向集合指定索引处,添加指定的元素,原有元素依次后移
删除元素删除
remove(Object e):将指定元素对象,从集合中删除,返回值为被删除的元素,(也可以理解为从容器里拿出来,容器里没有这个元素了,比如从果篮里拿出一个苹果,苹果我可以使用,果篮里已经没有这和苹果了)
remove(int index):将指定索引处的元素,从集合中删除,返回值为被删除的元素
替换元素方法
set(int index, Object e):将指定索引处的元素,替换成指定的元素,返回值为替换前的元素
查询元素方法
get(int index):获取指定索引处的元素,并返回该元素
public static void main(String[] args) {
List<String> list=new ArrayList<String>();//因为List是接口不能直接new对象需要借助多态,借助子类ArrayList进行new对象
//指定插入元素
list.add("a");
//指定位置插入元素
list.add(0,"b");//(指定位置,下标,插入的元素)
list.add("c");
//遍历
for(int i=0;i<list.size();i++)
{//因为List具有下标,可以用老式for进行循环取值
System.out.println(list.get(i));
}
//删除指定下标的元素,
String str= list.remove(2);//
这里str是返回值,是把删除的元素返回回来了,str就是删除的那个值
因为这里的返回值是泛型,而List的泛型是String,所以这里用String str来接, .remove(下标),这里的下标填的谁就删除水
System.out.println("删除的元素为"+str);
//修改指定位置上的值
list.set(0, "你好");//(下标,修改的值)
//曾强for
for(String s:list) {//因为这里只是取值并不对值进行增删操作不该变集合的长度,所以可以用增强for
System.out.println(s);
}
}
}
LinkedList:
LinkedList是基于链表的,它是一个双向链表,每个节点维护了一个prev和next指针。同时对于这个链表,维护了first和last指针,first指向第一个元素,last指向最后一个元素。LinkedList是一个无序的链表,按照插入的先后顺序排序,不提供sort方法对内部元素排序。
Add元素:
LinkedList提供了几个添加元素的方法:addFirst、addLast、addAll、add等,时间复杂度为O(1)。
Remove元素:
LinkedList提供了几个移除元素的方法:removeFirst、removeLast、removeFirstOccurrence、remove等,时间复杂度为O(1)。
Get元素:
根据给定的下标index,判断它first节点、last直接距离,如果index<size(数组元素个数)/2,就从first开始。如果大于,就从last开始。这个和我们平常思维不太一样,也许按照我们的习惯,从first开始。这也算是一点小心的优化吧。
遍历
在类集中提供了以下四种的常见输出方式:
1)Iterator:迭代输出,是使用最多的输出方式。
2)ListIterator:是Iterator的子接口,专门用于输出List中的内容。
3)foreach输出:JDK1.5之后提供的新功能,可以输出数组或集合。
4)for循环
代码示例如下:
for的形式:for(int i=0;i<arr.size();i++){...}
foreach的形式: for(int i:arr){...}
iterator的形式:
Iterator it = arr.iterator();
while(it.hasNext()){ object o =it.next(); ...}
LinkedList:public static void main(String[] args){
LinkedList<String> arr=new LinkedList<String>();
arr,addFrist("a"); .addFrist()是把元素添加为第一个元素的意思,
但是后来调用的.addFrist()方法的元素会替代之前用的或者现有的第一个元素
arr.addFrist("b");
arr.addLast("c"); .addLast()是把元素添加为最后一个元素的意思,
但是后来调用的.addLast()方法的元素会替代之前或者现有的最后一个元素
arr.addFrist("d");
for(String s:arr){
system.out.println(s)
}//结果d,b,a,c
//移除第一个位置的元素
arr.removeFirst();
System.out.println( arr.getFirst());//b
//移除最后一个位置的元素
arr.removeLast();
System.out.println(arr.getLast());// c
//清空
arr.clear();
while(!arr.isEmpty()){ //判断集合是否为空
system.out.println(arr.getLast());
}
得到最后一个元素.getLast():system.out.println(arr.getLast()); //判断集合中是否有元素:system.out.println(arr.isEmpty());
结果是false,isEmpty()是判断集合是否为空是否没有值,所以是false如果没有值就返回true