treemap

Java集合4-3

做~自己de王妃 提交于 2021-01-11 09:42:46
Java集合4-3 文章目录 Java集合4-3 类集结构图 一、链表和二叉树思路 二、Collection接口 三、List接口 1.ArrayList 2.Vector 3.LinkedList 四、Iterator和ListItertor 五、forEach 六、Set接口 七、HashSet 八、TreeSet类与Comparable接口 九、Map 接口 1.哈希表 2.HashMap/HashTable/ConcurrentHashMap/TreeMap/LinkedHashMap 3.Map集合各子类区别分析 4.存储自定义对象 十、JDK9集合新特性 类集结构图 集合是Java中一些成熟的数据结构的实现 一、链表和二叉树思路 (1)链表 class Node { Object data; Node next; } (2)二叉树 class Node { Object data; Node left; Node right; } 二、Collection接口 一般不会直接使用Collection接口,而是使用其子接口List和Set,都是存储单值的集合类,前者可以重复,后者不可以重复 三、List接口 List的实现类,ArrayList(95%)、LinkedList(1%)和Vector(4%),Vector是ArrayList的早期实现

详解红黑树和TreeMap的方法原理

橙三吉。 提交于 2021-01-10 09:54:14
参考算法导论 本文篇幅可能较长需要读者慢慢理解,一步一步看。 什么是红黑树? 我们要了解红黑树就必须知道红黑树是什么?红黑树的红和黑是什么意思?红黑树能解决什么样的问题?红黑树解决这样问题采用的是什么方法?如果带着这样的问题去了解红黑树那么就有助于我们清楚的认识红黑树。 首先对二叉树进行讲解(了解二叉树的同学可以跳过) 首先二叉树这种数据结构是为了解决数据进行检索时快速的找到我们要找的数据。它区别于链表在于检索数据时所付出的时间代价是不一样的。 从上图我们可以清楚的了解什么样的数据选择什么样的结构。比如我们要在集合{1,2,3,4····10000}中查找整数n,那么链表最坏的情况下的时间复杂度为O(n),而二叉树(二叉树建立的合理矮胖矮胖的)则只需要O(lg n)。而数据量越来越大时二叉树表现得越好。 但是当二叉树的数据分布是这个样子时那它和链表的区别就很小了。 这样的二叉树结构显然不是我们想要的,我们想要的是那种深度越小越好的,也就是矮矮胖胖的。 平衡二叉树 平衡二叉树通过在给元素插入时改变节点数据来使树的结构变得矮平。 从b变为a就是平衡二叉树的作用。 那么平衡二叉树和红黑树有什么关系呢?红黑树就是一种平衡二叉树,它是通过改变元素节点时通过左旋和右旋进行的。那么还是倒回来,红是啥?黑是啥?左旋是啥?右旋是啥?这都tm是啥?哈哈。要想了解就要了解红黑树相关的另一种2-3树

java源码之Comparable和Comparator

拥有回忆 提交于 2021-01-10 02:50:44
1,Comparable 简介 Comparable 是排序接口。 若一个类实现了Comparable接口,就意味着“ 该类支持排序 ”。 即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”, 则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序 。 此外,“ 实现Comparable接口的类的对象 ”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的 元素 ,而不需要指定比较器。 Comparable 定义 Comparable 接口仅仅只包括一个函数,它的定义如下: package java.lang; import java.util.* ; public interface Comparable<T> { public int compareTo(T o); } 说明: 假设我们通过 x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”。 2,Comparator 简介 Comparator 是比较器接口。 我们若需要控制某个类的次序,而 该类本身不支持排序 (即没有实现Comparable接口);那么

二叉树——平衡二叉树,二叉搜索树,完全二叉树

无人久伴 提交于 2021-01-09 02:26:36
平衡二叉树:是用来解决效率问题的 套路:树形DP 二叉树——判断一棵树是否是平衡二叉树 (空树或者左右两个孩子高度差不超过1) 优化: 剑指offer——平衡二叉树 搜索二叉树:不出现重复结点 Java基础——集合 二叉树——判断一棵树是否是搜索二叉树 (中序遍历是升序即可) 二叉树——平衡二叉搜索树 TreeSet, TreeMap 完全二叉树: 二叉树——判断一棵树是否是完全二叉树 二叉树按层遍历 判断逻辑    1. 一个节点有右孩子但没有左孩子,不是完全二叉树 return false    2. 一个节点有左孩子,没有右孩子;或者左右孩子都没有的情况,后面遇到的所有节点都必须是 叶节点 ,否则不是完全二叉树 return false    3. 其余的遍历完了,都不违反1,2则是完全二叉树 来源: oschina 链接: https://my.oschina.net/u/4325061/blog/4017189

集合的学习

烂漫一生 提交于 2021-01-08 20:18:59
JAVA常用的数据结构知识,主要看集合相关。 数组和集合都是用来存储对象的,区别在于数组长度固定,集合的长度可变;数组存储基本数据类型,集合存储对象。 集合特点:只用于存储对象,长度可变,可以存储不同类型的对象。 集合框架体系 Collection接口是List、Set、Queue的父级接口。 Set接口有两个常用的实现类:HashSet和TreeSet。List接口的常用接口有ArrayList和Vector接口。 Map接口有两个常用的实现类:Hashtable和HashMap。 上述类图中,实线边框的是 实现类 ,比如ArrayList,LinkedList,HashMap等,虚线边框的是 抽象类 ,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是 接口 ,比如Collection,Iterator,List等。 1、Iterator接口   Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法。它的一个子接口LinkedIterator在它的基础上又添加了三种方法,分别是add(),previous(),hasPrevious()。也就是说如果是先Iterator接口,那么在遍历集合中元素的时候,只能往后遍历,被遍历后的元素不会在遍历到

Java集合--TreeSet详细解析

怎甘沉沦 提交于 2021-01-06 22:51:37
[TOC] 谈到TreeSet的特点,估计大家脑海里想到的都是:有序,不可重复,红黑树,基于Treemap实现,自定义排序等特点。这篇博客帮助大家从源码梳理下TreeSet的知识点。 ###1.构造函数 TreeSet提供了四种构造器 TreeSet() TreeSet(Collection< ? extends E> c) TreeSet(Comparator< ? super E> comparator) TreeSet(SortedSet< E > s) 四种构造器在底层都调用了同一个方法。以无参构造函数为例。[1]处的this方法最终调用的是[2]的方法,其中四个构造器的传参都被TreeMap封装了一层。 public TreeSet() { this(new TreeMap<E,Object>()); //[1] } TreeSet(NavigableMap<E,Object> m) {//[2] this.m = m; } ###2.增 TreeSet在添加元素时,会把元素放入TreeMap中的key上来 确保元素的唯一性 ,并让其value指向一个空对象。TreeSet#add()方法会调用TreeMap#put()方法添加元素,添加元素时,从树的根节点开始遍历直到找到新增元素的parent节点,添加进去。通过TreeMap的源码可以看出维护的是一个红黑树数据结构。

Java基础-TreeSet与Java自定义类型的排序

自作多情 提交于 2021-01-06 20:56:17
TreeSet与Java自定义类型的排序 演示TreeSet对String是可排序的 TreeSet无法对自定义类型进行排序 比较规则怎么写 自平衡二叉树结构 实现比较器接口 Collections工具类 演示TreeSet对String是可排序的 1.TreeMap集合底层实际上是一个TreeMap 2.TreeMap集合底层是一个二叉树 3.放到TreeSet集合中的元素,等同于放到TreeMap集合key部分了 4.TreeSet集合中的元素,无序不可重复,但是可以按照元素的大小顺序自动排序 称为:可排序集合 例如:编写程序从数据库中取出数据,在页面展示用户信息的时候按照生日升序或者降序, 这个时候可以使用TreeSet集合,因为TreeSet集合放进去,拿出来就是有序的。 //创建一个TreeSet集合 TreeSet < String > ts = new TreeSet < > ( ) ; //添加String ts . add ( "zhangsan" ) ; ts . add ( "lisi" ) ; ts . add ( "wangwu" ) ; ts . add ( "zhangsi" ) ; ts . add ( "wangliu" ) ; for ( String s : ts ) { //按照字典顺序排序 System . out . print ( s

java Concurrent并发容器类 小结

怎甘沉沦 提交于 2021-01-06 14:13:08
Java1.5提供了多种 并发容器类 来改进 同步容器 的性能。 同步容器 将所有对容器的访问都 串行化 ,以实现他们的线程安全性。这种方法的代价是严重 降低并发性 ,当多个线程竞争容器的锁时,吞吐量将严重减低。 一、基础集合替代的同步类 ConcurrentHashMap 替代同步的 且基于散列的 Map : HashTable、Collections.synchronizedMap(new HashMap() ); CopyOnWriteArrayList 用于在遍历操作为主要操作的情况下 替代同步的 List : Vector ,或是Collections.synchronizedMap(new ArrayList() ); CopyOnWriteArraySet 用于在遍历操作为主要操作的情况下 替代同步的 Set : Collections.synchronizedMap(new HashSet() ); 二、有序集合替代的同步类 ConcurrentSkipListMap 替代 同步的 SortedMap : Collections.synchronizedMap(new TreeMap() ) ConcurrentSkipListSet 替代 同步的 SortedSet   : Collections.synchronizedMap(new TreeMap(new

数据结构与算法笔记(八)

有些话、适合烂在心里 提交于 2021-01-05 07:50:03
一、二叉树的查找 1.二叉查找树 对于树结构的查找,因为实际运用中大多都是使用二叉树的结构,因此我们只讨论二叉树的查找。 若有一棵非空二叉树,他满足如下条件: 若他的左子树不为空树,则有左子树上所有结点的值小于根结点的值。 若他的右子树不为空树,则有右子树上所有节点的值大于根结点的值。 他的左右子树也满足上述两个条件。 不能有值相等的结点。 则称这棵树为二叉查找/排序/搜素树。对二叉查找树进行中序遍历可以获取一个有序(升序)排列的集合。 若对一棵普通的二叉查找树查找操作,则过程与二分查找类似,且查找的次数不会超过树的高度。此时查找到额时间复杂度为O(log2n);但若是出现极端情况,一棵二叉查找树完全没有左孩子或完全没有右孩子,此时变成链表结构,查找的时间复杂度也随之变成O(n)。因此,为了提升查询效率,在构建查找树时要尽可能的保证左右子树的结点数量相近,以保证查找效率。 二叉查找树的简单实现: /** * 二叉查找功能接口 * Created by bzhang on 2019/3/2. */ public interface TreeList { //获取根结点 Node getRoot(); // 返回树中的结点数,即数据元素的个数。 int size(); //树的高度 int getHeight(); // 返回树中排在 key 的数据元素 Object get(int

数据结构与算法笔记(九)

走远了吗. 提交于 2021-01-04 08:41:55
一、红黑树 1.红黑树在Java中的应用 以TreeMap为例,了解红黑树在Java中的应用,TreeMap的继承关系如下: 其中Map接口源码: //键值对类型的顶层接口, 通过键(key)来映射到值(value),key和value是对应的关系,因此key不能重复(若果重复将不能保证每次找到的value是相同的)。key不能相同,但value却可以不唯一。 public interface Map<K,V> { //map中包含的键值对数量 int size(); //map是否为空 boolean isEmpty(); //map中是否有含有键为key的键值对 boolean containsKey(Object key); //map中是否含有值为value的价值对 boolean containsValue(Object value); //返回键为key的值值对象 V get(Object key); //存放键值对 V put(K key, V value); //删除键为key的键值对 V remove(Object key); //将m中的所有键值对存放到当前map中 void putAll(Map<? extends K, ? extends V> m); //清空map中的所有键值对 void clear(); //返回map中所有key组成的set集合