Collection  <类型>

List 可以重复,有顺序   可存放多个null值

ArrayList     主选

结构:数组      特点:查找快,增删慢         线程不安全,效率高

Vector

结构:数组      特点:查找快,增删慢          synchronized实现线程安全,效率低

Stack

结构:栈          特点:Vector的子类,也定义了自己的一些方法。       synchronized实现线程安全,效率低

LinkedList

结构:链表      特点:查找慢,增删快          线程不安全,效率低

boolean add(E o) 向列表的尾部追加指定的元素void add(int index,E element) 在列表的指定位置插入指定元素。boolean addAll(Collection<? extends E> c) 追加指定 collection中的所有元素到此列表的结尾,顺序是指定collection的迭代器返回这些元素的顺序。boolean addAll(int index,Collection<? extends E> c) 将指定collection中的所有元素都插入到列表中的指定位置。void clear() 从列表中移除所有元素。boolean contains(Object o) 如果列表包含指定的元素,则返回true。boolean containsAll(Collection<?> c) 如果列表包含指定collection的所有元素,则返回true。boolean equals(Object c) 比较指定的对象与列表是否相等。E get(int index) 返回列表中指定位置的元素。int hashCode() 返回列表的哈希码值。int indexOf(Object o) 返回列表中首次出现指定元素的索引,如果列表不包含此元素,则返回-1。boolean isEmpty() 判断集合是否为空 如果为空 则返回true,否则返回falseIterator<E> iterator() 返回以正确顺序在列表的元素上进行迭代的迭代器。int lastIndexOf(Object o) 返回列表中最后出现指定元素的索引,如果列表不包含此元素,则返回-1。ListIterator<E> listIterator() 返回列表中元素的列表迭代器(以正确的顺序)。ListIterator<E> listIterator(int index)返回列表中元素的列表迭代器(以正确的顺序),从列表的指定位置开始。E remove(int index) 移除列表中指定位置的元素。boolean remove(Object o) 移除列表中出现的首个指定元素。boolean removeAll(Collection<?> c) 从列表中移除指定collection中包含的所有元素。boolean retainAll(Collection<?> c)仅在列表中保留指定collection中所包含的元素。E set(int index,E element) 用指定元素替换列表中指定位置的元素。int size() 返回列表中的元素数。List<E> subList(int forIndex,int toIndex) 返回列表中指定的formIndex(包括) 和toIndex(不包括)之间的部分视图。Object toArray() 返回以正确顺序包含列表中的所有元素的数组。

Set  唯一性,没有顺序   只可存放一个null值

HashSet

结构:哈希表     通过hashCode()、equals()保证元素的唯一性     元素的排列是无序的   线程不安全

基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素

LinkedHashSet

结构:链表+哈希表   与HashSet相比,由链表保证元素有序   线程不安全

TreeSet

结构:红黑树     排序方法有自然排序、比较器排序    唯一性通过存放值时比较返回值是否为0,0既有相同值   线程不安全

TreeSet实现了对TreeMap的封装

实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆

Hash值冲突

hash值冲突是发生在put()时,hash值是通过hash(key.hashCode())来获取的,因为hashCode是int类型,所以最多只能说2^32个,当put的元素越来越多时,出现不同的key产生相同的hash值问题,也即是hash冲突。

分离链表法

对于相同的哈希值,使用链表进行连接。使用数组存储每一个链表。

put的时候地址上存在value,则再对比key是否相同,若hash值和key都相同,则替换value,若hash值相同,key不相同,则形成一个单链表,将hash值相同,key不同的元素以Entry<V,V>的方式存放在链表中,这样就解决了hash冲突。

开放地址方法

按顺序决定哈希值时,如果某数据的哈希值已经存在,则在原来哈希值的基础上往后加一个单位,直至不发生哈希冲突。

equals 和 hashCode区别:

  • 在Object类中,hashCode是一个本地方法简单理解为获取对象地址,equals方法比较自己和obj对象地址是否相 等。在这里一定先认识到这两个方法,一个是取地址,一个是比较地址。equals()和hashCode()都不是final方法。
  • hashCode()是一个native方法,而且返回值类型是整形;该native方法将对象在内存中的地址作为哈希码返回,可以保证不超出整形范围的情况下不同对象的返回值不同。
  • 当我们向哈希表(如HashSet、HashMap等)中添加对象object时,首先调用hashCode()方法计算object的哈希码,通过哈希码可以直接定位object在哈希表中的位置(一般是哈希码对哈希表大小取余)。如果该位置没有对象,可以直接将object插入该位置;如果该位置有对象(可能有多个,通过链表实现),则调用equals()方法比较这些对象与object是否相等,如果相等,则不需要保存object;如果不相等,则将该对象加入到链表中。

注:当我们把自定义类作为Map的Key的时候,需要重写HashCode跟equals方法,原因是要遵循equals相等,hashCode也一定相等,hashCode相等,equals不一定相等的规则。String就重写的这两个方法。

Map<key,value>

HashMap    主选

结构:哈希表(数组+链表)  无序的 只允许一个key为null,可多个值为null    线程不安全

采用分离链表法解决冲突

通过hashCode()、equals()保证元素的唯一性,hashCode()确定数组位置,equlas()确定是否可存放在链表。

实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。

JDK1.8增加了红黑树来进行优化。即当链表超过8时,链表就转换为红黑树,利用红黑树快速增删改查的特点提高HashMap的性能。

缺点:多线程put会陷入死循环,因为Entry链表形成环形数据结构,查找时会陷入死循环。用迭代器遍历时修改集合结构会发生错误。

遍历方法:

    Map<Integer, Integer> map = new HashMap<Integer, Integer>();Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();while (entries.hasNext()) {Map.Entry<Integer, Integer> entry = entries.next();System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());}

LinkedHashMap

结构:数组+双链表

与HashMap相比,LinkedHashMap 的元素是有序的,在LruCache中有使用,因为是LRU,最近最少使用算法需要支持有序。

HashTable

结构:哈希表     key还是value都不能为null   synchronized实现线程安全

实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆

TreeMap

结构:红黑树      排序方法有自然排序、比较器排序      线程不安全  可以插入null键,null值;

无序集合(插入和遍历顺序不一致)

常用方法:

void clear()  从此映射中移除所有映射关系(可选操作)。boolean containsKey(Object key)  如果此映射包含指定键的映射关系,则返回 true。boolean containsValue(Object value)  如果此映射将一个或多个键映射到指定值,则返回 true。Set<Map.Entry<K,V>> entrySet()  返回此映射中包含的映射关系的 Set 视图。boolean equals(Object o)  比较指定的对象与此映射是否相等。V get(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。int hashCode() 返回此映射的哈希码值。boolean isEmpty() 如果此映射未包含键-值映射关系,则返回 true。Set<K> keySet()  返回此映射中包含的键的 Set 视图。V put(K key, V value)  将指定的值与此映射中的指定键关联(可选操作)。void putAll(Map<? extends K,? extends V> m)  从指定映射中将所有映射关系复制到此映射中(可选操作)。V remove(Object key)  如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。int size()  返回此映射中的键-值映射关系数。Collection<V> values()  返回此映射中包含的值的 Collection 视图。

Queue  FIFO队列

操作失败就抛出异常add(E e):添加一个元素到队尾remove():获取队首的元素,并从队列中移除element():获取队首的元素,但不从队列中移除这一组,成功返回true,失败时返回一个特殊值(取决于操作,为NULL或false),offer(E e)操作是专为容量受限的队列实现而设计的;在大多数实现中,插入操作不会失败。offer(E e):添加一个元素到队尾poll():获取队首的元素,并从队列中移除peek():获取队首的元素,但不从队列中移除

迭代器(Iterator)

  迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

  Java中的Iterator功能比较简单,并且只能单向移动:

  • 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
  • hasNext():判断当前元素是否存在,并没有指向的移动
  • next():返回当前元素, 并指向下一个元素
  • 使用remove()将迭代器新返回的元素删除。

  Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

树:

满二叉树:除了叶节点外每一个结点都有左右子女且叶节点都处在最底层的二叉树。

完全二叉树只有最下面的两层结点度小于2,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。

二叉树查找最好O(logN),最差O(N),最差情况是所有的数据全部在一端时。

反转二叉树

if(root==null) return;
else reverseTree(root);
public void reverseTree(Node node){if(node.left!=null) reverseTree(node.left);if(node.right!=null) reverseTree(node.right);Node temp = node.right;node.right = node.left;node.left = temp;
}

二叉查找树:查找最好O(logN),最差O(N),最差情况是所有的数据全部在一端时

1.若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。

2. 若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。

3.任意结点的左、右子树也分别为二叉搜索树。

public class Node {public int index;//关键字段public String data;//值public Node leftNode;//左节点public Node rightNode;//右节点
}//查找
public Node findNode(int key){Node current = root;while(current.index != key){if(key < current.index){//左节点current = current.leftNode;}else{//右节点current = current.rightNode;}if(current == null){return null;}}return current;
}//插入
public void insertNode(int key,String value){Node node = new Node();node.index = key;node.data = value;if(root == null){root = node;return;}//找到插入节点的位置Node parent = root;Node current = root;while(true){parent = current;if(key == current.index){return;}if(key < current.index){//左节点current = current.leftNode;if(current == null){//当前节点已经是叶子结点了parent.leftNode = node;    return;}}else{current = current.rightNode;if(current == null){parent.rightNode = node;return;}}}
}

平衡二叉树:又称为AVL树查找O(logN),它是一颗空树或它的左右两个子树的高度差的绝对值不超过1

哈夫曼树:带权路径长度达到最小的二叉树,也叫做最优二叉树。

k层的二叉树,最多有节点个数为 2^k-1,最少有k个节点

第k层,最多有节点个数为 2^(k-1)个

红黑树:查找删除插入时间复杂度O(logN)

红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。在二叉查找树强制的一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

  1. 节点是红色或黑色。
  2. 根是黑色。
  3. 所有叶子都是黑色(叶子是NIL节点)。
  4. 每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
  5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

前中后层遍历

    public void preOrder(Node root){ // 前序遍历,"中左右"if (root != null){System.out.print(root.data + " ");preOrder(root.left);preOrder(root.right);}}public void inOrder(Node root){ // 中序遍历,"左中右"if (root != null){inOrder(root.left);System.out.print(root.data + " ");inOrder(root.right);}}public void postOrder(Node root){ // 后序遍历,"左右中"if (root != null){postOrder(root.left);postOrder(root.right);System.out.print(root.data + " ");}}public void floorOrder(Node root){if(root==null) return;Queue<Node> q = new LinkedBlockingQueue<>();q.add(root);while(!q.isEmpty()){Node t = q.poll();System.out.println(t.value);if(t.left!=null)q.add(t.left);if(t.right!=null)q.add(t.right);}}

Java—Collection、Map、树相关推荐

  1. Java Review - 集合框架=Collection+Map

    文章目录 概述 容器 = Collection + Map Collection Set TreeSet HashSet LinkedHashSet List ArrayList Vector Lin ...

  2. java之Map和Collection

    java中保存对象的容器可分为两类: 1.Map.Map是以键值对的形式来保存一组对象,可以通过键来查找值. 2.Collection.用来保存独立对象的序列.Collection又可分为三种类型: ...

  3. 10_07【Java】Map集合详述

    如果想要存储具有映射关系的数据,那么就需要使用Map集合了.Map集合由Map接口和Map接口的实现类组成. 一.Map接口概述 1.Map接口是什么? Map是一个以键值对存储的接口,也就是将键映射 ...

  4. java 定义map集合_java基础-Map集合

    java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...

  5. Java中Map用法详解

    原文地址http://blog.csdn.net/guomutian911/article/details/45771621 原文地址http://blog.csdn.net/sunny2437885 ...

  6. Java数据结构Map遍历和排序

    map结构和list结合很好用,基本的遍历和排序每次都要查一下,用的不熟练,这里汇总下map的基本遍历和排序,参考的代码如下: package com.vip;import java.util.Arr ...

  7. java map集合遍历方法,Java的Map集合的三种遍历方法

    集合的一个很重要的操作---遍历,学习了三种遍历方法,三种方法各有优缺点~~ 1. package com.myTest.MapText; import java.util.Collection; i ...

  8. Java - Collection

    Collection层次结构 Collection [plain] view plaincopy print? 子接口 Set,List 集合中只能放置对象的引用,不能放置原生数据类型, 我们需要使用 ...

  9. 详解Java中Map用法

    Map以按键/数值对的形式存储数据,这里要特别说明( Map.Entry,是Map的内部类,它用来描述Map中的键/值对). Map是一个接口,我们平时多用它的实现类HashMap. 用例如下: pu ...

  10. Java中Map集合类的用法(HashMap)

    Map键值对,键(key)一般存储索引,值(value)一般存储对象. Map的特性即「键-值」(Key-Value)匹配 java.util.HashMap HashMap在内部使用哈希(Hash) ...

最新文章

  1. 异步方法顺序调用问题
  2. Linux学习笔记-软件安装管理
  3. java script jquery_Java Script 学习笔记 -- jQuery
  4. Hadoop HDFS (3) JAVA訪问HDFS之二 文件分布式读写策略
  5. python读取pdf文件 pdfplumber_Python pdfprumber用于PDF表提取,pythonpdfplumber,表格
  6. 阅读笔记《梦断代码》其二
  7. utilities(matlab)—— mat2imgcell
  8. 环境土壤物理模型HYDRUS1D/2D/3D实践技术
  9. ESP8266WIFI模块连接原子云及手机APP
  10. LQR,iLQR,DDP控制论经典算法(MBRL基础知识)
  11. 洛谷P4572 [JSOI2013] 哈利波特与死亡圣器
  12. s20赛季服务器维护,王者荣耀S20赛季什么时候结束 S20赛季具体结束日期
  13. matlab触发igbt电路设计,IGBT单相桥式无源逆变电路设计(纯电阻负载).doc
  14. 研究生录取数据分析 Python123
  15. VMware workstation Pro 15注册码
  16. PMP 中文注册、报考流程
  17. 深度学习总结:深层神经网络(tensorflow实战)
  18. mysql nhibernate_NHibernate+MySql常见问题
  19. 大学生中秋节网页作业制作 学生中秋节日网页设计模板 八月十五中秋静态网页成品代码下载 中秋节日网页设计作品
  20. 计算机硬件的认识与组装实训报告,计算机硬件及组装实训报告

热门文章

  1. sqlserver date类型和字符串比较_VB编程基本数据类型完整剖析
  2. C语言荣获2019年度最佳编程语言
  3. 服务器mtf路径文件损坏,来自节点 js 服务器的错误但不指向任何特定文件
  4. linux双网卡绑定同一IP步骤,linux系统双网卡绑定单个IP地址
  5. mysql load 占位符_Mysql占位符插入
  6. 年度调薪一般涨多少_又到年底,HR 你拿什么标准来调薪?
  7. python2.x和3.x的区别 print_Python2.x和Python3.x的区别
  8. 电信申请固定ip_各个代理ip之间的关系
  9. 洛谷 P2163 [SHOI2007]园丁的烦恼 (离线sort,树状数组,解决三维偏序问题)
  10. 陌上花开 HYSBZ - 3262 (CDQ分治)