2020年9月23日 Vector、ArrayList、Stack、LinkedList源码跟踪

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");
    }
}

 

posted @ 2020-09-23 16:36  窦云鹏  阅读(113)  评论(0编辑  收藏  举报