package com.atguigu.test03;
import java.util.Vector;
import org.junit.Test;
/*
* Vector源码跟踪:
* (1)new Vector():初始化长度为10的数组,默认增量是0
* (2)add(E e):
* 默认扩容为原来的2倍
* 如果你手动指定了capacityIncrement的值,那么可以按照你指定增量进行扩容。
* (3)add(index,e):
* ①考虑扩容
* ②移动元素
* ③添加元素
* ④元素个数增加
* (4)remove(index):
* ①计算要移动元素的个数
* ②如果需要移动,调用System.arraycopy方法进行移动
* ③elementData[--elementCount] = null;
* (5)remove(Object obj)
* ①查找obj的下标
* ②如果不是-1就调用remove(index)进行删除
* (6)indexOf(Object obj)
* 对obj分情况讨论:(1)是null(2)不是null
*/
public class TestVector {
@Test
public void test1(){
Vector v = new Vector();
v.add("1");
v.add(0, "2");//[0]
v.remove(1);
v.remove("1");
int index = v.indexOf("1");
}
}
package com.atguigu.test03;
import java.util.ArrayList;
/*
* ArrayList动态数组:源码跟踪
* (1)new ArrayList():
* JDK1.8版本:发现内部初始化为了一个长度为0的空数组 DEFAULTCAPACITY_EMPTY_ELEMENTDATA
* JDK1.7版本:也是初始化为长度为0的空数组 EMPTY_ELEMENTDATA;
* JDK1.6版本:初始化为长度为10的数组
*
* 为什么要初始化为空数组呢?
* 因为开发中,很多时候创建了ArrayList的对象,但是没有装元素,这个时候的话,如果初始化为10的数组,就浪费空间了。
*
* (2)add(Object e)
*JDK1.8 第一次添加元素,扩容为长度为10的数组
*JDK1.8 如果不够了,再扩容为1.5倍
*
*
*/
@SuppressWarnings("all")
public class TestArrayList {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("hello");
list.add("java");
list.add("chai");
list.add("lin");
ArrayList all = getAll(list);
System.out.println(all);
}
/*
* 这个方法,是一个查询的方法,把查询结果返回
* 例如:查询list中,字符串长度超过5个字符串
*/
public static ArrayList getAll(ArrayList list){
//....
ArrayList result = new ArrayList();
for (Object object : list) {
String str= (String) object;
if(str.length()>5){
result.add(str);
}
}
return result;
}
}
package com.atguigu.test03;
import java.util.Stack;
/*
* Stack:栈 源码分析
*
* (1)peek
* 返回size-1位置的元素
* (2)pop
* ①先peek()返回栈顶元素
* ②删除size-1位置的元素
* (3)push:等价于add
* 把元素添加到[size++]位置
*/
public class TestStack {
public static void main(String[] args) {
Stack s = new Stack();
s.push(1);
s.peek();
s.pop();
}
}
package com.atguigu.test03;
import java.util.LinkedList;
/*
* LinkedList:源码分析
* (1)new LinkedList():什么也没干,没有创建结点
* (2)add(e)
* void linkLast(E e) {
final Node<E> l = last;
//新结点的pre是刚刚的最后一个结点
//新结点的下一个结点是null,没有
final Node<E> newNode = new Node<>(l, e, null);
//新结点成为了最后一个结点
last = newNode;
//如果之前的最后一个结点是null,表示刚才链表是空的
if (l == null)
//新结点同时也是第一个结点
first = newNode;
else
//如果刚才不是空的,原来的最后一个结点的next指向新结点
l.next = newNode;
size++;//元素个数增加
modCount++;
}
*
* (3)删除
E unlink(Node<E> x) {
//x是要被删除的结点
final E element = x.item;//被删除的结点的数据
final Node<E> next = x.next;//被删除结点的下一个结点
final Node<E> prev = x.prev;//被删除结点的上一个结点
if (prev == null) {//说明被删除结点是第一个结点
first = next;//被删除结点的下一个结点称为了第一个结点
} else {//被删除结点不是第一个结点
prev.next = next;//被删除结点的上一个结点的next指向被删除结点的下一个结点
x.prev = null;//把被删除结点与上一个结点断开
}
if (next == null) {//被删除结点是最后一个结点
last = prev;//被删除结点的上一个结点成为了最后一个结点
} else {//被删除结点不是最后一个结点
next.prev = prev;//被删除结点的下一个结点的prev指向被删除结点的上一个结点
x.next = null;//把被删除结点与下一个结点断开
}
x.item = null;//把被删除结点的数据清空
/*
x.prev = null;
x.next = null;
x.next = null;
x彻底称为垃圾
* /
size--;//元素个数减少
modCount++;
return element;
}
*/
public class TestLinkedList {
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.add("xx");
list.remove("xx");
}
}