Java学习第十六天知识点(List)
List(I):
1)特点:
a.List是有顺序的接口,所以是有序列表,并且可以使用index定位
b.List允许有重复值
c.List中允许有null
2)常用API(只要带有index,都是List新增的方法):
void add(int index, E element)
boolean addAll(int index, Collection<? extends E> c)
E get(int index)
int lastIndexOf(Object o)
E remove(int index)
E set(int index, E element)
List<E> subList(int fromIndex, int toIndex) - 截取子集合
3)常见实现类:
(1)ArrayList(C):
a.底层数据结构:顺序结构
b.底层实现:数组
c.特点:
①.按照顺序排列,每个元素都带有标号
②.除了有标号是连续的,内存中的物理空间也是连续的
d.优缺点:
优点: 查询速度快(因为有连续的下标,可以根据下标进行查询)
缺点:
a.插入/删除速度慢(插入/删除都是要移动元素的,所以元素一多就会执行效率慢)
b.内存的物理空间是连续的,利用不到碎片空间
(2)Vector(C)
a.底层数据结构:顺序结构
b.底层实现:数组
c.特点:
①.全部和ArrayList一样
②.Vector上带有线程同步锁(synchronized),所以是线程安全的,效率低
d.优缺点:
全部和ArrayList一样
(3)LinkedList(C)
a.底层数据结构:链式结构
b.底层实现:Node节点(data[数据] + next[下一个节点的引用])
c.特点:
①.LinkedList是双向链表
①.链表是内存中固定顺序,但是他的物理空间不连续
②.没有下标
③.所有节点的访问,都必须通过头节点(next)/尾节点(pre)
④.head(头节点): 只存next,不存data
last(尾节点): 只存pre,不存data
⑤.head.next = null -> 空链表
last.pre = null -> 空链表
d.优缺点:
优点:
a.插入/删除效率高
b.不需要连续的内存物理空间,所以空间利用率高
缺点:
查询效率低,只能从头节点出发开始查询
e.LinkedList独有的API:
(只要带有First/last的方法)
void addFirst(E e)
void addLast(E e)
E getFirst()
E getLast()
E remove(int index)
E removeFirst()
E removeLast()
(4)常见提问:
a.ArrayList 和 LinkedList的区别
a.数据结构上的区别 一个用数组实现,一个用链表实现
b.ArrayList -> 增删慢,查询快
LinkedList -> 增删快,查询慢
总结:
在使用List集合时,会选择ArrayList,在综所有条件之后,ArrayList插入和查询的效率高于LinkedList.
b.ArrayList 和 Vector的区别
a.线程安全
ArrayList不带锁,线程不安全,效率高
Vector带锁,线程安全,效率低
b.扩容问题
ArrayList扩容为原容量的1.5倍
Vector扩容为原容量的2package day02;
数组尝试实现ArrayList:
import java.util.Arrays;
public class MyArrayList {
Object[] arr=new Object[0];
int size=0;
public void add(Object obj)
{
if (size==arr.length){
arr= Arrays.copyOf(arr,arr.length+1);
}
arr[size]=obj;
size++;
}
public void addIndex(int index,Object obj)
{
if (size==arr.length){
arr= Arrays.copyOf(arr,arr.length+1);
}
for (int i = arr.length-1; i >index; i--) {
arr[i]=arr[i-1];
}
arr[index]=obj;
size++;
}
public Object deleteIndex(int index)
{
if (index>size){
}
Object temp=arr[index];
for (int i = index; i <size-1; i++) {
arr[i]=arr[i+1];
}
arr[size-1]=null;
arr= Arrays.copyOf(arr,arr.length-1);
size--;
return temp;
}
public void deleteObject(Object obj)
{
int index=0;
for (int i = 0; i < size; i++) {
if (arr[i]==obj){
index=i;break;
}
}
for (int i = index; i <size-1; i++) {
arr[i]=arr[i+1];
}
arr[size-1]=null;
arr= Arrays.copyOf(arr,arr.length-1);
size--;
}
public Object changeIndex(int index,Object obj)
{
Object temp=arr[index];
arr[index]=obj;
return temp;
}
public Object getIndex(int index)
{
return arr[index];
}
public Object getSize()
{
return size;
}
public Boolean haveObject(Object obj)
{
for (int i = 0; i < size; i++) {
if (arr[i]==obj){
return true;
}
}
return false;
}
public Boolean isEmpty(){
for (int i = 0; i <=size; i++) {
if (size==0||arr[i]==null&&i==size){
return true;
}
else if (arr[i]!=null){
return false;
}
}
return null;
}
public void print(){
for (int i = 0; i < size; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
}
public String toString(){
//转为
StringBuilder sb=new StringBuilder("[");
for (int i = 0; i < size; i++) {
sb.append(arr[i]+",");
}
sb.deleteCharAt(sb.length()-1);
sb.append("]");
//sb.replace(sb.length()-1,sb.length()-1,"]");
//用这个会有null
//return Arrays.toString(arr);
return sb.toString();
}
}