去重 属性_面试中常问的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可以通过…

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;需要经历的是…

中兴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…

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

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

单片机C语言编程:.H文件与.C文件的关系!

一个.C文件对应一个.H文件是一种良好的编程习惯&#xff0c;那么.C和.H文件之间的关系是怎么样的呢&#xff1f;一、.H文件与.C文件的关系&#xff1a;迄今为止&#xff0c;写过的程序都是一些很简单的程序&#xff0c;从来没有想到要自己写.H文件&#xff0c;也不知道.H文件到…

python编程快速上手-----让繁琐工作自动化_Python编程快速上手让繁琐工作自动化--逗号代码和字符图网格...

逗号代码假定有下面这样的列表&#xff1a;spam [apples, bananas, tofu, cats]编写一个函数&#xff0c;它以一个列表值作为参数&#xff0c;返回一个字符串。该字符串包含所有表项&#xff0c;表项之间以逗号和空格分隔&#xff0c;并在最后一个表项之前插入and。例如将前面…

C语言中的“悬空指针”和“野指针”是什么意思?

提起C语言大部分开发者很自然就会想到指针二字&#xff0c;没错&#xff0c;作为C的核心和灵魂&#xff0c;它的地位咱们就不再赘述了&#xff0c;今天我们想跟大家讲的是指针中的两个特有名词&#xff1a;“悬空指针”和“野指针”。1 悬空指针C语言中的指针可以指向一块内存&…

java zip解压_Java语言入门第一课

Java最初的目标是嵌入式设备&#xff0c;不过在嵌入式设备方面并未取得成功。失之东隅&#xff0c;收之桑榆&#xff0c;Java却在Web领域被广泛接受。近年来&#xff0c;随着Java在服务器领域的不断突破&#xff0c;让这门语言越来越流行。有人喜欢Java的纯面向对象&#xff0c…

怎么用c语言做出等妖三角形_初二数学培优,怎么用顶点坐标求三角形面积?割补法这样用很简单...

点击右上角关注“陈老师初中数理化”分享学习经验&#xff0c;一起畅游快乐的学习生活。根据顶点坐标求解三角形的面积是初二数学的重要知识点&#xff0c;本文就例题详细解析这类题型的解题思路&#xff0c;希望能给初二学生的数学学习带来帮助。例题如图&#xff0c;在平面直…

restful xml_使用入站适配器公开HTTP Restful API。 第1部分(XML)

restful xml1.简介 这篇文章的目的是使用Spring Integration HTTP入站适配器实现HTTP Restful API。 本教程分为两个部分&#xff1a; XML配置示例&#xff08;同一篇文章&#xff09;。 Java DSL示例。 这将在本教程的下一部分中进行说明&#xff0c;展示如何使用Spring Int…

C语言的位域

位域是什么&#xff1f;有些数据在存储时并不需要占用一个完整的字节&#xff0c;只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态&#xff0c;用 0 和 1 表示足以&#xff0c;也就是用一个二进位。正是基于这种考虑&#xff0c;C语言又提供了一种叫做位域的…

xp精简工具_办公人士需要精简Win10吗?

首先要说自己的系统需求1&#xff0c;笔记本是主要生产力工具&#xff0c;靠它做方案&#xff0c;联系网络社交&#xff1b;2&#xff0c;会偶尔&#xff08;一月2-3次&#xff09;用到PS&#xff0c;AI&#xff0c;PR等软件&#xff1b;3&#xff0c;文件多&#xff0c;版本多…