常用数据结构及其Java实现

这玩意就是得温故而知新,时常看看琢磨琢磨
基于链接:https://segmentfault.com/a/1190000009797159

前言

首先给出Java集合框架的基本接口/类层次结构:

java.util.Collection [I]
    +--java.util.List [I]
       +--java.util.ArrayList [C]    
       +--java.util.LinkedList [C]  
       +--java.util.Vector [C]    //线程安全
          +--java.util.Stack [C]  //线程安全
    +--java.util.Set [I]                   
       +--java.util.HashSet [C]      
       +--java.util.SortedSet [I]    
          +--java.util.TreeSet [C]    
    +--Java.util.Queue[I]
        +--java.util.Deque[I]   
        +--java.util.PriorityQueue[C]  
java.util.Map [I]
    +--java.util.SortedMap [I]
       +--java.util.TreeMap [C]
    +--java.util.Hashtable [C]   //线程安全
    +--java.util.HashMap [C]
    +--java.util.LinkedHashMap [C]
    +--java.util.WeakHashMap [C]

[I]:接口
[C]:类
本图来源于网络。

数组

  • 数组是相同数据类型的元素按一定顺序排列的集合,是一块连续的内存空间。

  • 优点:get和set操作时间上都是O(1);

  • 缺点:add和remove操作时间上都是O(N)。

  • Java中,Array就是数组,此外,ArrayList使用了数组Array作为其实现基础,跟一般的Array相比,最大的好处是在添加元素时不用考虑越界,ArrayList会自动扩张保证容量。

  • Vectory和ArrayList相比,主要区别在于多了一个线程安全,但是效率比较底下。java.util.concurrent包提供了许多线程安全的集合类,不必再使用Vectory。

int[] ints1 = new int[10];
ints1[0] = 5;
int[] ints2 = new int[]{2,3,4,5};
int a = ints2[1];
int length = ints2.length;

链表

  • 链表是一种非连续、非顺序的结构,数据元素的逻辑顺序是通过链表中指针的链接次序实现的,链表由一系列节点组成;

  • 优点:add和remove操作时间上都是O(1);

  • 缺点:get和set操作时间上都是O(N),且需要额外空间存储指向其他数据的地址项;

  • 查找操作对于未排序的数组和链表时间上都是O(N);

  • Java中LinkedList使用链表作为其基础实现;

队列

  • 队列是一中特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,即先进先出(FIFO);

  • Java中,LinkedList实现了Deque,可以作为双向队列(自然也可以作为单向队列);

  • PriorityQueue实现了带优先级的队列,即队列的每一个元素都有优先级,且元素按照优先级排序;

Deque<Integer> integerDeque = new LinkedList<>();
// 尾部入队的两种方法,区别在于:
// 如果失败,add()会抛出IllegalStateException异常,而offer()返回false
integerDeque.offer(122);
integerDeque.add(122);

// 头部出队的两种方法(从队列中删除),区别在于:
// 如果失败,remove()抛出NoSuchElementException异常,而poll方法返回false
int head = integerDeque.poll(); // 返回并删除
head = integerDeque.remove();  // 返回并删除

// 头部出队的两种方法(不删除),区别在于:
// 如果失败,element()抛出NoSuchElementException异常,而peek()不会
head = integerDeque.peek();
head = integerDeque.element();

  • 又名堆栈,是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一段称为栈顶。提现了后进先出(LIFO)特定;

  • Java中,Stack实现了这种特性,但是Stack也继承了Vector,所以具有线程安全和效率低下两个特性;

  • JDK8中,推荐使用Deque来实现栈;

Deque<Integer> stack = new ArrayDeque<Integer>();
stack.push(12); // 尾部入栈
stack.push(16); // 尾部入栈
int tail = stack.pop(); // 尾部出栈,并删除元素
tail = stack.peek(); // 尾部出栈,不删除元素

集合

  • 集合是指具有某种特定性质的具体或抽象的对象汇成的集体,这些对象成为集合的元素;

  • 主要特性是:元素不可以重复;

  • Java中HashSet提现了这种数据结构,HashSet是在HashMap的基础上构建的;

  • LinkedHashSet继承了HashSet,使用HashCode确定在集合中的位置,使用链表的方式确定位置,所以有顺序。

  • TreeSet实现了SortedSet接口,是排好序的集合(在TreeMap基础之上构建),因此,查找操作比普通的HashSet要快(log(N)),插入操作要慢(log(N)),因为要维护有序;

HashSet<Integer> integerHashSet = new HashSet<>();
integerHashSet.add(12121);//添加
integerHashSet.contains(121);//是否包含
integerHashSet.size();//集合大小
integerHashSet.isEmpty();//是否为空

散列表

  • 又名哈希表,是根据键值对(key-value)进行访问的数据结构,通过把键映射到表中一个位置来访问记录,加快查找速度,这里的映射函数叫做散列函数;

  • Java中HashMap实现了散列表,而HashTable比它多了一个线程安全,但是由于HashTable使用了全局锁导致性能较低,使用ConcurrentHashMap替代;

  • TreeMap实现SortedMap接口,能够把它保存的记录按照键排序

  • LinkedHashMap保留了元素插入的顺序

  • WeakHashMap是一种改进的HashMap,对key实行“弱引用”,如果一个key不再被外部引用,则可以被GC回收,不需要我们手动删除;

https://www.cnblogs.com/skywang12345/p/3311092.html
WeakHashMap和HashMap一样,也是一个散列表,它存储的内容也是键值对(key-value)映射,而且键和值都可以是null

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容

  • 本文采用Java语言来进行描述,帮大家好好梳理一下数据结构与算法,在工作和面试中用的上。亦即总结常见的的数据结构,...
    编程小世界阅读 321评论 0 0
  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,939评论 0 13
  • 此文已经同步至个人站点博客,点击下方链接可以体验更加阅读模式:《java题库》 一、基础类型(Primitives...
    千淘萬漉阅读 4,425评论 3 2
  • 愿你所想,如你所念 愿你所愿,终会实现 愿余生不悔,此生不换 愿所到之处,遍地阳光 愿梦的远方,温暖为向 愿红尘万...
    莫屿花开阅读 844评论 1 32