ArrayList 与HashSet 去除重复函数的 区别 equals
- package day14;
- import java.util.ArrayList;
- import java.util.Iterator;
- /*
- 将自定义对象作为元素存到ArrayList集合中,并去除从父元素。
- 比如:存人对象。同姓名同年龄,视为同一个人,为重复元素。
- 思路:
- 1,对人的描述,将数据封装进人对象。
- 2,定义容器,将人存入。
- 3,取出
- 结论 List 集合判断元素是否相同 ,依据的是元素equals方法
- */
- //人的描述 类
- class Person{
- private String name;
- private int age ;
-
-
- //构造器
- Person(String name, int age){
- this.name = name;
- this.age = age;
- }
- public boolean equals(Object obj){
-
-
- if(!(obj instanceof Person))
- return false;
-
- Person p = (Person)obj;
- System.out.println(this.name+";;;;;;"+p.name);
-
- return this.name.equals(p.name)&&this.age==p.age;
- }
- //获取
- public String getName(){
- return name;
-
- }
-
- public int getAge(){
- return age;
-
- }
-
- }
- public class ArrayListTest2 {
- public static void sop(Object obj){
- System.out.println(obj);
- }
- public static void main(String[] args) {
- //定义一个 集合容器
- ArrayList al = new ArrayList();
-
- //外部 描述类 给容器添加 元素的格式〉〉〉〉〉〉〉〉找 构造器
- al.add(new Person("lisi01", 30));
- al.add(new Person("lisi02", 32));
- al.add(new Person("lisi02", 32));
- al.add(new Person("lisi03", 33));
- al.add(new Person("lisi04", 32));
- al.add(new Person("lisi04", 32));
- al.add(new Person("lisi05", 35));
-
- al = singleElment( al);
- //遍历取出
- Iterator it = al.iterator();
- while(it.hasNext()){
- //因为a1.add(Object obj);
- //Object obj = new Person("lisi01",30); 返回值提升了 为Object
- Person p=(Person)it.next();//〉〉〉〉〉〉所以要强转
- sop(p.getName()+",,,,,"+p.getAge());
- }
-
-
- }
- //唯一元素的 方法
- public static ArrayList singleElment(ArrayList a1){
- //定义一个临时容器
- ArrayList newA1 = new ArrayList();
- //遍历老集合
- Iterator it =a1.iterator();
-
- while (it.hasNext()){
- Object obj = it.next();//为什么要obj一下呢???? 拿下一个元素用obj记下来
- //判断一下 如果不包含下面的一个元素 就往容器集合里面添加元素
- if(!newA1.contains(obj))//——————————————————————List---中用contains内部调用equals
- newA1.add(obj);
-
- }
- return newA1;
- }
-
- }
复制代码
- package day14;
- import java.util.HashSet;
- import java.util.Iterator;
- /*王hashset集合中存入自定义对象
- 姓名和年龄视为同一个人,重复元素*/
- /*HashSet 和Arraylisht 中 equals的区别 〉〉〉〉〉〉〉〉〉〉〉〉〉???????
- 首先Set存储时无序不可重复的,List是有序可重复的
- List---中用contains内部调用equals
- Set----中使用的equals方法是其存入的类(Person或其他)的重写的equals,hashCode方法*/
- public class HashSetTest {
- public static void sop(Object obj){
- System.out.println(obj);
- }
- public static void main(String[] args) {
- HashSet hs = new HashSet();
-
- hs.add(new Person("a1",11));
- hs.add(new Person("a2",12));
- hs.add(new Person("a3",13));
- hs.add(new Person("a4",14));
- hs.add(new Person("a1",11));
- hs.add(new Person("a2",13));
-
- Iterator it =hs.iterator();
-
- while(it.hasNext()){
- Person p=(Person)it.next();//〉〉〉〉〉〉所以要强转>>>>看ArrayListTest2
- sop(p.getName()+",,,,,"+p.getAge());
- }
- }
- }
- class Person{
- private String name;
- private int age ;
-
-
- //构造器
- Person(String name, int age){
- this.name = name;
- this.age = age;
- }
-
- public int hashCode(){
- //验证
- System.out.println(this.name+".....hashCode");
-
- //return 60;
- //为提高效率 返回name.hashCode()+age;
- //return name.hashCode()+age; 20+30=30+20 总hash值有可能相同 为了尽量保持返回的哈希值 唯一性 随便乘以一个数
- return name.hashCode()+age*39;
- }
- //hashset 判断
- public boolean equals(Object obj){
-
-
- if(!(obj instanceof Person))
- return false;
-
- Person p = (Person)obj;
- System.out.println(this.name+";;;equals;;;"+p.name);
-
- return this.name.equals(p.name)&&this.age==p.age;
- }
- //获取
- public String getName(){
- return name;
-
- }
-
- public int getAge(){
- return age;
-
- }
-
- }
复制代码 |