java中的集合/容器的数据结构
最近双11在网上买了本 数据结构和算法——java语言实现,正在啃,同时在慕课网上的学习进度来到了集合框架这一类,对于这一块算是刚刚了解,本科的时候数据结构学习的是严蔚敏老师的那本数据结构,代码的实现貌似全部是伪代码,记得在期末考试的时候狠狠的通读了一遍,当时对于几个常见的数据结构队列、数组、栈、堆的一些方法还是比较熟悉,但是一直以来心里一直有个疑问,因为书上的都是伪代码,具体实现的方法并没有给出实例化,后来直到现在开始学习java语言,希望可以在之前理解的情况下,通过对于书籍上java代码的实现能够更好的理解数据结构! 刚才偶然看见一个博客上关于java语言数据结构的分析,真知灼见, 放在自己的博客里慢慢品读。
对java中的数据结构做一个小小的个人总结,虽然还没有到研究透彻jdk源码的地步。首先、java中为何需要集合的出现?什么需求导致。我想对于面向对象来说,对象适用于描述任何事物,所以为了方便对于对象的操作、存储就出现了集合,集合应该是存储对象最常用的一种方式了,相对于数组更灵活,可变长度。同时集合也只能存储对象不能使基本数据类型。
集合框架分为两个派系Collection和Map而每一种集合类型都是基于特定的数据结构,Collection接口继承了Iterable接口所以可以使用Iterable接口的iterator()方法了返回值是一个Iterator接口类型这也就是Collection集合中的迭代器,迭代器就是一种集合元素的去除方式可以直接访问集合中的元素,它定义在集合内部就是为了更加方便的取出集合中的元素它可以取出和删除集合中的元素(next(),remove())并且在使用迭代器操作数据的时候不可以使用集合本身的方法对集合进行操作,因为迭代器已经定义好了对于集合的后续操作迭代器操作的就不是之前定义好的集合了,这就冲突了。而它的子接口ListIterator可以对集合中的元素进行增删改查操作(其实就是操作的集合中存储的对象引用,并不是真正对象本身,因为集合中存储的就是对象的引用地址)。
Collection接口又分为List和Set接口,对应的List接口比较常用的就是ArrayList和LinkedList两个实现类了。ArrayList类的底层数据结构(就是数据存放的方式)就是一个数组接口,它是有序的带有角标索引的并且是可以重复的而LinkedList类底层是一个链表数据结构,他们判断元素是否相同都是使用的equals方法相对于ArrayList它对于集合数据的增删操作数据是更快的因为只需要首尾关系调整,而对于ArrayList则需要重新调整索引,所以对于大数据量的增删操作还是LinkedList效率高一些而查询操作ArrayList更快他们都是现成不同步的(ArrayList取代了Vector)。Set接口常用的就是HashSet和TreeSet两个类,HashSet底层是一个哈希表的接口它无序、不可重复、线程不同步,而判断元素是否相同使用的就是hashCode方法返回是否为0如果为0还会判断equals方法看返回是否为true。TreeSet底层是一个二叉树结构是一个有序的不可重复也是线程不同步的集合它保证数据唯一性的方式就是compareTo方法是否返回0,TreeSet排序集合有两种方式:1、让存储的元素本身具备比较性也就是实现Comparable接口覆盖compareTo方法。2、自定义比较器实现Comparator接口自定义compareTo方法然后把该比较器作为参数出入TreeSet的构造方法中是TreeSet初始化时就具备了比较性。
Map接口是和Collection接口平级的接口,Map接口存储的是一个key-value形式的映射关系所以对于需要存储映射关系的数据首选Map,Map常用的类型有HashMap和TreeMap,HashMap底层数据结构也是哈希表是可以使用null存储的也是线程不同步的这也就取代了HashTable的线程不同步,不可存储null值、TreeMap底层也是二叉树数据结构,同样的Map的取出数据的方式都是使用entrySet()方法返回Set集合再使用迭代器取出或者是增强for循环(实现了Iterable接口的集合都可以使用foreach进行循环),entrySet返回的映射关系就是一个Map.Entry类型因为Entry其实就是定义在Map中,为什么要这么做呢?因为只有有了Map集合,有了键值对才有键值对的映射关系,关系属于集合中的内部事物这个事有直接访问集合中的元素。实际应用中我想更多的是map的嵌套。
工具类(Collections、Arrays)Collections集合工具类就是一个操作结合的专门工具类里面定义的都是静态方法,可以对于List集合进行各种排序二分查找等(类比字符串操作)还可以把线程不安全的转成线程安全的,同样的Arrays是一个操作数组的工具类里面定义的也都是静态方法用于数组的各种操作(toString打印数组元素、asList转成list等)
java中的集合/容器的数据结构的更多相关文章
- JAVA中的集合容器操作类
目录 JAVA中的集合容器操作类 List集合 ArrayList的操作方法说明 LinkedList Stack Set Map Queue 总结 JAVA中的集合容器操作类 Java容器类库总共分 ...
- Java中的集合框架(上)
Java中的集合框架概述 集合的概念: Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象. 集合的作用: 1.在类的内部,对数据进行组织: 2.简单的快速的搜索大数据量的 ...
- Java中的集合框架-Collection(二)
上一篇<Java中的集合框架-Collection(一)>把Java集合框架中的Collection与List及其常用实现类的功能大致记录了一下,本篇接着记录Collection的另一个子 ...
- java中的集合和视图
一.集合的概念 何为集合,集合就是相当于一个对象的容器.集合是类似数组的一个作用.既然有了数组,为何还要有集合呢,由于数组对象一旦创建,其大小便不可以更改,我们只能往数组中存放创建时数量的对象.而集合 ...
- Java面试题:Java中的集合及其继承关系
关于集合的体系是每个人都应该烂熟于心的,尤其是对我们经常使用的List,Map的原理更该如此.这里我们看这张图即可: 1.List.Set.Map是否继承自Collection接口? List.Set ...
- Java中的集合List、ArrayList、Vector、Stack(三)
List接口 List集合代表一个有序集合,集合中每一个元素都有其对应的顺序索引.List集合容许使用重复元素,可以通过索引来访问指定位置的集合对象. ArrayList和Vector实现类 Arra ...
- Java中的集合(五)继承Collection的List接口
Java中的集合(五)继承Collection的List接口 一.List接口简介 List是有序的Collection的,此接口能够精确的控制每个元素插入的位置.用户能够根据索引(元素在List接口 ...
- java中的集合操作类(未完待续)
申明: 实习生的肤浅理解,如发现有错误之处.还望大牛们多多指点 废话 事实上我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList ...
- Java中的集合概述
Java中的集合类有两个重要的分支,分别是接口Collection(包括List,Set等)和接口Map. 由于HashSet的内部实现原理使用了HashMap,所以我们先来了解Map集合类. 1.H ...
随机推荐
- C#------数字转中文
转载: http://www.jb51.net/article/8061.htm 方法二: static string ConvertToChinese(double x) { string s = ...
- 12月8日phpcms添加子栏目后的读取
一个栏目下面如果没有子栏目,那么它调用的模板就是列表页模板(及list_为前缀的模板):如果一个栏目下面有子栏目,那么它调用的就是栏目首页模板(category_为前缀的模板). 所以,当你这个栏目添 ...
- myeclipse环境下开发freemarker
最近在着手一个项目,其中就要使用到freemarker模版,当把html漂亮写完时,改写成freemarker时,问题来了.全屏都是白底黑色,没有高亮显示,没有语法提示,不能格式化.看着眼花,还容易出 ...
- ubuntu安装simplejson模块
在terminal中输入 sudo apt-get install python-simplejson -y import simplejson print simplejson.dumps(lens ...
- MTK MT33xx型GPS的NMEA协议解析实例
1)解析实现 gps_main.c #include <nmea/nmea.h> #include <string.h> #include <stdio.h> #i ...
- ECSHOP 商品字段增加新字段的方法
结合ecshop后台“商品编辑”.“商品录入”来谈谈如何给ecshop商品增加一个新字段,假设我们将这个新字段命名为 new_add 1.首先要修改数据表结构,给表 ecs_goods 增加新字段:n ...
- 在使用 HttpWebRequest Post数据时候返回 400错误
笔者有一个项目中用到了上传zip并解压的功能.开始觉得很简单,因为之前曾经做过之类的上传文件的功能,所以并不为意,于是使用copy大法.正如你所料,如果一切很正常的能运行的话就不会有这篇笔记了. 整个 ...
- juery实现贪吃蛇的游戏
今天用juery做了一个贪吃蛇的游戏,代码比较简陋,不过作为这些天学习juery的成果,非常有成就感.另外关于代码内容如有雷同不胜荣幸. 更改了下 让头和身子的颜色不一样 这样好区分些,虽然还是不怎么 ...
- 转→js数组遍历 千万不要使用for...in...
看到一篇内容还不错,但是排版实在糟糕, 逼死强迫症患者啊,直接拉下去找原文连接,找到了,但是已经消失了···500错误... 第一次因为实在看不下去一篇博客的排版, 为了排版而转载... 转载地址:h ...
- OpenSSL windows 下编译
源码下载:https://www.openssl.org/source/ 目前最新的1.0.2c 编译工具:ActiveState Perl from http://www.activestate. ...