`
jiuyuehe
  • 浏览: 181116 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

边读边写【1】 ----java 集合包之深入List

阅读更多
一、java 集合包最常用的的2个接口Collection /和Map
List接口
最常用的有ArrayList ,LinkedList, Vector,Stack
ArrayList 的实现如下:
 public ArrayList(int initialCapacity) {
	super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
	this.elementData = new Object[initialCapacity];
    }

    /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
	this(10);
    }


可以看出它是通过数组来操作的,那么他的增删查都是通过数组方法的来实现:
 /**
     * Appends the specified element to the end of this list.
     *
     * @param e element to be appended to this list
     * @return <tt>true</tt> (as specified by {@link Collection#add})
     */
    public boolean add(E e) {
	ensureCapacity(size + 1);  // Increments modCount!!
	elementData[size++] = e;
	return true;
    }


删除要复杂点:
 public E remove(int index) {
	RangeCheck(index);

	modCount++;
	E oldValue = (E) elementData[index];

	int numMoved = size - index - 1;
	if (numMoved > 0)
	    System.arraycopy(elementData, index+1, elementData, index,
			     numMoved);
	elementData[--size] = null; // Let gc do its work

	return oldValue;
    }


将index 后面的对象当成一个数组,移动到index位置,然后将最后的一个给null.

get 最简单直接按数组下标找。

总结:
ArrayList 是一个基于数组实现的非线性安全的不限制容量的容器。在增加的时候要扩容,删除的时候却不减少容量


LinkedList:这是一个很有意思的双向链表
初始化的时候首先要new 一个 内部的entry 对象 。这个 对象代表一个元素
private static class Entry<E> {
	E element;  //当前元素
	Entry<E> next; //下一个
	Entry<E> previous; //前一个

	Entry(E element, Entry<E> next, Entry<E> previous) {
	    this.element = element;
	    this.next = next;
	    this.previous = previous;
	}
    }
 private transient Entry<E> header = new Entry<E>(null, null, null);
    private transient int size = 0;

    /**
     * Constructs an empty list.
     */
    public LinkedList() {
        header.next = header.previous = header; //都指给自己
    }



增加元素的时候 首先要创建一个 newEntry  将newEntry 前一个元素的next指给自己,将自己的next 的元素的previous 指向自己。 通俗点说,有2个位置,新来的坐后面,对面的人说,我是你的下一个,对将要来的第3个人说,我是你的前一个。
  private Entry<E> addBefore(E e, Entry<E> entry) {
	Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
	newEntry.previous.next = newEntry;
	newEntry.next.previous = newEntry;
	size++;
	modCount++;
	return newEntry;
    }

删除元素的时候  就告诉你前面的说我走了,你的后面的将是我的后面的。告诉你的后面,你的前面的将是我的前面的。我自己的都为空,你们再也找不到我了。3人行变成2人行。
 public boolean remove(Object o) {
        if (o==null) {
            for (Entry<E> e = header.next; e != header; e = e.next) {
                if (e.element==null) {
                    remove(e);
                    return true;
                }
            }
        } else {
            for (Entry<E> e = header.next; e != header; e = e.next) {
                if (o.equals(e.element)) {
                    remove(e);
                    return true;
                }
            }
        }
        return false;
    }

 private E remove(Entry<E> e) {
	if (e == header)
	    throw new NoSuchElementException();

        E result = e.element;
	e.previous.next = e.next;
	e.next.previous = e.previous;
        e.next = e.previous = null;
        e.element = null;
	size--;
	modCount++;
        return result;
    }



在LinkedList 里面 查找是意见比较麻烦的事情,因为没有直接的索引,得一个一个去询问,jdk里面给的方法是:如果index >size/2 从后面找,否则从前面找。一直找到为止
 private Entry<E> entry(int index) {
        if (index < 0 || index >= size)
            throw new IndexOutOfBoundsException("Index: "+index+
                                                ", Size: "+size);
        Entry<E> e = header;
        if (index < (size >> 1)) {//右移一位
            for (int i = 0; i <= index; i++)
                e = e.next;
        } else {
            for (int i = size; i > index; i--)
                e = e.previous;
        }
        return e;
    }


LinkedList 总结: 他是一个非线性安全的基于双向链表实现的容易。元素相互之间都非常熟悉。

Vector
Vector 其实跟ArrayList 的实现方式基本相同,但是他的方法前面都加了 synchronized.还有一点区别就是他的扩容策略跟ArrayList不一样。
  private void ensureCapacityHelper(int minCapacity) {
	int oldCapacity = elementData.length;
	if (minCapacity > oldCapacity) {
	    Object[] oldData = elementData;
//如果容量不足,将原来的容量*2  
	    int newCapacity = (capacityIncrement > 0) ?
		(oldCapacity + capacityIncrement) : (oldCapacity * 2);
    	    if (newCapacity < minCapacity) {
		newCapacity = minCapacity;
	    }
            elementData = Arrays.copyOf(elementData, newCapacity);
	}
    }


Vector 总结: 他是一个线程安全的ArrayList 。

Stack

Stack 继承自Vector  push 操作就是vector 的addElement  peek 获得最后一个元素。pop 调用peek 同时删除最后一个元素。



   
分享到:
评论

相关推荐

    尚硅谷-深入java8的集合2:LinkedList的实现原理.pdf

    1.更适合零基础学员: ·自Java语言起源始,循序渐进,知识点剖析细致且每章配备大量随堂练习,让你步步为营,学得透彻、练得明白 ·拒绝晦涩难懂的呆板教学,宋老师语言生动幽默,举例形象生动深入浅出,迅速让你...

    java高级编程必须知道的集合详细讲解

    这份资源旨在为您提供关于 Java 集合框架的详细讲解,涵盖了集合的类型、特性、应用场景以及使用方法。通过深入学习,您将建立坚实的集合框架知识,能够更好地选择和应用适合的集合来满足不同的编程需求。 集合框架...

    java面试题及技巧4

    │ │ j2sdk-1_4_2-doc.zip │ │ Java Programming Language (SL-275).txt │ │ langspec-3.0.zip │ │ SCJP Certification Training.htm │ │ SCJP 考纲.doc │ │ SL275_OH_GB.pdf │ │ Sun Certified ...

    java8源码-CollectionAndMap:集合深入解析

    集合深入解析 Java集合 1.ArrayList源码分析 默认容量为10。 private static final int DEFAULT_CAPACITY = 10; 创建了一个大小为0的数组,在后面用到。 private static final Object[] EMPTY_ELEMENTDATA = {}; ...

    Java面试题合集最新版2024.zip

    集合框架:熟悉Java集合框架中的List、Set、Map等接口及其实现类,如ArrayList、HashSet、HashMap等。 泛型:理解泛型的概念及其在Java中的应用,如泛型类和泛型方法。 并发编程:了解Java中的线程、同步、锁等机制...

    Java 集合框架高难度进阶版面试题集锦解析

    提供了20道高难度的Java集合框架面试题及详细答案解析,涵盖了List、Set、Map、Iterator、Collections类等关键概念和操作方法。从数据结构、线程安全性、性能等多个角度深入探讨了集合框架的不同实现和应用场景。...

    Java面试题深入解析:在互联网公司面试程序员需要留意的六个问题.docx

    # Java面试题深入解析:在...Java集合是Java程序员必须熟练掌握的,包括List、Set、Map等等。在面试中,面试官可能会问及Java集合中的ArrayList和LinkedList的区别是什么?HashMap和TreeMap的区别是什么等等。 ## 4.

    java面试题目与技巧1

    │ │ j2sdk-1_4_2-doc.zip │ │ Java Programming Language (SL-275).txt │ │ langspec-3.0.zip │ │ SCJP Certification Training.htm │ │ SCJP 考纲.doc │ │ SL275_OH_GB.pdf │ │ Sun Certified ...

    JavaSE基础篇 -- 集合框架详述_超集大合集

    本压缩包详述描述了Java的集合框架,用详尽的源码实例,深入浅出的介绍了包含List、Set、Map、泛型在内的所有内容。登录我的博客http://blog.csdn.net/zhongkelee还有惊喜!利用集合框架实现了斗地主洗牌发牌实例。

    Java超神之路.rar

    1.CoreJava,就是java基础、JDK的类库,很多童鞋都会说,JDK我懂,但是懂还不足够,知其然还要知其所以然,JDK的源代码写的非常好,要经常查看,对使用频繁的类,比如String,集合类(List,Map,Set)等数据结构要...

    Java中的list、set和map详解

    java集合的主要分为三种类型:  Set(集)  List(列表)  Map(映射)  要深入理解集合首先要了解下我们熟悉的数组:  数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),...

    JAVA的教程.txt

    JAVA的教程涵盖多个方面,从基础知识到高级编程都有详细的讲解。以下是一些主要的学习内容: ... JAVA集合框架与泛型:JAVA的集合框架提供了丰富的数据结构,如List、Set、Map等。你需要学习如何使用这些数据

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    第1章 让自己的第一个Java程序跑起来 2 教学视频:19分钟 1.1 想要用Java改变这个世界吗? 2 1.1.1 Java有什么优势? 2 1.1.2 Java在哪儿? 3 1.2 准备好开始Java之旅 3 1.2.1 下载JDK 4 1.2.2 安装JDK 5 ...

    动力节点老杜推荐Java学习路线

    学习Java集合框架,包括List、Set、Map等数据结构的使用和常见操作。 深入理解异常处理机制,学会使用try-catch语句和自定义异常。 学习Java的多线程编程,掌握线程的创建、同步和通信等技术。 学习Java的IO编程,...

    java面试题以及技巧

    │ │ j2sdk-1_4_2-doc.zip │ │ Java Programming Language (SL-275).txt │ │ langspec-3.0.zip │ │ SCJP Certification Training.htm │ │ SCJP 考纲.doc │ │ SL275_OH_GB.pdf │ │ Sun Certified ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    第1章 让自己的第一个Java程序跑起来 2 教学视频:19分钟 1.1 想要用Java改变这个世界吗? 2 1.1.1 Java有什么优势? 2 1.1.2 Java在哪儿? 3 1.2 准备好开始Java之旅 3 1.2.1 下载JDK 4 1.2.2 安装JDK 5 ...

    集合 Collection

    深入讲述了JAVA中的集合,介绍了JAVA集合中所用到的数据结构的基础知识。详细解说List 、Set、Map以及他们的实现类,是学习JAVA集合不可多得的资料。欢迎下载!

    java后端宝典进阶版.zip

    Java集合框架:介绍Java中常用的集合类,如List、Set、Map等,以及它们的特点、用法和性能分析,帮助读者选择合适的集合类来解决实际问题。 Java并发编程:深入讲解Java中的线程、锁、并发容器等并发编程相关的知识...

    Java开发详解.zip

    000000_【课程介绍 —— 写在前面的话】_Java学习概述笔记.pdf 010101_【第1章:JAVA概述及开发环境搭建】_JAVA发展概述笔记.pdf 010102_【第1章:JAVA概述及开发环境搭建】_Java开发环境搭建笔记.pdf 010201_【第2...

    一个java正则表达式工具类源代码.zip(内含Regexp.java文件)

    这个工具类目前主要有25种正规表达式(有些不常用,但那时才仔细深入的研究了一下正规,写上瘾了,就当时能想到的都写了): 1.匹配图象; 2 匹配email地址; 3 匹配匹配并提取url ; 4 匹配并提取http ; 5.匹配日期 6...

Global site tag (gtag.js) - Google Analytics