【JavaSE_学习笔记】List接口的三个子实现类
【JavaSE_学习笔记】List接口的三个子实现类
ArrayList
面试题:ArrayList无参构造方法默认的容量是多少?容量不够用时,自动增长多少?
ArrayList底层是使用了一个Object数组实现的,往ArrayList中存储数据时,数据实际是存储在了Object数组中,使用无参构造方法时,Object数组的初始容量为10,但容量不够用时自动增长50%
ArrayList特有的方法:
ensureCapacity(int minCapacity):改变ArrayList的初始容量
一般用ArrayList的带参构造实现初始容量
trimToSize():将ArrayList的容量调整为列表的当前大小
ArrayList的特点:
查询速度快,修改也快,增删满,线程不安全,不同步,执行效率高
查询快:因为数组中元素与元素的内存地址是连续的
增慢:因为每次都要检查容量是否够用,还要拷贝内容到新数组
删慢:因为删除数据要将后边的元素拷贝到前边
ArrayList的应用场景:
如果操作的数据查询较多,增删较少,这是应用ArrayList,如图书馆
练习:
import java.util.ArrayList;
import java.util.Iterator;
/**
* 需求:ArrayList去除集合中字符串的重复元素
* 1)首先创建一个集合
* 2)给集合中添加很多重复元素
* 3)再次创建一个新集合
* 4)获取迭代器遍历
* 5)获取到该集合中的每一个元素
* 判断新集合中是否包含这些有素
* 有,不搭理它
* 没有.说明不重复,添加进来
* 6)遍历新集合
* @author Apple
*/
public class ArrayListTest {
public static void main(String[] args) {
//1)创建一个集合
ArrayList array = new ArrayList() ;
//2)给集合中添加多个重复元素
array.add("hello") ;
array.add("hello") ;
array.add("hello") ;
array.add("world") ;
array.add("world") ;
array.add("world") ;
array.add("Java") ;
array.add("Java") ;
array.add("hello") ;
array.add("Javaweb") ;
array.add("JavaEE") ;
array.add("JavaEE") ;
//3)创建一个新的集合
ArrayList newArray = new ArrayList() ;
//4)遍历旧集合,获取当前迭代器对象
Iterator it = array.iterator() ;
while(it.hasNext()){
String s = (String) it.next() ;
//拿到了每一个字符串元素
//判断新集合是否包含旧集合中的元素
if(!newArray.contains(s)){
//不包含,就将元素直接添加到新集合中
newArray.add(s) ;
}
}
//遍历新集合
Iterator it2 = newArray.iterator() ;
while(it2.hasNext()){
String s = (String) it2.next() ;
System.out.println(s);
}
}
}
import java.util.ArrayList;
import java.util.Iterator;
/**
* 需求:ArrayList去除集合中字符串的重复元素,
* 附件条件:不能创建新集合!
* @author Apple
*/
public class ArrayListTest2 {
public static void main(String[] args) {
//创建一个集合,添加重复元素
ArrayList array = new ArrayList() ;
array.add("hello") ;
array.add("hello") ;
array.add("hello") ;
array.add("world") ;
array.add("world") ;
array.add("world") ;
array.add("Java") ;
array.add("Java") ;
array.add("hello") ;
array.add("Javaweb") ;
array.add("JavaEE") ;
array.add("JavaEE") ;
// System.out.println(array);
/**
* 由选择排序的逻辑想到:
* 拿0索引对应的元素依次和后面索引对应的元素进行比较
* 同理,1索引对应的元素和后面.....
* 前面的索引对应的元素如果和后面索引对应的元素重复了,从集合移出后面索引的对应的元素
*/
for(int x = 0 ;x <array.size() -1 ; x ++){
for(int y= x +1 ; y <array.size() ;y++){
//判断
if(array.get(x).equals(array.get(y))){
array.remove(y) ;
y -- ;
}
}
}
//遍历集合
Iterator it = array.iterator() ;
while(it.hasNext()){
String s = (String) it.next() ;
System.out.println(s);
}
}
}
LinkedList
底层使用了链表数据结构实现的
LinkedList的特点:
查询速度慢,修改也慢,增删快,线程不安全,不同步,执行效率高。
查询慢:因为需要从第一个元素开始一个一个查询到目标元素
增快:只需使上一个的地址指向目标元素
删除快:使地址直接指向下下一个元素,下一个元素不再指向下下一个,则将下一个元素删除
LinkedList特有的方法:
void addFirst(E e):把元素添加到集合的首位置
void addLast(E e):把元素添加到集合的末位置
getFirst():获取集合的首位置元素
getLast():获取集合的末尾元素
removeFirst():删除并返回集合的首元素
removeLast():删除并返回集合的末尾元素
队列的数据结构具备的特点:先进先出、后进后出
E push():压栈
E pop():弹栈
栈数据结构具备的特点:先进后出、后进先出
boolean offer(E e):将指定元素添加到此列表末尾
E poll():获取并移除此列表的第一个元素
E peek():获取但不移除此列表的第一个元素
E peekFirst():获取但不移除此列表的第一个元素
若此列表为空,则返回null
E peekLast():获取但不移除此列表的最后一个元素
若此列表为空,则返回null
descendingIterator():返回逆序的迭代器对象
练习:
public class Demo10 {
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.add("张三");
list.add("李四");
list.add("王五");
/* list.addFirst("狗娃");
list.addLast("狗剩");
System.out.println("首元素:"+ list.getFirst());
System.out.println("末尾元素:"+ list.getLast());
System.out.println("删除的首元素:"+ list.removeFirst());
System.out.println("删除末尾元素:"+ list.removeLast());
list.push("狗娃"); //把元素添加到集合的首位置
System.out.println("出栈(删除并返回集合中首元素):"+ list.pop());
list.offer("标哥");
System.out.println("删除并返回集合的首元素:"+ list.poll());
*/
Iterator it = list.descendingIterator();
while(it.hasNext()){
System.out.print(it.next()+",");
}
}
}
ArrayList和LinkedList的存储查找优缺点:
1.ArrayList是采用动态数组存储元素的,允许直接用索引来查找对应的元素,但插入元素要涉及数组元素移动及内存的操作
总结:查找速度快,插入操作慢
2.LinkedList采用双向链表实现存储,按序号索引数据需要进行向前或者向后遍历,但插入数据时只需记录本项的前后项即可,插入速度较快
Vector
一般需求没有指明使用哪种集合去完成,默认采用ArrayList完成
要考虑线程安全时,则使用Vector
特点:
底层数据结构是数组,多线程安全的,执行效率低。同步,查询快,增删满
特有的方法:
void addElement(E obj):在集合末尾添加元素
——->相当于:add(Object e)
E elementAt(int index):返回制定角标的元素
Enumeration elements():返回集合中的所有元素,封装到Enumeration对象中
—–>相当于:Iterator iterator()
Enumeration接口:向量的组件枚举有两个方法
boolean hasMoreElements():——>相当于:hasNext()
Object nextElement():———–>相当于:next()
练习:
import java.util.Enumeration;
import java.util.Vector;
public class VectorDemo {
public static void main(String[] args) {
//创建一个Vector集合对象
Vector v = new Vector() ;
//添加元素
//public void addElement(E obj)
v.addElement("hello");
v.addElement("hello");
v.addElement("world");
v.addElement("Java");
//public Enumeration<E> elements()----->相当于:Iterator iterator() ;
Enumeration en = v.elements() ;
//遍历元素
/**
* boolean hasMoreElements():------>相当于:hasNext()
Object nextElement():----------->相当于:next();
*/
while(en.hasMoreElements()){
//获取元素
String s = (String)en.nextElement() ;
System.out.println(s);
}
}
}
上一篇: Docker 零基础从入门到使用
下一篇: 使table表格横向和垂直滚动