动态数组--第二天

1.什么是数据结构

 2.线性表

 3.数组

 4.动态数组的结构设计

 5.动态数组的设计

5.1 添加元素add(E element)

 

 5.2 打印数组

 5.3 删除元素  remove(int index)

 5.4 添加元素add(int index ,E element)

 5.5 如何扩容

 5.6 泛型

 5.7 对象数组

 5.8 内存管理

 5.8 null的处理

 6.动态数组的代码分析

6.1--ArrayLis 类

@SuppressWarnings("unchecked")
public class ArrayList<E> {
    /**
     * 元素的数量
     */
    private int size;
    /**
     * 所有的元素
     */
    private E[] elements;
    
    private static final int DEFAULT_CAPACITY = 10;
    private static final int ELEMENT_NOT_FOUND = -1;
    
    public ArrayList(int capaticy) {
        capaticy = (capaticy < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capaticy;
        elements = (E[]) new Object[capaticy];
    }
    
    public ArrayList() {
        this(DEFAULT_CAPACITY);
    }
    
    /**
     * 清除所有元素
     */
    public void clear() {
        for (int i = 0; i < size; i++) {
            elements[i] = null;
        }
        size = 0;
    }

    /**
     * 元素的数量
     * @return
     */
    public int size() {
        return size;
    }

    /**
     * 是否为空
     * @return
     */
    public boolean isEmpty() {
         return size == 0;
    }

    /**
     * 是否包含某个元素
     * @param element
     * @return
     */
    public boolean contains(E element) {
        return indexOf(element) != ELEMENT_NOT_FOUND;
    }

    /**
     * 添加元素到尾部
     * @param element
     */
    public void add(E element) {
        add(size, element);
    }

    /**
     * 获取index位置的元素
     * @param index
     * @return
     */
    public E get(int index) {
        rangeCheck(index);
        return elements[index];
    }

    /**
     * 设置index位置的元素
     * @param index
     * @param element
     * @return 原来的元素ֵ
     */
    public E set(int index, E element) {
        rangeCheck(index);
        
        E old = elements[index];
        elements[index] = element;
        return old;
    }

    /**
     * 在index位置插入一个元素
     * @param index
     * @param element
     */
    public void add(int index, E element) {
        rangeCheckForAdd(index);
        
        ensureCapacity(size + 1);
        
        for (int i = size; i > index; i--) {
            elements[i] = elements[i - 1];
        }
        elements[index] = element;
        size++;
    }

    /**
     * 删除index位置的元素
     * @param index
     * @return
     */
    public E remove(int index) {
        rangeCheck(index);
        
        E old = elements[index];
        for (int i = index + 1; i < size; i++) {
            elements[i - 1] = elements[i];
        }
        elements[--size] = null;
        return old;
    }

    /**
     * 查看元素的索引
     * @param element
     * @return
     */
    public int indexOf(E element) {
        //之所以要进行空的判断 是因为在java中 用null调用方法会报空指针异常
        if (element == null) {  // 1
            for (int i = 0; i < size; i++) {
                if (elements[i] == null) return i; 
            }
        } else {
            for (int i = 0; i < size; i++) {
                if (element.equals(elements[i])) return i; // n
            }
        }
        return ELEMENT_NOT_FOUND;
    }
    
//    public int indexOf2(E element) {
//        for (int i = 0; i < size; i++) {
//            if (valEquals(element, elements[i])) return i; // 2n
//        }
//        return ELEMENT_NOT_FOUND;
//    }
//    
//    private boolean valEquals(Object v1, Object v2) {
//        return v1 == null ? v2 == null : v1.equals(v2);
//    }
    
    /**
     * 保证要有capacity的容量
     * @param capacity
     */
    private void ensureCapacity(int capacity) {
        int oldCapacity = elements.length;
        if (oldCapacity >= capacity) return;
        
        // 新容量为旧容量的1.5倍  这里进行移位运算 因为这样方法运算逻辑比较快 
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        E[] newElements = (E[]) new Object[newCapacity];
        for (int i = 0; i < size; i++) {
            newElements[i] = elements[i];
        }
        elements = newElements;
        
        System.out.println(oldCapacity + "扩容为" + newCapacity);
    }
    
    private void outOfBounds(int index) {
        throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
    }
    
    private void rangeCheck(int index) {
        if (index < 0 || index >= size) {
            outOfBounds(index);
        }
    }
    
    private void rangeCheckForAdd(int index) {
        if (index < 0 || index > size) {
            outOfBounds(index);
        }
    }
    
    @Override
    public String toString() {
        // size=3, [99, 88, 77]
        StringBuilder string = new StringBuilder();
        string.append("size=").append(size).append(", [");
        for (int i = 0; i < size; i++) {
            if (i != 0) {
                string.append(", ");
            }
            
            string.append(elements[i]);
            
//            if (i != size - 1) {
//                string.append(", ");
//            }
        }
        string.append("]");
        return string.toString();
    }
}
View Code

6.2--Assert 测试类

public class Asserts {
    public static void test(boolean value) {
        try {
            if (!value) throw new Exception("测试未通过");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
View Code

6.3--Main 主类

public class Main {

    public static void main(String[] args) {
        ArrayList<Object> list  = new ArrayList<>();
        list.add(10);
        list.add(new Person(10, "Jack"));
        list.add(22);
        
        list.indexOf(new Person(10, "Jack"));
        
        
//        ArrayList<Object> persons  = new ArrayList<>();
//        persons.add(new Person(10, "Jack"));
//        persons.add(null);
//        persons.add(new Person(15, "Rose"));
//        persons.add(null);
//        persons.add(new Person(12, "James"));
//        persons.add(null);
//
//        System.out.println(persons.indexOf(null));
    }

    static void test() {
        // int -> Integer
    
        // 所有的类,最终都继承java.lang.Object

        // new是向堆空间申请内存
        ArrayList<Person> persons  = new ArrayList<>();
        persons.add(new Person(10, "Jack"));
        persons.add(new Person(12, "James"));
        persons.add(new Person(15, "Rose"));
        persons.clear();
        persons.add(new Person(22, "abc"));
        
        System.out.println(persons);
        ArrayList<Integer> ints  = new ArrayList<>();
        ints.add(10);
        ints.add(10);
        ints.add(22);
        ints.add(33);
        System.out.println(ints);
        
        
        
    }
}
View Code

6.4--Person 类

public class Person {
    private int age;
    private String name;
    
    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }
    
    @Override
    public String toString() {
        return "Person [age=" + age + ", name=" + name + "]";
    }
    
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        
        System.out.println("Person - finalize");
    }
    
    @Override
    public boolean equals(Object obj) {
        if (obj == null) return false;
        if (obj instanceof Person) {
            Person person  = (Person) obj;
            return this.age == person.age;
        }
        return false;
    }
}
View Code

 

猜你喜欢

转载自www.cnblogs.com/ggnbnb/p/12161046.html