你好,今天刚刚学完List体系,正好自己总结一下,也希望能够帮到你,我先简单列一下以后常用的几个方法,再简单说一下他们的数据结构,然后再举个例字,你就会明白了
|--List 常用方法
add(int index,Object obj),添加指定的元素到指定索引处
get(int index),获取指定索引处的元素
indexOf(Object obj),返回指定元素在集合中第一次出现的索引值,如果不存在,返回-1
set(int index,Object obj)设置指定索引处的值(也就是替换),返回的是被替换掉的元素
listIterator(),List特有的迭代器
subList(int start,int end),截取指定区间的元素
remove(int index)移除指定索引处的元素,返回的是被移除的元素
|--ArrayList 特殊方法几乎没有
|--LinkedList
addFirst,添加指定元素到当前集合第一个位置
addLast添加指定元素到当前集合的最后位置
removeFirst,移除第一个元素
removeLast,移除最后一个元素
getFirst,获取集合第一个元素
getLast,获取元素最后一个元素
下面方法JDK6以后被替代了(不用看)
offerFirst,offerLast,pollFirst,pollLast,peekFirst,peekLast
|--Vector
addElement(Object obj),添加指定元素到当前集合第一个位置
elements() 暂时不用掌握
首先说数据结构:
ArrayList和Vector底层都是以数组的形式实现的
LinkedList底层是以链表的形式实现的
几种数据结构:
A:栈 先进后出 Stack(就像是一个只能单人通过的死胡同,第一个进去的只能最后一个出来)
B:队列 先进先出 Queue(就像是排队买火车票,排在前边的人肯定比排在后边的人先买到票)
C:数组 查询效率高.增删慢(就像是基本的数组一样,每个元素都有自己的下标,查询只需要按照下标寻找即可)
这个就不再弄图啦
D:链表 查询效率低.增删快(就像是去某个地方倒公交车一样,你到达不了下一站就没办法到达下一站能去到的地方)
特点
A:ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
轻量级(版本高)
B:Vector
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
重量级(版本低)
C:LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
那么,究竟用谁呢?
看需求:
是否要安全:
是:Vector
否:ArrayList或者LinkedList
查询多:ArrayList
就像上课用的课表,可以每个人都标上各自标号,因为平时一个班的人不会经常添加或走
增删多:LinkedList
如果你什么都不懂,那么就用ArrayList。
还有几个经典的面试题:
选择题:如果在实际开发中让你自己做一个栈,你会通过哪种方式实现?
A.java.util.Stack(javaAPI中提供的栈)
B.数组
C:LinkedList
答案是: C
我们可以用java提供给我们的现成的栈去当我们自己的类的属性,这样就可以屏蔽掉那些自己不想用的方法,而只用对自己有用的方法,在外界是看不到我们具体方法的实现的.代码如下:
import java.util.Stack;
public MyStack{
//成员变量
private Stack st;
//构造方法
public MyStack(){
Stack st = new Stack();}//将java提供给我们的Stack作为我的属性,这样就可以用对我们有用的方法
public Object pop(){//移除堆栈顶部的对象,并作为此函数的值返回该对象。
return st.pop;
}
public Object push(Object o){//把项压入堆栈顶部。
st.push(Object o);
}
}
原因是: A它继承了Vector,就是继承了它的数组实现形式,这并不是重要的,关键是他也继承了Vector的所有不是私有的方法,这些方法中有好多是不适用与栈的,比如可以随意的插入元素,那么就违反了栈的原则
B:自己数组实现太麻烦,而且开发中不可能用数组自己实现
给你说这么多就是现在我们还不太清楚具体该用什么集合,只需要记住他的原则就行了,到了实际开发的时候,自己经历了也就慢慢的明白了,有些事就是这样,不用去纠结到底怎么样,只需要记住原则,慢慢的就明白了
这个题很有用的哦,原因记住吧,希望能帮到你哈
|