去重 属性_面试中常问的List去重问题,你都答对了吗?

12fd57cc7ee05d29b4f32fb4d6a4db87.png

面试中经常被问到的list如何去重,用来考察你对list数据结构,以及相关方法的掌握,体现你的java基础学的是否牢固。

我们大家都知道,set集合的特点就是没有重复的元素。如果集合中的数据类型是基本数据类型,可以直接将list集合转换成set,就会自动去除重复的元素,这个就相对比较简单。

如下示例:

public class Test {public static void main(String[] args) {List list = new ArrayList();list.add(11);list.add(12);list.add(13);list.add(14);list.add(15);list.add(11);System.out.println(list);Set set = new HashSet();List newList = new ArrayList();set.addAll(list);newList.addAll(set);System.out.println(newList);}}

输出结果为:

83ec418e257ac75d18b436fa5defe431.png

我们可以看到去重成功了。

在面试中被问到list去重问题,大部分回答都会是list和set互转,利用set自动去除重复属性的方法去重,但是这样的回答并不会得分。

当list集合中存储的类型是对象类型的时候,我们就不能简单的只把list集合转换成set集合。

我们定义一个对象类:

public class People {private String name;private String phoneNumber;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPhoneNumber() {return phoneNumber;}public void setPhoneNumber(String phoneNumber) {this.phoneNumber = phoneNumber;}public People(String name, String phoneNumber) {super();this.name = name;this.phoneNumber = phoneNumber;
}@Overridepublic String toString() {return "People{" +"name='" + name + ''' +", phoneNumber='" + phoneNumber + ''' +'}';}}

我们使用上面的set去重的方法去重:

public static void main(String[] args) {List<People> listPeople = new ArrayList<People>();listPeople.add(new People("张三", "11111"));listPeople.add(new People("张三",  "22222"));listPeople.add(new People("李四",  "33333"));listPeople.add(new People("张三",  "22222"));Set<People> setData = new HashSet<People>();setData.addAll(listPeople);System.out.println("list:" + listPeople.toString());System.out.println("set:" + setData.toString());}

运行后输出的结果为:

70d496263d31a74b37d55dca52c0d71a.png

我们可以看到第二个张三和最后一个张三,信息都一样,却没有被去重。

当list集合中存储的是对象时,我们需要在对象的实体类中去重写equals()方法和hashCode()方法,如下:

public class People {private String name;private String phoneNumber;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPhoneNumber() {return phoneNumber;}public void setPhoneNumber(String phoneNumber) {this.phoneNumber = phoneNumber;}public People(String name, String phoneNumber) {super();this.name = name;this.phoneNumber = phoneNumber;
}@Overridepublic String toString() {return "People{" +"name='" + name + ''' +", phoneNumber='" + phoneNumber + ''' +'}';}@Overridepublic boolean equals(Object arg0) {// TODO Auto-generated method stubPeople p = (People) arg0;return name.equals(p.name) && phoneNumber.equals(p.phoneNumber);}@Overridepublic int hashCode() {// TODO Auto-generated method stubString str = name + phoneNumber;return str.hashCode();}}

此时运行上面的test方法,去重就成功了。

最后,我们拿出String中的equals()方法和hashCode()方法源码来加深认识:

equals()

    public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;int n = count;if (n == anotherString.count) {char v1[] = value;char v2[] = anotherString.value;int i = offset;int j = anotherString.offset;while (n-- != 0) {if (v1[i++] != v2[j++])return false;}return true;}}return false;}

比较两个对象时,首先先去判断两个对象是否具有相同的地址,如果是同一个对象的引用,则直接放回true;如果地址不一样,则证明不是引用同一个对象,接下来就是挨个去比较两个字符串对象的内容是否一致,完全相等返回true,否则false。

hashCode()

    public int hashCode() {int h = hash;if (h == 0 && count > 0) {int off = offset;char val[] = value;int len = count;for (int i = 0; i < len; i++) {h = 31*h + val[off++];}hash = h;}return h;}

hashCode()官方定义:

hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。

hashCode 的常规协定是:

在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。

如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。

以下情况不是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

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

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

相关文章

python paramiko模块下载_Python自动化运维实战:使用Python管理网络设备

现在&#xff0c;我们已经知道如何在不同的操作系统中使用和安装Python以及如何使用EVE-NG搭建网络拓扑。在本章中&#xff0c;我们将学习如何使用目前常用的网络自动化库自动完成各种网络任务。Python可以在不同的网络层上与网络设备进行交互。首先&#xff0c;Python可以通过…

cxf添加拦截器_在CXF API和拦截器中添加Gzip压缩

cxf添加拦截器如今&#xff0c;由于我们在响应中发送大量数据&#xff0c;因此必须对API响应执行Gziping。 它节省了网络带宽和交付时间&#xff0c;当然还节省了Internet上的空间。 CXF提供了以多种方式使用Gzip压缩的选项。 蓝图 注解 蓝图&#xff1a; <bean id"…

3月14日dnf服务器维护,DNF体验服3月14日更新介绍 肝深渊送爆肝王称号!

DNF体验服在3月14日更新全新活动&#xff0c;本次活动奖励总体来看还是非常不错的。例如账绑称号、异界气息清除书、锻造炉等超值奖励&#xff0c;下面让我们来看具体的更新内容吧。PS&#xff1a;本次体验服更新内容将会在3月22日更新至正式服中去。艾肯副本相关1、艾肯副本模…

C语言程序判断计算机的CPU大小端

如何判断一台计算机的CPU是大端还是小字端对齐呢&#xff1f;那么首先得了解何为大端&#xff0c;何为小端&#xff0c;明确一下概念。所谓大端模式&#xff0c;是指字数据的高字节存储在低地址中&#xff0c;而字数据的低字节则存放在高地址中。小端格式&#xff1a;与大端存储…

三角形周长最短问题_一道三角形周长最小值问题

昨天早上&#xff0c;在朋友圈里看到有朋友发了一道求三角形周长最小值的问题&#xff0c;扫了一眼&#xff0c;觉得这条题目形容臃肿&#xff0c;颜值不高&#xff0c;估计没啥意思&#xff0c;便未作深究。晚上&#xff0c;又看到有人在朋友圈中发这条题目。同一条题目反复出…

java 性能调优_Java性能调优调查结果(第二部分)

java 性能调优这是系列文章的第二篇&#xff0c;我们将分析2014年10月进行的性能调整调查的结果。如果您尚未阅读第一部分&#xff0c;我们建议从此处开始 。 第二部分将重点监视Java应用程序的性能问题。 特别是&#xff0c;我们尝试回答以下问题&#xff1a; 人们如何发现性…

西门子伺服电机选型手册_记,新入行维修电工大胆拆解伺服电机和编码器的经历...

作为一名底层维修电工&#xff0c;最怕碰到维修外置编码器的伺服电机&#xff0c;我们单位用的是西门子S120的驱动方案&#xff0c;绝大多数使用的都是西门子配套电机&#xff0c;组态简单&#xff0c;也不用我们维修&#xff0c;有问题送到西门子授权维修点维修。只有个别的使…

变频器服务器电路板维修,变频器线路板常见维修方法

(1)驱动电路损坏的原因及检查造成驱动损坏的原因有各种各样的&#xff0c;一般来说出现的问题也无非是U&#xff0c;V&#xff0c;W三相无输出&#xff0c;或者输出不平衡&#xff0c;再或者输出平衡但是在低频的时候抖动&#xff0c;还有启动报警等等。当一台变频器大电容后的…

C语言 | 输出月份的英文

“要成为绝世高手&#xff0c;并非一朝一夕&#xff0c;除非是天生武学奇才&#xff0c;但是这种人…万中无一”——包租婆这道理放在C语言学习上也一并受用。在编程方面有着天赋异禀的人毕竟是少数&#xff0c;我们大多数人想要从C语言小白进阶到高手&#xff0c;需要经历的是…

rac san+oracle_Oracle11g1+RAC+install+for+CentOS5(ASM+to+FC+SAN)_IT168文库

Wp1998gmail.comV2011.3.3.1一&#xff0e;安裝環境1.1網絡示意1.2所需軟件linux.x64_11gR1_clusterware.ziplinux.x64_11gR1_database_1013.ziporacleasmlib-2.0.4-1.el5.x86_64.rpmoracleasm-support-2.1.4-1.el5.x86_64.rpmoracleasm-2.6.18-194.el5-2.0.5-1.el5.x86_64.rpm…

中兴5250交换机配置手册_TSN工业交换机中文说明

全面了解CC-Link协议家族宣布CLPA会员公司赫斯曼推出最新研发支持TSN的工业交换机RSPE35&#xff0c;同时这款TSN交换机与三菱CC-Link IE TSN产品连接配置手册也已发布&#xff0c;并在文中附了下载。文章传送门↓可是&#xff0c;交换机的资料都是日文和英语的&#xff0c;能否…

华为桌面云 服务器可以虚拟多少,【华为桌面云】案例:单服务器环境且只有两块本地SATA盘创建虚拟机非常慢...

【关键词】&#xff1a;单服务器&#xff0c;SATA盘&#xff0c;创建虚拟机慢&#xff0c;创建VM慢【适用版本】&#xff1a;FusionAccess V100R005 /FusionSphere V100R003【问题描述】&#xff1a;某局点工程师反馈&#xff0c;他使用单台RH2288V2服务器搭建测试环境&#xf…

C语言 | 为什么写这三行代码

C语言实现Hello xiaolin#include//头文件 int main()//主函数 程序的入口 { printf("Hello xiaolin!\n");// \n是换行的意思 return 0;}编译运行结果&#xff1a;Hello xiaolin!--------------------------------Process exited after 3.326 seconds with return v…

如何分析堆外内存使用情况_堆上与堆外的内存使用情况

如何分析堆外内存使用情况总览 最近有人问我在Java中使用堆内存的好处和智慧。 面临相同选择的其他人可能会对这些答案感兴趣。 堆外内存没什么特别的。 线程堆栈&#xff0c;应用程序代码&#xff0c;NIO缓冲区都在堆外。 实际上&#xff0c;在C和C 中&#xff0c;您只有非托…

centos 虚拟机glibc升级_分享Centos6.5升级glibc过程

上次看到有同学对Centos系统 glibc升级有点疑问, 不过相对来说glibc升级还是比较简单的, 网上也有很多介绍文章, 这里整理了个安装过程供大家参考下 阅读原文场景需求默认的Centos6.5 glibc版本最高为2.12, 而在进行Nodejs开发时项目所依赖的包往往需要更高版本的glibc库支持, …

windows redis批量删除前缀的key_阿里官方Redis开发规范!

本文主要介绍在使用阿里云Redis的开发规范&#xff0c;从下面几个方面进行说明。键值设计命令使用客户端使用相关工具通过本文的介绍可以减少使用Redis过程带来的问题。一、键值设计1、key名设计可读性和可管理性以业务名(或数据库名)为前缀(防止key冲突)&#xff0c;用冒号分隔…

matchers依赖_Hamcrest Matchers的高级创建

matchers依赖介绍 上一次 &#xff0c;我讨论了Hamcrest Matcher是什么&#xff0c;如何使用以及如何制作。 在本文中&#xff0c;我将解释创建Hamcrest Matchers的更多高级步骤。 首先&#xff0c;我将分享如何使您的匹配器更易于类型安全&#xff0c;然后介绍无状态匹配器的一…

深入浅出讲解C语言#define宏定义应用及使用方法

在C语言中&#xff0c;我们使用#define来定义宏。在C程序编译的预处理阶段&#xff0c;预处理器会把宏定义的符号替换成指定的文本。不带参数的宏关于宏最常见的就是用来定义数值常量的名称&#xff0c;即没有参数的宏定义&#xff0c;采用如下形式&#xff1a;1#define 宏名称…

安卓系统双屏异显_Android 双屏异显实现的三种方式

在各种产品脑洞大开的时代&#xff0c;需求也是日益新异&#xff0c;笔者最近开发了一套双屏异显app。现在做一些总结1.双屏异显第一种实现方式(官方提供的Presentation)Android 提供了一个叫 Presentation 类&#xff0c;来实现第二屏&#xff0c; 继承 Presentation 实现第二…

hazelcast入门教程_Hazelcast入门指南第5部分

hazelcast入门教程这是我撰写的有关Hazelcast的一系列文章的延续。 我强烈建议您阅读其他内容&#xff1a; 第1 部分 &#xff0c; 第2 部分 &#xff0c; 第3 部分和第4部分 。 一气呵成的东西 这篇文章中没有Hazelcast专用代码。 让我重复一遍。 这篇文章中没有Hazelcast专用…