`

表-List, ArrayList, LinkedList 实现学习笔记

阅读更多

1. 表的java实现

咱们程序员入门C语言一开始就介绍的

1.1 数组实现 

主要就是查询快,删除,插入 时间复杂度O(N),比如删除第一个元素,那么后面的元素就要整体向前移动,而查询就比较简单了时间复杂度O(1)

1.2 链表实现 :  插入删除快,查询较复杂 

 

2. ArrayList 数组实现

    预先定义的基本属性

 

     // 默认的容量
    private static  final  int DEFAULT_CAPACITY = 10;
    // 长度
    private int size;
    // 元素
    private E [] items;
    用数组来保存list里面的元素。

 

2.1 capacity 容量 

capacity 是什么样一个概念:感觉很直观的理解就是一个预先估计的容量,为后面新来的元素有了一个准备,不必每次新添加元素这边都要做扩容处理影响效率(所以ArrayList在空间上这部分是浪费的)。

 

public void ensureCapacity(int newCapacity){
        if ( newCapacity < size) {
            return;
        }

        E [] old = items;
        items = (E []) new Objects [newCapacity];

        for (int i = 0; i < size(); i++) {
            items [i] = old[i];
        }
    }

 

 

 2.2 add 

public void add (E ele) {
    add(size(), ele) ;
}

public void add (int index, E ele) {
    if ( items.length == size()) {
        // 扩容机制 jdk 1.5 倍 + 1
ensureCapacity (size() * 2 + 1);
    }
    // 插入点,向后移动,后面有位置
for ( int i = size; i > index; i-- ) {
        items [i] = items [i - 1];
    }
    items[index] = ele;
}


 

 2.3 remove

 

 public E remove (int index) {
        E removeItem = items[index];
        // 向前缩进
        for ( int i = index; i < size() - 1; i++) {
            items [i] = items[i - 1];
        }
        size --;
        return removeItem;
    }

 3.LinkedList 实现

  3.1 Node 节点

   LinkedList 是双链表来实现的,由节点来构成的,因此我们同时定义了一个节点类Node(内部嵌套)

   

public class Node<E> {
        public E data;
        public Node<E> prev;
        public Node<E> next;

        public Node(E data, Node<E> prev, Node<E> next){
            this.data = data;
            this.prev = prev;
            this.next = next;
        }
    }

   初始化

  

public MyLinkedList () {
    clear();
}

public void clear () {
    beginMarker = new Node<E>(null, null, null);
    endMarker= new Node<E>(null, beginMarker, null);
    beginMarker.next = endMarker;
    size = 0;
}

 

3.2 Node 插入点,删除点

 由于链表添加删除,与操作位置上的节点有关系因此操作前要获取位置上的操作节点

 

public Node<E> getNode (int index){

        return getNode(index, 0, size()-1);
    }

    public Node<E> getNode (int index, int lower, int upper){
        Node<E> p;
        if(index < lower || index > upper) {
            throw new IndexOutOfBoundsException();
        }
        // 判断从前开始还是从后开始,减少循环次数
        if (index < size()/2) {
            p = beginMarker;
            for (int i = 0; i < index; i++){
                p = p.next;
            }
        }else {
            p = endMarker;
            for (int i = size(); i > index; i--) {
                p = p.prev;
            }
        }
        return p;
    }

 

3.3 Node 新增

    public void add(int index, E ele){
        addBefore( getNode(index, 0, size()), ele);
    }

    public void addBefore(Node<E> p, E e){
        Node<E> newNode = new Node<E>(e, p.prev, p);
        p.prev.next = newNode;
        p.prev = newNode;
        size ++;
    }

 

3.3 Node 删除

public void romove(int index){
       romove(getNode(index, 0, size()-1));
    }
    public void romove(Node<E> p){
        p.prev.next = p.next;
        p.next.prev = p.prev;
        size--;
    }

 4.总结

    ArrayList,LinkedList都是非同步的。这点区别于Vector

 

  

 

 

分享到:
评论

相关推荐

    集合-黑马程序员Java学习笔记

    本学习笔记由黑马程序员提供,旨在帮助初学者深入理解Java中的集合框架及其使用方法。 首先,我们来探讨“集合”的基本概念。在Java中,集合是一个对象容器,可以容纳多个元素,这些元素可以是任意类型的数据。Java...

    Java学习笔记整理

    ArrayList、LinkedList和Vector都是List接口的实现,它们之间的差异在于数据结构和性能:ArrayList适合随机访问,LinkedList适合顺序访问和频繁插入删除,Vector线程安全但效率较低。HashSet和TreeSet是Set接口的...

    java学习比记-北大青鸟时做的笔记,每堂课都有

    【Java学习笔记】北大青鸟课程精华解析 Java是一种广泛使用的高级编程语言,以其平台无关性、面向对象的特性以及强大的安全性能而受到广大开发者喜爱。北大青鸟作为知名的IT培训机构,提供了丰富的Java教学资源,这...

    java学习笔记之集合详细

    在这个学习笔记中,我们将深入探讨集合的特点、集合与数组的区别、集合的主要接口和实现类,以及如何使用迭代器和各种方法来操作集合。 1. **集合特点**: - 集合仅用于存储对象,不同于数组可以存储基本数据类型...

    java8源码-JavaRobot:Java学习笔记,JavaLearningNote

    学习笔记(持续更新中) 所有文章均同步发布到微信公众号【JavaRobot】,关注微信公众号,及时得到文章推送,谢谢支持。 说明:如无特别说明,所有代码都基于JDK8 JavaSE(Java基础) Java Core 关键字 synchronized...

    Java基础 学习笔记 Markdownr版

    2. 集合:在13集合.md中,详细讲解了Java集合框架,包括ArrayList、LinkedList、HashSet、HashMap等基本集合类的使用,以及List、Set、Map接口的特性。此外,还可能涉及泛型的概念,泛型(14泛型.md)提高了代码的...

    Java 学习笔记Java学习笔记

    4. 集合框架:Java集合框架是用于存储和操作对象的工具,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)、Map(如HashMap和TreeMap)等接口及其实现类。它们提供了丰富的API用于添加、删除、查找...

    Java-J2SE学习笔记

    - **容器类**:如ArrayList、LinkedList、HashSet、HashMap等,它们提供了存储和操作对象的不同方式。 - **接口与实现**:List、Set、Map接口,以及对应的实现类,理解它们的特点和应用场景。 - **迭代器**:用于...

    java学习笔记,全程

    - ArrayList、LinkedList、HashSet、HashMap:研究这些常用集合类的实现原理,掌握它们的添加、删除、查找操作,以及适用场景。 - 集合接口与泛型:了解List、Set、Map接口,以及泛型在集合中的应用,提高代码的...

    java-learn-note:Java学习笔记

    Java学习笔记是一个全面涵盖Java编程语言的资源集合,旨在帮助初学者和有经验的开发者深入理解和掌握Java核心技术。这个压缩包文件"java-learn-note-master"可能包含一系列的笔记、代码示例、教程和项目实践,是学习...

    阿里P8 架构师整理Java学习笔记.pdf

    ### Java学习笔记知识点总结 #### 一、JVM与内存管理 **1.1 JVM基本概念** - **JVM(Java Virtual Machine)**: Java虚拟机是执行Java字节码的虚拟机,它提供了运行Java程序所需的环境。 **1.2 线程** - **线程...

    java-note:个人Java学习笔记

    - **具体实现类**:ArrayList、LinkedList、HashSet、HashMap等,了解它们的特点和适用场景。 - **泛型**:用于指定容器存储元素的类型,提高代码安全性。 5. **多线程** - **线程创建**:通过实现Runnable接口...

    java_Java_学习笔记.zip

    - ArrayList、LinkedList、HashSet、HashMap等实现类的特性与选择。 - 泛型:用于限制集合元素的类型,提高代码安全性和可读性。 9. **IO流**: - 流的概念:输入/输出流,用于读写数据。 - 文件操作:File类...

    非常详细javaSE学习笔记.rar

    5. **集合框架**:ArrayList,LinkedList,HashMap,HashSet等容器的使用,以及它们之间的区别和选择。此外,接口如List,Set,Map的使用和实现也会涉及。 6. **输入输出(I/O)**:包括System.in, System.out....

    java 学习笔记

    在Java学习笔记中,我们重点关注Java的IO(输入/输出)操作、常用类库以及集合框架。 1. **Java IO**: - **File类**:提供了文件和目录的基本操作,如创建、删除、重命名等。 - **RandomAccessFile**:支持对...

    demo-for-learn:学习笔记之不改版

    3. **集合框架**:Java集合框架包括List、Set、Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类。它们用于存储和操作对象,是处理数据的重要工具。 4. **异常处理**:Java中的异常处理机制允许...

    集合框架学习笔记

    这篇学习笔记将深入探讨Java集合框架的基础概念、主要类库以及常见应用场景。 首先,Java集合框架分为两种基本类型:List(列表)和Set(集)。List接口代表有序的集合,允许重复元素,如ArrayList和LinkedList;而...

    学习笔记 java\CoreJava笔记\CoreJava_day15

    - 集合框架是Java中处理对象数组的一种方式,包括List、Set和Queue接口,以及ArrayList、LinkedList、HashSet、TreeSet、LinkedList等实现类。 - `ArrayList`提供了动态数组的功能,允许在任何位置插入和删除元素...

    ArrayList的学习821.docx

    除了ArrayList,List接口还有其他实现,比如LinkedList,它基于链表结构,对于插入和删除操作具有更好的性能,但在随机访问元素时不如ArrayList快。选择使用哪种实现取决于具体的应用场景和性能需求。 总结起来,...

Global site tag (gtag.js) - Google Analytics