java中的几种泛型类——HashSet、HashMap、TreeSet、TreeMap,遍历map,排序,HashTable比较

HashSet

HashSet<E>泛型类在数据组织上类似于数学上的集合,可以进行“交”、“并”、“差”等运算。
HashSet<E>泛型类创建的对象称为集合,如:
    HashSet<E> set =  HashSet<String>();
    那么set就是一个可以存储string类型数据的集合,set可以调用add(String s)方法将string类型的数据添加到集合中。添加到集合中的数据称为集合的元素。集合不允许有相同的元素。也就是说,如果b已经是集合中的元素,那么执行add(b)的操作是无效的。集合对象的初始容量是16字节,装载因子是0.75。也就是说,如果集合添加的元素超过总容量的75%是,集合的容量将增加1倍。
相关运算:
并运算:boolean addAll(HashSet);
交运算:boolean retainAll(HashSet);
差运算:boolean remainAll(HashSet);
参数指定的集合必须与当前集合是同种类型的集合,否则上述方法返回的类型是false。
HashSet<E>泛型类实现了泛型接口Set<E>,而Set<E>接口是Collection<E>接口的子接口。HashSet<E>类中的绝大部分方法都是接口方法的实现。编程时,可以使用接口回调技术,即把HashSet<E>对象的引用赋值给Collection<E>接口变量或Set<E>接口变量,那么接口就可以调用类实现的接口方法。

HashMap

HashMap<K,V>对象成为散列映射对象。散列映射用于存储键-值数据对,允许把任何数量的键-值数据存储在一起。键不可以可重复。如果出现两个数据项的键相同,那么先前散列映射中的键-值对将被替换。散列映射在它需要更多存储容量是会自动增大容量。例如,如果散列映射的装载因子是75%时,它就自动把容量增加到原始容量的2倍。对于数组和链表这两种数据结构,如果要查找它们存储的某个特定的元素却不知道它们的位置,就需要从头开始访问元素知道找到匹配的为止;如果数据结构中包含很多元素,就会浪费时间。这时最好使用散列映射来存储要找的数据,以便检索时可以减少检索的开销。
HashMap<K,V>泛型类创建的对象称为散列映射,如:
     HashMap<K,V> hash = HashMap<String,Student>();
     那么,hash就可以存储键-值对数据,其中的键必须是一个String对象,键对应的值必须是Student对象。hash可以调用
public V put(K key, V value)方法将键-值对存储在散列映射中,同时返回键所对应的值。
   遍历散列映射的方法有如下四种:
public static void main(String[] args) {Map<String, String> map = new HashMap<String, String>();map.put("1", "value1");map.put("2", "value2");map.put("3", "value3");// 第一种:普遍使用,二次取值System.out.println("通过Map.keySet遍历key和value:");for (String key : map.keySet()) {System.out.println("key= " + key + " and value= " + map.get(key));}// 第二种System.out.println("通过Map.entrySet使用iterator遍历key和value:");Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();while (it.hasNext()) {Map.Entry<String, String> entry = it.next();System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());}// 第三种:推荐,尤其是容量大时System.out.println("通过Map.entrySet遍历key和value");for (Map.Entry<String, String> entry : map.entrySet()) {System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());}// 第四种System.out.println("通过Map.values()遍历所有的value,但不能遍历key");for (String v : map.values()) {System.out.println("value= " + v);}
}
HashMap<E>泛型类是实现泛型接口Map<E>。

TreeSet

TreeSet<E>类是实现Set接口的类。
TreeSet<E>泛型类创建的对象称为树集,如:
     TreeSet<Student> tree = TreeSet<Student>();
     那么tree就是一个可以存储Student对象的集合,tree可以调用add(Student s)方法将Student对象添加到树集中。树集采用树结构存储数据,树集节点的排列和链表不同,不按添加的先后顺序顺序排列。树集采用add()方法增加节点,节点会按其存放的数据的“大小”顺序一层一层地依次排序,同一层的节点按“大小”顺序递增排列,下一层的比上一层的小树集是一个有序集合

TreeMap

TreeMap类实现了Map接口,TreeSet类提供了按排序顺序存储键-值对的有效手段。TreeMap保证它的元素按key升序排列。
构造函数有2种:
   TreeMap<K,V>()按照关键字key的大小顺序来对键-值对进行升序排序,key的顺序是按其字符串表示的字典顺序。
   TreeMap<K,V>(Comparator<K> comp)关键字key的大小顺序按照Comparator接口规定的大小顺序对树映射中的键-值对进行排序,即可以升序,也可以降序,取决于里面重写的方法。
   下面是一个排序的例子:
package test;import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;public class Sort {public static void main(String[] args) {System.out.println("开始:");Person person1 = new Person("马先生", 220181);Person person2 = new Person("李先生", 220193);Person person3 = new Person("王小姐", 220186);Map<Number, Person> map = new HashMap<Number, Person>();map.put(person1.getIdCard(), person1);map.put(person2.getIdCard(), person2);map.put(person3.getIdCard(), person3);System.out.println("由HashMap类实现的Map集合,无序:");for (Iterator<Number> it = map.keySet().iterator(); it.hasNext();) {// 遍例集合Person person = map.get(it.next());System.out.println(person.getIdCard() + " " + person.getName());}System.out.println("由TreeMap类实现的Map集合,键对象升序:");TreeMap<Number, Person> treeMap = new TreeMap<Number, Person>();treeMap.putAll(map);for (Iterator<Number> it = treeMap.keySet().iterator(); it.hasNext();) {// 遍例集合Person person = treeMap.get(it.next());System.out.println(person.getIdCard() + " " + person.getName());}System.out.println("由TreeMap类实现的Map集合,键对象降序:");TreeMap<Number, Person> treeMap2 = new TreeMap<Number, Person>(Collections.reverseOrder());// 初始化为反转排序treeMap2.putAll(map);for (Iterator it = treeMap2.keySet().iterator(); it.hasNext();) {// 遍例集合Person person = (Person) treeMap2.get(it.next());System.out.println(person.getIdCard() + " " + person.getName());}System.out.println("结束!");}
}class Person {private String name;private long idCard;public Person(String name, long idCard) {this.name = name;this.idCard = idCard;}public long getIdCard() {return idCard;}public void setIdCard(long idCard) {this.idCard = idCard;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

     输出结果为:
开始:
由HashMap类实现的Map集合,无序:
220186 王小姐
220181 马先生
220193 李先生
由TreeMap类实现的Map集合,键对象升序:
220181 马先生
220186 王小姐
220193 李先生
由TreeMap类实现的Map集合,键对象降序:
220193 李先生
220186 王小姐
220181 马先生
结束!

TreeMap也可以用一个简单的方法使它按键key降序排列:
TreeMap<Double, double[]> sortMap = new TreeMap<Double, double[]>(<span style="color:#ff0000;">Collections.reverseOrder()</span>);// 初始化为翻转排序

所以,如果map需要按键排序,把键-值对放在TreeMap即可

map中按值排序则需要重写Comparator方法,如下的例子:
 List<Map.Entry<Integer, Double>> entrySet = newArrayList<Map.Entry<Integer, Double>>(map.entrySet());System.out.println("排序前的特征值: " + entrySet);Collections.sort(entrySet,new <span style="color:#ff0000;">Comparator</span><Map.Entry<Integer, Double>>() {public int compare(Entry<Integer, Double> o1,Entry<Integer, Double> o2) {return o2.getValue().compareTo(o1.getValue());//<span style="color:#ff0000;">此处对象o1和对象o2的先后顺序可决定是按升序还是按降序排序</span>}});

Map常用操作

         1) 添加操作:
        V put(K key, V value):如果key已存在,在关联后,返回替换前该key对应的value值,如果不存在,则返回null;
        void putAll(Map t):将来自特定映像的所有元素添加给该映射。
    2) 删除操作:
        V remove(Object key):从此映射中移除指定键的映射关系(如果存在),不存在则返回null;
        void clear() :从此映射中移除所有映射关系. 
    3) 查询操作:
        V get(key): 获得与关键字key相关的值,并且返回与关键字key相关的对象,如果没有该关键字,则返回null;判断key是否存在,可以通过返回值是否等于null
        boolean containsKey(key): 判断映像中是否存在关键字key;
        boolean containsValue(Object value): 判断映像中是否存在值value;
        int size(): 返回当前映像中映射的数量;
        boolean isEmpty(): 判断映像中是否有任何映射.
        Collection values():返回映像中所有value值的集由于值多个,用Collection集合,对其操作可以使用Collection基本方法.

 

HashMap和HashTable的区别:

     1) HashTable:底层是哈希表数据结构;hash值直接使用对象的hashCode;不可以存入null键和null值;hash数组默认大小是11,增加的方式是 old*2+1;线程同步,在多线程并发的环境下,可以直接使用Hashtable;JDK1.0效率低;
   2) HashMap:继承自Dictionary类,底层是哈希表数据结构;重新计算hash值;可以存入null键和null值;hash数组的默认大小是16而且一定是2的指数;线程不同步,在多线程并发的环境下,要自己增加同步处理;JDK1.2效率高。
    一般情况下,HashMap能够比Hashtable工作的更好、更快,主要得益于它的散列算法,以及没有同步。应用程序一般在更高的层面上实 现了保护机制,而不是依赖于这些底层数据结构的同步,因此,HashMap能够在大多应用中满足需要。推荐使用HashMap,如果需要同步,可以使用同步工具类将其转换成支持同步的HashMap。

LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

有并发访问的时候用ConcurrentHashMap,效率比用锁的HashMap好 功能上可以,但是毕竟ConcurrentHashMap这种数据结构要复杂些,如果能保证只在单一线程下读写,不会发生并发的读写,那么就可以试用HashMap。ConcurrentHashMap读不加锁 

——————————————————————————————————————————————————————
写博经验尚浅,请各位多多指教。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保驾护航金三银四,100%好评!

前端的兴起 前端真正兴起和开始频繁出现在大家的视线里&#xff0c;大概是在十年前。彼时的 Web 开发基本是由后端主导&#xff0c;前端能做的只是校验一下数据、操作一下 DOM。&#xff08;其中数据检验是 JS 产生的根本原因&#xff1a;当时网络太慢&#xff0c;在服务端检验…

java连接mysql数据库(JDBC),存到二维数组里并输出

java连接mysql数据库都有固定的操作&#xff0c;步骤如下&#xff1a; 加载mysql驱动&#xff0c;一般都是com.mysql.jdbc.Driver。提供JDBC连接的URL。 创建数据库的连接。要连接数据库&#xff0c;需要向java.sql.DriverManager请求并获得Connection对象。 创建一个Statem…

保驾护航金三银四,万字解析!

从事前端开发工作差不多3年了&#xff0c;自己也从一个什么都不懂的小白积累了一定的理论和实践经验&#xff0c;并且自己也对这3年来的学习实践历程有一个梳理&#xff0c;以供后面来细细回忆品味。 1、为什么选择学习前端开发&#xff1f; 你可能是因为兴趣&#xff0c;完成…

数据降维技术——PCA(主成分分析)

为什么要对数据进行降维&#xff1f; 在机器学习或者数据挖掘中&#xff0c;我们往往会get到大量的数据源&#xff0c;这些数据源往往有很多维度来表示它的属性&#xff0c;但是我们在实际处理中只需要其中的几个主要的属性&#xff0c;而其他的属性或被当成噪声处理掉。比如&a…

保驾护航金三银四,使用指南

前言 作为一个程序员&#xff0c;当然总是期望自己的代码能「一次编写&#xff0c;四处运行」&#xff0c;但真实经验往往是「一处修改&#xff0c;百处填坑」&#xff0c;依赖落后了好几个版本了想要升级、老代码已经看着很不爽了打算重构&#xff0c;都需要下坚决的决心&…

社交网络初探——链路预测

社交网络可以用来描述现实社会中的实际网络&#xff0c;它包括人与人之间的社会关系&#xff0c;物种之间的捕食关系&#xff0c;科学研究中的合作关系等。大量研究已经表明在真实世界中各种不同社交网络具有许多共同的结构特征&#xff0c;例如小世界性质、无标度性、社团结构…

保驾护航金三银四,内容太过真实

前言 正式学习前端大概 3 年多了&#xff0c;接触前端大概 4 年了&#xff0c;很早就想整理这个书单了&#xff0c;因为常常会有朋友问&#xff0c;前端该如何学习&#xff0c;学习前端该看哪些书&#xff0c;我就讲讲我学习的道路中看的一些书&#xff0c;虽然整理的书不多&a…

决策树——ID3和C4.5

决策树&#xff08;decision tree&#xff09;是一个树结构&#xff08;可以是二叉树或非二叉树&#xff09;。其每个非叶节点表示一个特征属性上的测试&#xff0c;每个分支代表这个特征属性在某个值域上的输出&#xff0c;而每个叶节点存放一个类别。使用决策树进行决策的过程…

保驾护航金三银四,分分钟搞定!

开头 Web前端开发基础知识学习路线分享&#xff0c;前端开发入门学习三大基础&#xff1a;HTML、CSS、JavaScript。除此之外还要学习数据可视化、Vue、React、Angular相关框架&#xff0c;熟练运用框架提升开发效率&#xff0c;提升稳定性。 [外链图片转存失败,源站可能有防盗…

数组的初始化及输出

二维数组可以不初始化列数&#xff08;第二维&#xff09;。 下面给出的例子是用两种不同的方式存储二维数组并输出&#xff1a; 1. 这是我们通俗易懂的二维数组存储方法&#xff1a; String[][] data new String[][] {{ "youth", "high", "no&quo…

保驾护航金三银四,吐血整理

前言 又逢金三银四&#xff0c;拿到大厂的offer一直是程序员朋友的一个目标&#xff0c;我是如何拿到大厂offer的呢&#xff0c;今天给大家分享我拿到大厂offer的利器&#xff0c;前端核心知识面试宝典&#xff0c;内容囊括Html、CSS、Javascript、Vue、HTTP、浏览器面试题\数…

Ajax知识笔记——入门,同步和异步,XHR

Ajax全称&#xff1a;Asynchronous Javascript and XML &#xff0c;异步的javascript和XML。 Ajax不是一种语言&#xff0c;是一种无需重新加载整个网页的情况下&#xff0c;能更新部分网页的技术。&#xff08;与后台交互&#xff0c;实现局部更新&#xff0c;异步更新&…

保驾护航金三银四,含BATJM大厂

前言 跳槽&#xff0c;这在 IT 互联网圈是非常普遍的&#xff0c;也是让自己升职加薪&#xff0c;走上人生巅峰的重要方式。那么作为一个普通的Android程序猿&#xff0c;我们如何才能斩获大厂offer 呢&#xff1f; 疫情向好、面试在即&#xff0c;还在迷茫踌躇中的后浪们&…

保驾护航金三银四,妈妈再也不用担心我找工作了!

01 前言 2021是不平凡的一年&#xff0c;这一年里发生许多事情&#xff0c;大家也都知道。对于互联网行业来说也是一次重大的打击&#xff0c;也有一些企业在这次疫情中倒闭了&#xff0c;所以可能对于今年2021年毕业的同学来说是一次很大的考验&#xff0c;也关乎我们的前途。…

web开发者工具,118页Vue面试题总结,涨姿势!

逻辑运算符 JavaScript中有三个逻辑运算符&#xff0c;&&与、||或、!非。 JavaScript 中的逻辑运算符可用来确定变量或者是值之间的逻辑关系。通常用于布尔型值&#xff0c;会返回一个布尔值true 或 false。而 &&、|| 运算符能够使用非布尔值的操作数&#x…

2G、3G 和 4G

2G、3G 和 4G 区别形象比喻 版本1&#xff1a; 2G 看小说&#xff1b; 3G 看app、微博、新闻……&#xff1b; 4G 看苍井空、松岛枫…… 版本2&#xff1a; 2G 看「女教师.txt」 3G 看「女教师.jpg」 4G 看「女教师.avi」 版本3&#xff1a; 选自&#xff1a;365知识网 2G:打个…

web开发者工具,261页前端面试题宝典,通用流行框架大全

开头 Web前端开发基础知识学习路线分享&#xff0c;前端开发入门学习三大基础&#xff1a;HTML、CSS、JavaScript。除此之外还要学习数据可视化、Vue、React、Angular相关框架&#xff0c;熟练运用框架提升开发效率&#xff0c;提升稳定性。 [外链图片转存失败,源站可能有防盗…

jsp+js实现二级级联

本文实现学院-专业二级级联&#xff0c;同理可用到省份-城市&#xff0c;洲-国家等级联&#xff0c;即通过不同的首选择&#xff0c;自动找到属于第一选择的二次可选项。 test.jsp <% page language"java" contentType"text/html; charsetgb2312" impor…

web开发者工具,你必须知道的CSS盒模型,架构师必备!

前言 不要为了面试而去背题&#xff0c;匆匆忙忙的&#xff0c;不仅学不进去&#xff0c;背完了几天后马上会忘记。 你可能会说&#xff0c;“没办法&#xff0c;这不是为了能找份工作嘛&#xff01;”。我想说的是&#xff0c;“那你没开始找工作的时候&#xff0c;咋不好好…

web开发要学多久,HTML表格标签,薪资翻倍

前言 作为一个程序员&#xff0c;当然总是期望自己的代码能「一次编写&#xff0c;四处运行」&#xff0c;但真实经验往往是「一处修改&#xff0c;百处填坑」&#xff0c;依赖落后了好几个版本了想要升级、老代码已经看着很不爽了打算重构&#xff0c;都需要下坚决的决心&…