`

java 集合的数据结构

阅读更多

1、Collection集合

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2、Map集合

 

 * 图片中略掉抽象类

 

  1)Collection继承接口Iterable,所以其子类都可通过迭代器遍历元素。为了保证速度ArrayList适合用

        for循环,LinkedList适合用迭代器

    public static <T> void method(List<? super T> list) {
        int size = list.size();
        //RandomAccess标记接口,由此标记,最好用for循环遍历
        if ( list instanceof RandomAccess) {
            for (int i=0; i<size; i++){
            	//....
            }
        } else {
            ListIterator<? super T> itr = list.listIterator();
            for (int i=0; i<size; i++) {
            	itr.next();
            	//....
            }
        }
    }

  

  2)Map 可以通过entrySet()、keySet()方法,得到一个Set集合进行迭代器遍历。

  3)ListIterator可以向前和向后进行迭代

 

 

1)ArrayList<E>

 

数据结构:数组(线性序列)

适合操作:根据数据结构,善于随机访问元素,但是在其中间插入和移除元素时较慢

基本介绍:初始化时可设置数组容量大小,当实际元素个数size大于数组容量,对其进行扩容。因为其数

                 据结构是数组,每次查询可根据下标直接查到元素。删除一个元素时,后面元素统一向前移

                 一位。

 

 

 

2LinkedList<E>

 

数据结构:双向链表   

适合操作:根据数据结构,不善于随机访问元素,但是在其中间插入和移除元素时较快

基本介绍:每个元素都是一个Node,除了元素值位,还有一个指向左右的引用。每次增删Node,只需要改

                 变左右的引用指向即可,不用移动元素 

    private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

 

 

 

 3Vector<E>

 

数据结构:跟ArrayList的数据结构一样(数组)

适合操作:跟ArrayList一样同步的,所以没有ArrayList

基本介绍:其方法与ArrayList也基本相同,只是在增、删、改、查等方法前加了synchronized关键字。

                 单线程中不需使用,即使使用后台的编译期也会进行对其进行优化,消除同步代码。多线程中

                 一般也很少使用,因为速度比较慢,而且组合操作(如果存在删除)无法实现线程安全。

          

              

 

 4Stack<E>栈

 

数据结构:继承Vector (数组)  ,可用LinkedList链表实现。

适合操作:“栈”,先进后出的容器,只有一个口,一端放入元素,同一端取出元素

应用:1)平衡符号:栈中:{{【{(   站外:)}】}} ,从栈中向外弹出元素做比较。

          2)后缀表达式: 表达式a+b*c+(d*e+f)*g 转成后缀:abc*+de*f+g*+ ,先将abc压栈,遇到*,bc出栈做

               乘法,结果x=b*c继续压入栈中,然后遇到+弹出ax做加法,,,,,,,

基本介绍: LinkedList能够直接实现栈的所有功能的方法,因此可以直接将LinkedList作为栈使用。

public class StackLinked<T> {	
	private LinkedList<T> linked = new LinkedList<T>();
	
	public T peek(){ return linked.getFirst(); }
	
	public T pop(){ return linked.removeFirst(); }

	public void push(T t){ linked.addFirst(t); }
	
	public boolean isEntry(){ return linked.isEmpty(); }
	
	@Override
	public String toString() {return linked.toString();}

}

 

 

 

 5Queue<E> 队列

 

数据结构:数组(ArrayDeque)、链表(LinkedList)

适合操作:队列,先进先出的容器,从容器的一端放入事物, 从另一端取出

应用:并发,只是说思想,具体应用这里不介绍

基本介绍:放入顺序与取出顺序相同。

		Queue<String> queueLinked = new LinkedList<String>();
		Queue<String> queueArray = new ArrayDeque<String>();

  

 

 

 6PriorityQueue<E> 优先队列

 

数据结构:堆(数组)。   

适合操作:优先队列,声明下一个弹出的元素是最需要的元素(最大值/最小值具有最高优先级)

基本介绍: 根据堆的性质,每次在[0]位置的都是最大或最小的元素。因为要进 行排序所以元素要实现接

                   口Comparator<T>。堆排介绍

	public static void main(String[] args) {
		Queue<Integer> queue = new PriorityQueue<Integer>(Arrays.asList(1, 3,
				5, 4, 6));
		while (!queue.isEmpty()) {
			System.err.println(queue.remove());// 1 3 4 5 6
		}
	}

 

 

 

7Deque<E> 双向队列

 

数据结构:数组(ArrayDeque)、链表(LinkedList)

适合操作:双向队列,可以在任何一端添加或删除元素

基本介绍:因为ArrayDeque、LinkedList都实现了Deque接口,所以可以通过向上转型使用Deque

		Deque<String> dequeLinked = new LinkedList<String>();
		Deque<String> dequeArray = new ArrayDeque<String>();

 

 

 

 8HashMap<K,V>  

 

数据结构:散列(数组+单向链表)   

适合操作:当get()时使用线性搜索,执行速度会很慢,而HashMap通过散列码可以很快定位元素位置。

基本介绍:1)每个元素都是一个Entry<K,V>对象,其底层通过Entry<K,V>数组来存储元素,每

                       个Entry<K,V>对象中会有一个next属性来实现单向链表

                  2)通过hash算法(利用K的hashCode)为每个Entry的K生成一个hash值,然后根据hash值

                       和数组length算出Entry在数组中的位置。

                  3)不同的K可能生成相同的hash值,即会存储在数组的同一个位置,这时通过for循环用

                        equals比较当前位置的链表元素,如果是false将新插入的值放入计算出来的位置,

                        然后next指向oldEntry,如果是false,则替换value

                  4) 装(负)载因子默认是075,即当数组75%的位置都有值时,对数组进行扩容length*2,然后重新

                      计算每个元素在数组中的位置。                  

 static class Entry<K,V> implements Map.Entry<K,V> {
        final K key;
        V value;
        Entry<K,V> next;
        int hash;

        Entry(int h, K k, V v, Entry<K,V> n) {
            value = v;
            next = n;
            key = k;
            hash = h;
        }

        public final K getKey() {
            return key;
        }

        public final V getValue() {
            return value;
        }

        public final V setValue(V newValue) {
            V oldValue = value;
            value = newValue;
            return oldValue;
        }

        public final boolean equals(Object o) {
            if (!(o instanceof Map.Entry))
                return false;
            Map.Entry e = (Map.Entry)o;
            Object k1 = getKey();
            Object k2 = e.getKey();
            if (k1 == k2 || (k1 != null && k1.equals(k2))) {
                Object v1 = getValue();
                Object v2 = e.getValue();
                if (v1 == v2 || (v1 != null && v1.equals(v2)))
                    return true;
            }
            return false;
        }

        public final int hashCode() {
            return Objects.hashCode(getKey()) ^ Objects.hashCode(getValue());
        }

        public final String toString() {
            return getKey() + "=" + getValue();
        }

        void recordAccess(HashMap<K,V> m) {
        }

        void recordRemoval(HashMap<K,V> m) {
        }
    }

 

 

9HashSet<E> 

 

数据结构:散列

适合操作:无重复元素,可以快速超找到对象。

基本介绍:HashSet的元素可以看作是HashMap的key没有重复元素,查找块。所以HashSet的底层实现就

                 是HashMap

 

 

10LinkedHashMap<K,V>   

 

数据结构:散列,双向链表

适合操作:具有HashMap的查询速度,内部使用双向链表维护顺序(插入次序),迭代遍历按插入顺序显

                  示,因为使用链表维护内部顺序,所以迭代访问很快。

基本介绍:继承自HashMap,每个元素Entry<K,V>多出两个指向两边元素的引用来维护顺序。

 private static class Entry<K,V> extends HashMap.Entry<K,V> {
        Entry<K,V> before, after;

        Entry(int hash, K key, V value, HashMap.Entry<K,V> next) {
            super(hash, key, value, next);
        }

        private void remove() {
            before.after = after;
            after.before = before;
        }

        private void addBefore(Entry<K,V> existingEntry) {
            after  = existingEntry;
            before = existingEntry.before;
            before.after = this;
            after.before = this;
        }

        void recordAccess(HashMap<K,V> m) {
            LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m;
            if (lm.accessOrder) {
                lm.modCount++;
                remove();
                addBefore(lm.header);
            }
        }

        void recordRemoval(HashMap<K,V> m) {
            remove();
        }
    }

 

 

 

11)LinkedHashSet<E> 

 

数据结构:散列,双向链表

适合操作:无重复元素,可以快速超找到对象。迭代遍历按插入顺序显示

基本介绍:LinkedHashSet的元素可以看作是LinkedHashMap的key没有重复的有序元素,

                 所以LinkedHashSet的底层实现就是LinkedHashMap

 

 

 

12)TreeMap<K,V>  

 

数据结构:红黑树

适合操作:对元素自动排序

基本介绍:下面是Entry<K,V>的属性。TreeMap会对K自动排序,次序由Comparable或Comparator决定,  

                  TreeMap中的元素都是有序的,如果键被用于TreeMap,那么必须实现Comparable。

 

红黑树:一种自平衡的二叉树。在实践中是高效的,它可以在O(log n)时间内做查找,插入和删除,

              这里的n是树中元素的数目。

学习红黑树建议: 先学习二叉查找树,然后学习平衡(AVL)树,再然后是红黑树

介绍:红黑树是内排(内存排序)中非常完美的结构,因为每种操作增、删、改、查时间复杂度都是

          O(log n),再继续扩展的话就是b树,这种结构一般用来将数据存储在硬盘中,可用在数据库中。

          对List集合排序可以用帮助类Collections.sort(),Arrays.sort()可对数组排序。

    K key; 
    V value;
    Entry<K,V> left = null; //左节点
    Entry<K,V> right = null;//右节点
    Entry<K,V> parent; //父节点
    boolean color = BLACK;

 

 

 

13)TreeSet<E> 

 

数据结构:红黑树

基本介绍:通过TreeMap实现,功能参照TreeMap

4
2
分享到:
评论
1 楼 男人50 2015-02-13  

相关推荐

    Java常见数据结构面试题(带答案)

    "Java常见数据结构面试题(带答案)" 以下是对Java常见数据结构面试题的知识点总结: 栈和队列 * 栈和队列的共同特点是只允许在端点处插入和删除元素。 * 栈通常采用的两种存储结构是线性存储结构和链表存储结构...

    数据结构和Java集合框架

    数据结构和Java集合框架是Java编程中至关重要的概念,它们是高效编程和算法设计的基础。在Java中,数据结构指的是组织、存储和管理数据的方式,而集合框架则是一组接口和类,为处理各种数据结构提供了统一的API。 ...

    JAVA版数据结构.pdf

    文档提到了`arrays`,可能在讨论Java集合框架中的数组类型。此外,还有`List`接口和它的具体实现类,以及如何在集合中添加、删除和访问元素。 上述内容是对文档中提到的各类知识点的一个详细描述,由于原文档仅提供...

    java数据结构及集合框架

    java数据结构及集合框架

    数据结构和Java集合框架源代码

    《数据结构和Java集合框架》是清华大学出版社出版的一本经典教材,主要涵盖了计算机科学中的核心概念——数据结构以及Java编程语言中的集合框架。这本书通过深入浅出的方式,讲解了如何用Java实现各种常用的数据结构...

    Java版数据结构(程序员必须看)

    《Java版数据结构》是一本针对程序员深入理解数据结构的经典读物。数据结构作为计算机科学的基础,对于编写高效、优化的程序至关重要。本书旨在探讨如何在Java编程环境中有效地组织和管理数据,以提升程序的性能和可...

    Java版本数据结构实验报告

    Java集合框架中的TreeSet和TreeMap就是以红黑树为底层实现的。 图数据结构用于表示对象之间的复杂关系,如社交网络、交通网络等。在Java中,可以使用邻接矩阵或邻接表来表示图。图的遍历算法,如深度优先搜索(DFS...

    Java数据结构课件

    此外,课件可能还会涵盖数据结构在Java集合框架中的应用,如ArrayList、LinkedList、HashSet、HashMap等的内部实现原理,以及如何根据实际需求选择合适的数据结构。理解并熟练掌握这些内容对于提升编程能力、解决...

    数据结构(java版本)

    《数据结构(Java版本)》这本书正是为此目的而编写,旨在将理论与实际编程相结合,通过Java语言来实现各种经典的数据结构。 首先,书中的基础部分会介绍数据结构的基本概念,如数组、链表、栈和队列。数组是最基本...

    Java数据结构和Java集合框架

    Java数据结构和Java集合框架

    java数据结构实例

    1. **数组**:是最基础的数据结构,它是一组相同类型元素的有序集合。在Java中,数组提供了快速访问元素的能力,但插入和删除元素的效率较低,因为涉及到元素的移动。 2. **链表**:与数组不同,链表中的元素在内存...

    java语言数据结构

    哈希表提供了快速的查找、插入和删除操作,是实现Java集合框架的关键。 6. **ch06**:可能涉及更高级的主题,如图的最小生成树(Prim或Kruskal算法)、最短路径问题(Dijkstra算法或Floyd-Warshall算法)。 7. **...

    java数据结构与算法中文版

    此外,Java集合框架(如ArrayList、LinkedList、HashMap等)也是学习的重点,它们是Java中内置的数据结构实现,为开发者提供了便利。 索引的存在使得这本书的查找和学习更加方便,读者可以通过索引迅速定位到所需的...

    java版数据结构代码

    在编程领域,掌握数据结构是至关重要的,尤其是在Java这样的面向对象语言中。"java版数据结构代码"这个资源为初学者提供了一套实践性的学习工具,帮助他们理解并运用各种基本和高级的数据结构。以下是对这些知识点的...

    数据结构和java集合框架[美]William J.Collins 著

    《数据结构和java集合框架》(Data Structures and the Java Collections Frameword)[美]William J.Collins 著 高清PDF格式 【共4个压缩包】 第1个

    java数据结构总结

    "java数据结构总结" java数据结构是计算机科学中研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等等的学科。下面是java数据结构的知识点总结: 一、数据结构定义 数据结构是相互之间...

    数据结构和Java集合框架.part2.rar

    《数据结构和java集合框架》(Data Structures and the Java Collections Frameword)[美]William J.Collins 著 高清PDF格式[共2个压缩包】 第2个

Global site tag (gtag.js) - Google Analytics