Java 集合怎么去重
平时写代码处理数据的时候,你肯定遇见过这种麻烦:给一个购物清单列表,里面有重复的同款商品,想去掉重复项只保留一件;或者存用户提交的表单数据,不小心重复提交了好几遍,得把重复的记录删掉。这种“删掉重复内容”的操作,放在Java里就是咱们常说的“集合去重”。
很多刚学Java的朋友,一听到“集合去重”就头大,觉得要写很多复杂的判断逻辑,其实不然,用些简单的方法就能搞定,咱们今天就用生活化的例子讲明白,一点不晦涩。

方法一:用 HashSet,最简单的新手入门款
你可以把 HashSet 想象成一个只收“独一无二小物件”的收纳盒,只要是一样的东西,它只放一次。不管你往里面塞多少重复的,最后拿出来都是独一份的。
举个例子:咱们有个放零食名字的 List,里面装了“薯片、饼干、薯片、巧克力、饼干”,现在要去掉重复的。你只需要把这个 List 里的东西都倒进 HashSet 里,再把 HashSet 转回 List,就得到了“薯片、饼干、巧克力”,完美去重。
代码写起来也很简单,大概就是这几步:先建个有重复数据的 List,再 new 一个 HashSet,把 List 的内容加进去,最后转成新的 List。这个方法几乎不用思考,只要是基本类型或者字符串,用它就不会出错,是新手最常用的选择。
方法二:用 Stream 去重,代码更简洁
如果你写的是 Java 8 及以上的版本,还有个更“偷懒”的办法,就是用 Stream。你可以把 Stream 想象成一个自动过滤的传送带,上面的物品会自动把重复的丢掉。
还是用刚才的零食 List 举例,你不用新建别的集合,直接对原来的 List 用 stream() 方法,再加上 distinct() 这个去重的“过滤器”,最后 collect 成新的 List,一行核心代码就能搞定去重,甚至连循环都不用写。
这个方法的好处是代码短、读起来也明白,适合喜欢简洁的朋友。唯一要注意的是,distinct() 也是靠“独一无二”判断,和 HashSet 的逻辑差不多,只要你的对象能正确判断“是不是一样”,用它就没问题。
方法三:手动判断,适合特殊需求场景
要是你有特殊的要求,比如不能用 HashSet 或者 Stream,或者要按自己的规则去重(比如只要名字重复,不管价格,就去掉),那手动写循环判断就是最灵活的办法。
这个方法就像你整理抽屉,每拿一个新东西,就和已经整理好的部分比一比:如果没见过,就放到整理好的那堆里;如果见过,就直接丢。还是用刚才的零食 List,你可以新建一个空的 ArrayList,循环原来的 List,每取出一个零食,就检查新的 ArrayList 里有没有这个零食,没有就加进去,这样循环完,新的 ArrayList 里就全是不重复的内容了。
这个方法虽然要写几行代码,但胜在灵活,你可以随便改判断规则,比如要去重的是用户 ID,或者商品的编号,都能自己调整。
这些小坑要注意,别踩了
讲完方法,还要说几个容易踩的小坑,不然白忙活。比如如果要去重的是自定义的对象(比如你建了个“学生”类,有姓名和学号),不管用 HashSet 还是 Stream,都要保证这个类正确重写了 equals 和 hashCode 方法,不然它们会把两个内容一样的对象当成不一样的,去重就失效了。就像你把两个长得一样的苹果,因为是不同的盒子装的,收纳盒就把它们当成两个,不会只留一个。
还有,不管用哪种方法,原来的集合都不会被修改,都会生成新的无重复集合,这是 Java 集合的特性,不用额外担心数据被意外改动。
其实 Java 集合去重没有那么复杂,选适合自己的方法就行:新手选 HashSet,代码短选 Stream,要灵活就手动判断,搞定这些,处理重复数据的问题就轻松多了。