J2SE基本数据结构
1.J2SE中的常用数据结构对象的继承关系如下图
Collection
........|--------List
........|..........|----------ArrayList
........|..........|----------Vector
........|..........|.............|-----Stack
........|..........|----------LinkedList
........|--------Set
...................|----------HashSet.
...................|.............|-----LinkedHashSet
...................|----------SortedSet
.................................|-----TreeSet
Iterator
.....|-------ListIterator
Map
.....|------Hashtable
.....|..........|------Properties
.....|------HashMap
.....|..........|------LinkedHashMap
.....|------WeakHashMap
.....|------SortedMap
................|------TreeMap
2.collection接口及其子类
实现collection接口及其子接口的所有类都可应用clone()方法,并是序列化类。
list接口的特点如下:
- 可随机访问list中的元素;
- list中的元素是有序的;
- 可在list的任意位置增加,删除元素;
- 不管访问多少次,list中元素位置保持不变;
- list中的元素允许重复;
- 用iterator可以单向遍历,也可以用listIterator双向遍历。
ArrayList:
- 用数组作为基本的数据结构来实现list;
- 元素顺序存储;
- 新增元素改变list大小时,内部会新建一个数组,将原有的数据拷贝过去同时,插入新增元素;
- 随机访问的速度很快,删除非头尾元素慢,新增元素慢而且费资源
- 适用于无频繁增删的情况;
- 比数组效率低,如果不需要可变数组,可考虑使用数组替代;
- 非线程安全。
Vector
- 另一种ArrayList,具备ArrayList的特性;
- 所有方法都是线程安全的(双刃剑,和ArrayList的主要区别)。
- 比ArrayList效率低。
Stack:
- LIFO的数据结构
LinkedList:
- 链接对象数据结构;
- 随机访问很慢,增删操作很快,不耗费多余资源;
- 非线程安全。
Set接口的特点如下:
- 不允许重复元素,可以有一个空元素;
- 不可以随机访问包含的元素;
- 只能用Iterator实现单向遍历。
HashSet
- 用HashMap做为基本数据结构来存储Set;
- 元素是无序的;
- 迭代访问元素的顺序和加入的顺序不一致;
- 多次迭代访问,元素的顺序可能不同;
- 非线程安全。
LinkedHashSet
- 基于HashMap和链表实现存储;
- 迭代访问元素的顺序和加入元素的顺序相同;
- 多次迭代访问,元素的顺序不变(是一种有序的数据结构);
- 性能比HashSet差;
- 非线程安全。
SortedSet接口
- 加入SortedSet的所有元素必须实现Comparable接口;
- 元素是有序的。
TreeSet
- 基于TreeMap实现存储;
- 排序后按升序排列元素;
- 非线程安全。
3.Iterator接口:
- 对Set和List集合对象实现单向遍历迭代。
ListIterator接口
- 对list集合对象实现双向遍历迭代。
4.Map 接口
- 键值对,键和值一一对应;
- 不允许重复的键。
HashTable
- 用作键的对象必须实现了HashCode(),equals方法,即只有object及其子类才可以做键;
- 键、值都不能使空对象;
- 多次访问,映射元素的顺序相同;
- 线程安全。
Properties
- 键和值都是字符串类型。
HashMap
- 键和值可以是空对象;
- 不保证映射的顺序;
- 多次访问,映射元素的顺序可能不同;
- 非线程安全;
LinkedHashMap
- 多次访问,映射元素的顺序保持一致;
- 性能差与HashMap。
WeakHashMap
- 当某个键不再正常使用时,垃圾收集器会移除它,即便有映射关系在;
- 非线程安全。
SortedMap接口:
- 键按升序排列;
- 所有键都必须实现Comparable接口。
TreeMap
- 基于红黑树(平衡排序二叉树)实现元素存储;
- 非线程安全
补充说明:
二叉查找树(Ordered Binary Tree)
- 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 任意节点的左、右子树也分别为二叉查找树。
- 没有键值相等的节点(no duplicate nodes)。
注意:二叉查找树若退化成了一棵具有n个结点的线性链后,则这些操作最坏情况运行时间为O(n)。
红黑树:
虽然本质上是一棵二叉查找树,但它在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n)。但它是如何保证一棵n个结点的红黑树的高度始终保持在logn的呢?这就引出了红黑树的5个性质:
- 每个结点要么是红的要么是黑的。
- 根结点是黑的。
- 每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。
- 如果一个结点是红的,那么它的两个儿子都是黑的。
- 对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。
正是红黑树的这5条性质,使一棵n个结点的红黑树始终保持了logn的高度,从而也就解释了上面所说的“红黑树的查找、插入、删除的时间复杂度最坏为O(log n)”这一结论成立的原因。
下图即是一颗红黑树:

J2SE基本数据结构的更多相关文章
- J2SE总结(一)-------容器
最近大家都在讨论容器以及如何在项目中去实际的应用它,由于之前对容器没有什么概念,所以把J2SE里面讲的容器的一些基础知识看了一下,总结一下最基本的东西. 围绕整章最核心的就属下面这张图了吧. 一.概念 ...
- J2SE核心开发实战(一)——认识J2SE
认识J2SE 一.课程简单介绍 在本章学习開始前,你应该具备一些Java的基础知识. 我们将在本章来认识J2SE,并复习一下前面学过的面向对象的相关知识. 注:全部的蓝色文字都是带超链接的,这些链接是 ...
- J2SE基础题
J2SE基础 八种基本数据类型的大小,以及他们的封装类.(有的也说是9中基本数据类型,包括了void) 基本类型 大小(字节) 默认值 封装类 byte 1 (byte)0 Byte short 2 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- 深入浅出Redis-redis底层数据结构(上)
1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...
- 算法与数据结构(十五) 归并排序(Swift 3.0版)
上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找
今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...
随机推荐
- javascript动画效果之任意效果任意值
通过学习,我发现当同一个ul下的li标签如果想要不同的效果,那怎么办? 比如第一个li是width变化,第二个li为透明度(opacity)变化,而opacity的值和width的值类型不同,不能通用 ...
- go语言实现寻找最大子数组
题目:给定一个数字序列,寻找其中各元素相加和最大的子数组 /* 寻找最大子数组go语言实现 */ package main import fmt "fmt" func main() ...
- The first to Python
今天在51cto购买了python教程,今后在这里记录我python的点点滴滴,感谢博客园给予的平台,感谢51cto给予的机会,感谢导师.
- json数据格式在IE浏览器中报错问题
如果一个json数据,最后一个数据的后面带有分号,则在IE浏览器中会报错 { "books": [ { "language":"Java" ...
- 转:java.io.IOException: Exceeeded maximum number of redirects: 5 解决版本
Jmeter运行的时候出现的重定向超过n次的问题: When trying to test a Silverlight application, I get the below error. Has ...
- JQuery中常用方法备忘
本文转载自博客园,原文地址 http://www.cnblogs.com/xzf158/archive/2008/10/14/logan.html 1.Window.onload 的JQuery方法 ...
- CSS3秘笈:第九章
1.链接状态:大部分浏览器支持4中基本的链接状态:未访问的链接.已访问的链接.访问者的鼠标正悬停在上方的链接.正被单击的链接.这些状态的4个对应伪类选择器分别是:link.:visited.:hove ...
- 让AutoMapper在你的项目里飞一会儿(转)
出处:http://www.cnblogs.com/WeiGe/p/3835523.html 先说说DTO DTO是个什么东东? DTO(Data Transfer Object)就是数据传输对象,说 ...
- iOS:UIWebView scrollView 的分页滑动问题
最近在弄一个native webview+html的项目,感觉这种尝试还是挺不错的,特被是适合内容类app.如杂志.电子书等.其实native搭的就是一个框架,主体还是在html的内容上,所以花在ht ...
- 07-09 07:28:38.350: E/AndroidRuntime(1437): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.googleplay.ui.activity.MainActivity" on path: DexPathList[[zip file "/data/app/c
一运行,加载mainActivity就报错 布局文件乱写一通,然后急着运行,报莫名其妙的错误: 07-09 07:28:38.350: E/AndroidRuntime(1437): Caused b ...