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 ...
随机推荐
- 疯狂Java笔记
第四章: 4.6深入数组 1.栈内存和堆内存 每个方法都会建立自己的内存栈,在这个方法内定义的变量会逐个放入栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁.因此,所有在方法中定义的局部变量 ...
- Selenium+python 配置
1. 安装python, www.python.org. 下载最新的python,应该是32位的.注意配置环境变量. 2. 安装PIP(pip是一个以Python计算机程序语言写成的软件包管理系统). ...
- fedora自带OpenJDK,所以如果安装官方的JDK的话要先删除OpenJDK
1:rpm -qa|grep jdk 查看当前的jdk情况. 2:yum -y remove java java-1.7.0-openjdk* 卸载openjdk,这个过程中因为依赖原因可能会卸载一些 ...
- pip 与pip3
pip 3用于python3 版本 pip2 用于python2版本 pip好像可以通用 "pip2" is for Python2, "pip3″ is for Pyt ...
- MyBatis Cache配置
@(MyBatis)[Cache] MyBatis Cache配置 MyBatis提供了一级缓存和二级缓存 配置 全局配置 配置 说明 默认值 可选值 cacheEnabled 全局缓存的开关 tru ...
- webstorm 更改默认服务器端口
File ->Settings Build,Execution,Deployment->Debugger 如下图 找到Debugger
- PHP中Exception异常
异常的基本使用 当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "catch" 代码块. 如果异常没有被捕获,而且又没用使用 set_exception_hand ...
- ActiveMQ集群下的消息回流功能
------------------------------------------------------------------ "丢失"的消息 如果有broker1和brok ...
- Libero 使用拾忆
使用Libero软件进行管脚分配的时候可以使用脚本语言,详细的使用说明见des_constraints_ug.pdf(在Libero安装目录下寻找) 如: set_io srame_oe -REGIS ...
- (转载) 利用国内的镜像,加速PIP下载
国内源: 新版ubuntu要求使用https源,要注意. 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.c ...