文档章节

java 集合总结

b
 benny周
发布于 2015/02/12 09:15
字数 1851
阅读 106
收藏 7
点赞 0
评论 0

1、Collection集合

 

 

 

2、Map集合

 

 * 图片中略掉抽象类

 Collection继承接口Iterable,所以其子类都可通过迭代器遍历元素。

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

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

 

1)ArrayList<E>

 

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

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

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

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

                 一位。

 

2LinkedList<E>

 

数据结构:双向链表   

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

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

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

Java代码  收藏代码

  1. private static class Node<E> {  

  2.     E item;  

  3.     Node<E> next;  

  4.     Node<E> prev;  

  5.   

  6.     Node(Node<E> prev, E element, Node<E> next) {  

  7.         this.item = element;  

  8.         this.next = next;  

  9.         this.prev = prev;  

  10.     }  

  11. }  

 

 

 

 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出栈做

               乘法,,,,

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

Java代码  收藏代码

  1. public class StackLinked<T> {   

  2.     private LinkedList<T> linked = new LinkedList<T>();  

  3.       

  4.     public T peek(){ return linked.getFirst(); }  

  5.       

  6.     public T pop(){ return linked.removeFirst(); }  

  7.   

  8.     public void push(T t){ linked.addFirst(t); }  

  9.       

  10.     public boolean isEntry(){ return linked.isEmpty(); }  

  11.       

  12.     @Override  

  13.     public String toString() {return linked.toString();}  

  14.   

  15. }  

 


 5Queue<E> 队列

 

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

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

应用:并发(只是思想)

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

Java代码  收藏代码

  1. Queue<String> queueLinked = new LinkedList<String>();  

  2. Queue<String> queueArray = new ArrayDeque<String>();  

  


 6PriorityQueue<E> 优先队列

 

数据结构:堆(数组)。   

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

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

                   口Comparator<T>

Java代码  收藏代码

  1. public static void main(String[] args) {  

  2.     Queue<Integer> queue = new PriorityQueue<Integer>(Arrays.asList(13,  

  3.             546));  

  4.     while (!queue.isEmpty()) {  

  5.         System.err.println(queue.remove());// 1 3 4 5 6  

  6.     }  

  7. }  

 

 

 

7Deque<E> 双向队列

 

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

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

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

Java代码  收藏代码

  1. Deque<String> dequeLinked = new LinkedList<String>();  

  2. Deque<String> dequeArray = new ArrayDeque<String>();  

 

 

 

 8)HashMap<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,然后重新

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

Java代码  收藏代码

  1. static class Entry<K,V> implements Map.Entry<K,V> {  

  2.        final K key;  

  3.        V value;  

  4.        Entry<K,V> next;  

  5.        int hash;  

  6.   

  7.        Entry(int h, K k, V v, Entry<K,V> n) {  

  8.            value = v;  

  9.            next = n;  

  10.            key = k;  

  11.            hash = h;  

  12.        }  

  13.   

  14.        public final K getKey() {  

  15.            return key;  

  16.        }  

  17.   

  18.        public final V getValue() {  

  19.            return value;  

  20.        }  

  21.   

  22.        public final V setValue(V newValue) {  

  23.            V oldValue = value;  

  24.            value = newValue;  

  25.            return oldValue;  

  26.        }  

  27.   

  28.        public final boolean equals(Object o) {  

  29.            if (!(o instanceof Map.Entry))  

  30.                return false;  

  31.            Map.Entry e = (Map.Entry)o;  

  32.            Object k1 = getKey();  

  33.            Object k2 = e.getKey();  

  34.            if (k1 == k2 || (k1 != null && k1.equals(k2))) {  

  35.                Object v1 = getValue();  

  36.                Object v2 = e.getValue();  

  37.                if (v1 == v2 || (v1 != null && v1.equals(v2)))  

  38.                    return true;  

  39.            }  

  40.            return false;  

  41.        }  

  42.   

  43.        public final int hashCode() {  

  44.            return Objects.hashCode(getKey()) ^ Objects.hashCode(getValue());  

  45.        }  

  46.   

  47.        public final String toString() {  

  48.            return getKey() + "=" + getValue();  

  49.        }  

  50.   

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

  52.        }  

  53.   

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

  55.        }  

  56.    }  

 

 

9HashSet<E> 

 

数据结构:散列

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

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

                 是HashMap

 

 

10LinkedHashMap<K,V>   

 

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

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

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

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

Java代码  收藏代码

  1. private static class Entry<K,V> extends HashMap.Entry<K,V> {  

  2.        Entry<K,V> before, after;  

  3.   

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

  5.            super(hash, key, value, next);  

  6.        }  

  7.   

  8.        private void remove() {  

  9.            before.after = after;  

  10.            after.before = before;  

  11.        }  

  12.   

  13.        private void addBefore(Entry<K,V> existingEntry) {  

  14.            after  = existingEntry;  

  15.            before = existingEntry.before;  

  16.            before.after = this;  

  17.            after.before = this;  

  18.        }  

  19.   

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

  21.            LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m;  

  22.            if (lm.accessOrder) {  

  23.                lm.modCount++;  

  24.                remove();  

  25.                addBefore(lm.header);  

  26.            }  

  27.        }  

  28.   

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

  30.            remove();  

  31.        }  

  32.    }  

 

 

 

11)LinkedHashSet<E> 

 

数据结构:散列

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

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

                 所以LinkedHashSet的底层实现就是LinkedHashMap

 

 

 

12)TreeMap<K,V>  

 

数据结构:红黑树

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

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

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

Java代码  收藏代码

  1. K key;   

  2. V value;  

  3. Entry<K,V> left = null//左节点  

  4. Entry<K,V> right = null;//右节点  

  5. Entry<K,V> parent; //父节点  

  6. boolean color = BLACK;  

 

 

 

13)TreeSet<E> 

 

数据结构:红黑树

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


本文转载自:http://flyouwith.iteye.com/blog/2184999

共有 人打赏支持
b
粉丝 4
博文 44
码字总数 16807
作品 0
深圳
程序员
Kotlin语言中的泛型设计哲学

Kotlin语言的泛型设计很有意思,但并不容易看懂。关于这个部分的官方文档,我反复看了好几次,终于弄明白Kotlin语言泛型设计的背后哲学。这篇文章将讲述Kotlin泛型设计的整个思考过程及其背后...

欧阳锋
04/16
0
0
sharding-jdbc分库分表规则(1)-单表查询

前言 当数据量到达一定数量级的时候,一般都会考虑分库分表。sharding-jdbc是一个开源的客户端分库分表基础类库,以一个jar包的形式提供,基于原生的JDBC驱动进行增强,基本能够无缝整合旧代...

xiaomin0322
06/07
0
0
Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
05/23
0
0
Hibernate之HQL总结

查询整个映射对象所有字段 //直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段 String hql = "from Users"; Query query = session.createQuery(hql); List<Users> users =...

Patata
2013/05/26
0
2
Java ThreadLocal的用法解析

简介 java中经常使用ThreadLocal作为处理高并发访问的可选手段,ThreadLocal并不是一个线程,而是”以线程为作用域“的一种面向对象的数据结构。其用法的也有着让人难以理解的怪异性。 代码实...

IamOkay
2014/10/25
0
0
System.getProperty("user.dir")

System.getProperty("user.dir"); 获得系统属性 getProperties public static Properties getProperties() 确定当前的系统属性。 首先,如果有安全管理器,则不带参数直接调用其 checkPrope...

小落i
2014/03/27
0
0
从java1到java9每个版本都有什么新特性?五分钟了解

     其实,我是个标题党,没有java1的说法,java9的新特性我也没总结。所以,来个关注吧,说不定哪天就出了呢。。。   每次出新版本,大家大概都会这么问,“Java X会有什么特性呢?”...

java进阶架构师
2017/11/13
0
0
Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

一,java开发中: java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小、程序不严密,产生了过多的垃圾。 导致OutOfMemory...

今日竹石
2014/04/17
0
0
2018年Java编程学习面试最全知识点总结

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
05/14
0
0
-1-0 Java 简介 java是什么 java简单介绍

Java是一门纯粹的面向对象的高级的平台无关的编程语言 官网介绍: 了解 Java 技术 https://www.java.com/zh_CN/about/ 推荐词条: https://zh.wikipedia.org/wiki/Java https://zh.wikipedia.o...

noteless
07/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java按比例之原图生成缩略图

package com.wxp.test; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import javax.imageio.ImageIO; import sun.......

恋码之子
8分钟前
0
0
SpringCloud 微服务 (十五) 服务容错 Hystrix

壹 工作中的微服务架构,某个服务通常会被多个服务调用或者多层调用完成需求,如果某个服务不可用,导致一个系统功能不可用或者服务直接没用了的情况,这种情况称为雪崩效应 有A服务调用B服务,B服...

___大侠
10分钟前
0
0
Spring框架中的设计模式(五)

Spring框架中的设计模式(五) 通过以前的4篇文章,我们看到Spring采用了大量的关于创建和结构方面的设计模式。本文将描述属于行为方面的两种设计模式:命令和访问者。 前传: Spring框架中的...

瑞查德-Jack
13分钟前
0
0
解决phpstorm运行很卡问题!

phpStorm一旦达到这个临界值,所有智能提示、自动补全都失效了 这TM就很尴尬了,顿时感觉自己就是个废人了,纯手写代码跟便秘一样 众所周知phpStorm基于JAVA,那么这个内存限制肯定跟JAVA的虚...

sjcehui2010
15分钟前
0
0
javascript前端AES加密解密

参考了一下网上的代码加上自已的一些想法,修改,key也可以是中文, 要引入一个aes.js的js文件。 html代码 <html> <head> <title>AES加解密</title> <meta http-equiv="Content-Type"......

oisan_
19分钟前
0
0
MacOS和Linux内核的区别

有些人可能认为MacOS和Linux内核有相似之处,因为它们可以处理类似的命令和类似的软件。甚至有人认为苹果的MacOS是基于linux的。事实上,这两个内核的历史和特性是非常不同的。今天,我们来看...

六库科技
23分钟前
0
0
Vue.js-自定义事件例子

自定义组件的 v-model 2.2.0+ 新增 一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框、复选框等类型的输入控件可能会将 value 特性用于不同的目的。m...

tianyawhl
26分钟前
0
0
mybatis中获取sqlSession的源码分析

0 SqlSessionFactoryBuilder类 SqlSessionFactoryBuilder sqlSessionFacotory=SqlSessionFactoryBuilder().build(reader) public SqlSessionFactory build(Reader reader) { return build(re......

writeademo
27分钟前
0
0
RobotThread.cpp

#include "RobotThread.h"RobotThread::RobotThread(int argc, char** pArgv, const char * topic) :m_Init_argc(argc), m_pInit_argv(pArgv), m_topic(topic){/** ......

itfanr
29分钟前
0
0
防御ddos攻击的常见方法

DDoS攻击是一种特殊形式的拒绝服务攻击。它利用多台已经被攻击者所控制的机器对某一台单机发起攻击,在带宽相对的情况下,被攻击的主机很容易失去反应能力。分布式拒绝服务攻击(DDoS) 是一种...

上树的熊
30分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部