在另外一篇博客我简单介绍了java类集框架相关代码和理论。

这一篇博客我主要分析一下各个类集框架的原理以及源码分析。

一:先谈谈LinkedList

这是LinkedList源码的开头,我们能看到几点,1.它的继承关系,实现了哪些接口,Deque<E>就是Quene队列的子类.

2.他的Node属性都是transient关键字,transient即代表在串行化的时候不会持久化数据,LinkedList是实现了序列化接口的,但是这个transient关键字决定了在串行化过程中Node的结果。

继续往下看:

上面代码是我写的测试方法,调用main方法的代码就不展示了,这样比较直观的对应输出关系。

可以看到Collection<E>类集List<E> 的add方法种类,这里选择LinkedList进去看源码。

add调的是linkLast方法,现在我来解释一下这个方法。

LinkedList在add添加元素的时候调用了这个方法,这个方法的意思是:

首先介绍一下Node节点这个数据结构,含有  前(prev) 值(element) 后(next),这三个属性,我习惯称为火车头,数据,火车尾

当添加元素的时候,如果是第一个头元素(l==null,l代表火车尾),Node的first节点就是该元素,如果火车尾不是空的,也就是代表火车尾挂着一个节点,那么就讲这个元素挂到next节点,像挂火车那样挂。

这里要注意的是链表的数据结构是会挂一个空车厢做车头,也就是说第一次add的元素就会做第一节车厢,接下来判断last都不为空,那么都一节一节往后挂车厢,这就是链表的数据结构,其余的方法看我贴的代码应该可以理解,注释的很细。

二:谈谈HashMap

这个图是我刚才网上截下来的,这也是大家看到最多的hashmap的数据结构,没错就是个table数组挂链表,“链表散列”数据结构,其实原理也很容易解释,在table数组上有很多的位置,每个位置都是一个entry,每个位置就是一个burket篮子,放entry用的。

entry保存的就是key value的建值对,这就是hashmap的数据结构,那么实现这个数据结构的原理就是利用hash算法进行burket的确定,利用hash算法决定这条建值对存放在哪一个篮子里面,如果hashcode冲突的情况下进行equals方法的比较,如果hashcode一样且equals也相等,就在数组的基础上挂链表,解决hash冲突问题。

附带一句,hashmap是线程不安全的,异步的,Set底层使用的是hashmap的key存放数据,value存放Object类型的没什么用(个人理解)的标记。

hashtable则是线程安全的同步。

三:ArrayList和Stack

栈没什么好讲的,先进先出,压栈就可以形容这种数据结构,就像把砖块一块一块的叠高,最后叠的最先拿走,也就是First In First Out的由来FIFO。

栈是继承了Vector这个古老的类,Vector和ArrayList几乎没什么区别,我个人理解是ArrayList是在Vector的基础上做了变动衍生的类,因为ArrayList和Vector继承和实现结构都一致,方法大多一样,显而易见的区别只有add等方法Vector使用了同步关键字。

还有一点区别是ArrayList扩容的时候是增加50%的数组长度,Vector是直接增加一倍的容量,这一点来说ArrayList更节省内存、

另外要提的一点就是ArrayList在查找方面的性能明显优于LinkedList,因为get方法源码调的是Object数组进行二分查找,而LinkedList无论查哪一位都要从火车头找下去,一节一节的去按顺序遍历。

而LinkedList在插入方面性能高于ArrayList,而且ArrayList不适合频繁的插队数据以及删除数据,链表这种顺序队列结构更适合于频繁插队。

今天先讲这么多,改天再说剩下的,讲的比较随意,网上很多介绍的东西我就没赘述了,主要说一说个人理解。

浅谈java类集框架和数据结构(1)的更多相关文章

  1. 浅谈java类集框架和数据结构(2)

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...

  2. 浅谈Java的集合框架

    浅谈Java的集合框架 一.    初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...

  3. 专题笔记--Java 类集框架

    Java 类集框架 1. Java类集框架产生的原因 在基础的应用中,我们可以通过数组来保存一组对象或者基本数据,但数组的大小是不可更改的,因此出于灵活性的考虑和对空间价值的担忧,我们可以使用链表来实 ...

  4. Java类集框架详细汇总-底层分析

    前言: Java的类集框架比较多,也十分重要,在这里给出图解,可以理解为相应的继承关系,也可以当作重要知识点回顾: Collection集合接口 继承自:Iterable public interfa ...

  5. Java类集框架——List接口

    学习目标 掌握List接口与Collection接口的关系. 掌握List接口的常用子类:ArrayList.Vector. 掌握ArrayList与Vector类的区别.    Collection ...

  6. 浅谈Java反射与框架

    Java反射 1.示例 1.用户类 package com.lf.entity; import com.lf.annotation.SetProperty; import com.lf.annotat ...

  7. java类集框架(ArrayList,LinkedList,Vector区别)

    主要分两个接口:collection和Map 主要分三类:集合(set).列表(List).映射(Map)1.集合:没有重复对象,没有特定排序方式2.列表:对象按索引位置排序,可以有重复对象3.映射: ...

  8. java:类集框架conllection接口list,set

    类集中提供了以下几种接口: 1.单值操作接口:conllection,List,Set list和set是conllection接口的子接口 2.一对值的操作接口:Map 3.排序的操作接口:Sort ...

  9. 浅谈Java类中的变量初始化顺序

    一.变量与构造器的初始化顺序 我们知道一个类中具有类变量.类方法和构造器(方法中的局部变量不讨论,他们是在方法调用时才被初始化),当我们初始化创建一个类对象时,其初始化的顺序为:先初始化类变量,再执行 ...

随机推荐

  1. raspberry pi 如何汉化显示中文

    1 树莓派初装系统之后,首次启动会出现“raspi-config”工具,如下图:(若不是初次启动,在命令模式下,请输入 sudo raspi-config 命令,即可调出此界面.若在图形桌面下,打开桌 ...

  2. Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(一)

    一.前提: 完成Hello Game项目的创建编译. 具体参考:Cocos2dx.3x_Hello Game项目创建篇 二.本篇目标: l  说说关于塔防游戏的想法和思路 l  实现一个简单的塔防游戏 ...

  3. Android 源码获取-----在Windows环境下通过Git得到Android源代码

    在学习Android的过程中,深入其源代码研究对我们来说是非常重要的,这里将介绍如何通过在Windows环境下使用Git来得到我们的Android源代码. 1.首先确保你电脑上安装了Git,这个通过  ...

  4. 新建一个Activity

    如果只是新建一个class,还得自己添加XML,好不麻烦: eclipse里可以直接new other Andriod activity,ADT还是很强发滴.哈哈.

  5. 2013年ACM湖南省赛总结

    今年的比赛最大的变化就是改用OJ判题了,相比于PC^2确实省事了不少,至少可以直接复制样例了.题目方面依旧是刘汝佳命题,这点还是相当好的,至少给人以足够的安全感. 开始比赛之后安叔瞬间就把前半部分题目 ...

  6. java代写

    Computer Science, Claremont McKenna CollegeCS51.2 - Introduction to Computer Science, Fall 2014Probl ...

  7. Python: 收集所有命名参数

    有时候把Python函数调用的命名参数都收集到一个dict中可以更方便地做参数检查,或者直接由参数创建attribute等.更简单的理解就是def foo(*args, **kwargs): pass ...

  8. phonegap3.0 simple

    environment: window8(64bit) First you go to the phonegap site and install it. note that installing y ...

  9. 安装mmseg出错 config.status: error: cannot find input file: src/Makefile.in

    aclocallibtoolize --forceautomake --add-missingautoconfautoheadermake clean

  10. jQuery Mobile Data 属性

    按钮 带有 data-role="button" 的超链接.button 元素.工具栏中的链接以及 input 字段都会自动渲染成按钮样式,不需要添加 data-role=&quo ...