`
xuanzhui
  • 浏览: 199549 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

关于Set和Map的注意事项

阅读更多

1. HashSet和HashMap

public boolean add(E e)

Adds the specified element to this set if it is not already present. More formally, adds the specified element e to this set if this set contains no element e2 such that (e==null ? e2==null : e.equals(e2)). If this set already contains the element, the call leaves the set unchanged and returns false.

 
public V put(K key, V value)
Associates the specified value with the specified key in this map. If the map previously contained a mapping for the key, the old value is replaced.
 
set add如果是相同的那么忽略新的,老的保持不变
map put如果是相同的key,那么更新老的value
 
hash类型的set和map判断相同的标准是equals,但是也可能为了优化性能先用hashCode进行了过滤,因为如果equals是true的话,要保证这两个object的hashCode是相等的
refer 
 
默认情况下,new出来的对象都是不equals的,hashCode也是不相等的,实际上就是和创建出来的对象内存地址相关的
equals:
The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).
 
hashCode:
As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)
 
所以,如果想要自定义一个对象的比较方式需要手动同时实现equals和hashCode
例如,如下的AppInfo希望set里面保留的都是id不同的对象
public static void main(String[] args) {
    AppInfo app1 = new AppInfo();
    app1.id = "id-1";
    app1.totalCount = 1;

    AppInfo app2 = new AppInfo();
    app2.id = "id-2";
    app2.totalCount = 2;

    AppInfo app3 = new AppInfo();
    app3.id = "id-1";
    app3.totalCount = 3;

    Set<AppInfo> set = new HashSet<>();
    set.add(app1);
    set.add(app2);
    set.add(app3);

    for (AppInfo app : set) {
        System.out.println(String.format("[%s, %d]", app.id, app.totalCount));
    }
}

static class AppInfo {
    public String id;
    public int totalCount;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        AppInfo appInfo = (AppInfo) o;

        return id.equals(appInfo.id);
    }

    @Override
    public int hashCode() {
        return id.hashCode();
    }
}
 结果是
[id-2, 2]
[id-1, 1]
 
2. TreeSet和TreeMap
TreeSet的内部元素是有序的,TreeMap的内部元素key是有序的
这两种类型的数据结构并不会关注equals,而是直接通过Comparator的compare结果,或者是实现Comparable的compareTo结果来判定是否是重复的元素
比如下面直接通过AppInfo的totalCount比较实现排序
public static void main(String[] args) {
    AppInfo app1 = new AppInfo();
    app1.id = "id-1";
    app1.totalCount = 1;

    AppInfo app2 = new AppInfo();
    app2.id = "id-2";
    app2.totalCount = 2;

    AppInfo app3 = new AppInfo();
    app3.id = "id-3";
    app3.totalCount = 2;

    //java8的lambda创建Comparator
    Map<AppInfo, String> map = new TreeMap<>((left, right) -> left.totalCount - right.totalCount);
    map.put(app1, "value1");
    map.put(app2, "value2");
    map.put(app3, "value3");

    for (AppInfo app : map.keySet()) {
        System.out.println(String.format("[%s, %d] --> %s", app.id, app.totalCount, map.get(app)));
    }
}

static class AppInfo {
    public String id;
    public int totalCount;
}
 结果为
[id-1, 1] --> value1
[id-2, 2] --> value3
分享到:
评论

相关推荐

    set,list,map区别与联系

    #### 七、注意事项 - 在选择合适的数据结构时,需要根据实际的应用场景来决定。 - 考虑到性能、内存占用和维护成本等因素。 - 对于 Set 和 Map,还需要考虑元素的比较方式(自然排序或自定义排序)。 综上所述,`...

    Struts2 JSP中将list,set ,Map传递到Action然后<s:iterator>遍历(三十五)

    5. **注意事项**: - 为了防止XSS攻击,使用`s:property`标签时最好加上`escapeHtml="true"`属性。 - 如果集合数据是从数据库中获取,需要确保在Action中进行正确的初始化和填充操作。 - 考虑到性能,避免在JSP中...

    代码编写注意事项

    在编程实践中,尤其是在 PHP 开发中,遵循一定的代码编写注意事项能显著提升代码的效率和可维护性。以下是一些关键的点,可以帮助你优化代码: 1. **利用内置函数**:PHP 提供了大量的内置函数,它们经过优化,执行...

    java中map集合的用法

    Map的注意事项** - 键必须实现`hashCode()`和`equals()`方法,以确保正确地进行哈希计算和比较。 - 如果需要保持插入顺序,应使用LinkedHashMap;如果需要保持自然排序或自定义排序,应使用TreeMap。 - 当使用null...

    ES6中Symbol、Set和Map用法详解

    **注意事项**: - Symbol函数前不能使用`new`关键字,因为它返回的是原始类型的值,不是对象。 - Symbol函数可以接受一个字符串作为参数,描述该Symbol值,但不同参数的Symbol函数返回的值是不相等的。 **特殊用法*...

    JAVA注意事项

    以下是一些关于"JAVA注意事项"的详细说明: 1. **命名规范**:Java有严格的命名规则,类名应使用驼峰式命名,首字母大写;变量和方法名首字母小写;常量全大写,单词间用下划线分隔。遵循这些规范能提高代码可读性...

    安装地图到Basecamp,Mapsource的方法

    5. **PDF指南**:"安装地图到Basecamp,Mapsource的方法.pdf"是一个详细的指南,包含了具体的操作步骤和注意事项。建议仔细阅读这份文档,以确保按照正确的步骤进行操作。 6. **操作界面截图**:"操作界面0002.png...

    09、并发容器(Map、List、Set)实战及其原理

    6. **并发容器的使用注意事项**: - 避免不必要的同步:只在必要时才使用线程安全的容器,否则可能会带来额外的性能开销。 - 使用适当的容器:根据场景选择最合适的容器,例如,如果需要频繁遍历,`...

    C++相关面试题及面试注意事项

    4. **STL(标准模板库)**:STL是C++的一个重要组成部分,包括容器(如vector、list、set、map)、迭代器、算法和函数对象。掌握如何使用这些组件来实现高效的数据结构和算法。 5. **模板**:了解模板的两种形式...

    java-遍历map

    ### 四、注意事项 - 在遍历`Map`时,如果在遍历过程中尝试修改`Map`(例如添加或删除元素),可能会引发`ConcurrentModificationException`异常。因此,在遍历的同时不要修改`Map`。 - 使用流API遍历时,虽然代码更...

    C++笔试题及其注意事项.rarC++笔试题及其注意事项.rar

    在解压后的“C++笔试题及其注意事项”文件中,可能包含了历年笔试题的精选集和解答,以及一些常见的陷阱和面试策略。通过深入学习和实践这些题目,可以有效提升C++编程能力,顺利通过笔试环节。同时,不要忘记在复习...

    Map转换成xml

    #### 四、注意事项 - **编码问题**:确保XML文档的编码正确,避免在不同系统间传输时出现乱码。 - **特殊字符处理**:XML有特定的字符规则,例如`, `&gt;`, `&`等需要被转义。 - **性能考虑**:对于大数据量的`Map`,...

    ES6教程之for循环和Map,Set用法分析

    5. **注意事项** - for-of并不适用于普通对象的属性遍历,如果需要遍历对象属性,应使用for-in或Object.keys()方法。 总的来说,ES6的for循环和Map、Set提供了更强大的数据处理能力,使JavaScript编程更加简洁和...

    MapServer帮助文档

    4. **操作系统的注意事项**: - 在Windows和Unix/Linux系统下可能有所不同。 - 注意路径名、文件权限等问题。 5. **其他资源**: - MapServer官方网站上的文档。 - 社区论坛和邮件列表。 6. **第一节:静态...

    面试注意事项

    4. 描述一下Java集合框架,包括List、Set和Map的区别。 5. 什么是JVM?它是如何工作的? 6. 请解释一下异常处理,并给出一个例子。 7. Java中的接口和抽象类有什么不同? 8. 什么是泛型?它的优点是什么? 9. 请解释...

    Unity3D开发项目中的十个注意事项1

    在进行Unity3D项目开发时,遵循一些最佳实践和注意事项能够提高效率,优化性能,以及确保项目的稳定性和兼容性。以下是根据标题和描述总结的十个注意事项: 1. 面数控制:在3Dsmax中制作的Game Object模型,其面数...

    cocos2dx 3.3 tilemap 缩放滑动并且准确点击对象

    7. **优化与注意事项** - 缩放和滑动时要注意性能问题,避免不必要的重绘。 - 优化点击检测,例如通过预处理对象的碰撞区域,减少计算量。 - 注意处理边界条件,防止地图滑出可视区域。 以上就是关于“cocos2dx ...

    JAVA面试体系一条龙(含笔试与各种注意事项与标准模板)

    集合框架是Java面试中的热门话题,包括List、Set、Map接口及其实现类的特性和使用场景。 1. ArrayList和LinkedList:它们的实现方式和性能对比。 2. HashSet和HashMap:哈希算法的理解及其冲突解决策略。 3. ...

    Mapobject基础PPT演示文稿

    最后的章节通过一个或多个实际案例,展示MapObject在实际项目中的应用,总结一些常用的技巧和注意事项,帮助学习者提升解决问题的能力。 通过这9个章节的学习,初学者可以全面了解MapObject的基本功能和用法,为...

    计算机等级考试二级C++注意事项.pdf

    由于提供的文件内容实际上是一串看似无序和混乱的字符和代码片段,其中还夹杂了一些考试注意事项的模糊暗示,我们首先需要从这些内容中提炼出相关的计算机二级C++考试的知识点。由于内容的不完整性,我们无法保证...

Global site tag (gtag.js) - Google Analytics