无图言屌!先上图

说到List去重,很多人都知道用contains()方法,其实contains()方法依据的equals()方法,比较两个对象的引用是否相同,如果要List比较两个自定义定义对象是否相同要重写equals方法。贴出代码吧!
`import java.util.*;
class Student
{
private String name;
private int age;

Student(){}
Student(String name,int age)
{this.name = name;this.age = age;
}public boolean equals(Object obj)
{if(!(obj instanceof Student))throw new RuntimeException("类型不对");Student stu = (Student)obj;System.out.println(this.name+"比较..."+stu.name);return this.name.equals(stu.name) && this.age==stu.age;
}public String getName()
{return this.name;
}
public int getAge()
{return this.age;
}
public String toString()
{return name+","+age;
}

}
class Demo1
{
public static void main(String[] args)
{
ArrayList list = new ArrayList();

    list.add(new Student("zhangsan",23));list.add(new Student("lisi",21));list.add(new Student("wangwu",26));list.add(new Student("lisi",21));//姓名年龄相同的认为是同一个对象,从集合中去除掉ArrayList list2 = quChu(list);list2.remove(new Student("lisi",21));//删除也是依据boolean equals(Object obj)Iterator ite = list2.iterator();while(ite.hasNext()){sop(ite.next());}
}
public static ArrayList  quChu(ArrayList list)
{ArrayList list2 = new ArrayList();for(int i=0;i<list.size();i++){Object obj = list.get(i);if(!list2.contains(obj))//contains方法是依据 boolean equals(Object obj){list2.add(obj);}}return list2;
}public static void sop(Object obj)
{System.out.println(obj);
}

}`

二.HashSet去除重复元素

HashSet底层使用的数据结构是哈希表,HashSet是无序的,它的实现原理是先判断对象的哈希值,如果相同再比较值是否相同,如果不同则直接添加。
保证对象的唯一原理:int hashCode() boolean equals(Object obj),在添加对象将该对象的哈希值和集合中已有对象的哈希值进行比较,如果哈希值都不相同,那么直接把该对象加入集合,如果出现哈希值相同的,那么再调用equals方法,只有equals方法返回true才认为是相同的对象,不加入集合。
所以我们要重写hashCode()方法,保证具有相同值的不同对象有相同的哈希值,这样才会通过equals()方法判断值是否相同,判断两个元素是否相同。代码如下:

`import java.util.*;
class Student
{private String name;private int age;Student(){}Student(String name,int age){this.name = name;this.age = age;}//重写hashCode()方法,保证保证具有相同值的不同对象有相同的哈希值public int hashCode(){return name.hashCode()+age*36;}//重写equals()方法,判断两个对象的值是否相同public boolean equals(Object obj){if(!(obj instanceof Student))throw new RuntimeException("类型不对");Student stu = (Student)obj;return this.name.equals(stu.name)&&this.age==stu.age;}public String getName(){return this.name;}public int getAge(){return this.age;}public String toString(){return name+","+age;}
}`
`class Demo3
{public static void main(String[] args) {HashSet hs = new HashSet();//姓名年龄相同的认为是同一个对象,不能加入集合hs.add(new Student("zhangsan",23));hs.add(new Student("lisi",21));hs.add(new Student("wangwu",26));hs.add(new Student("zhangsan",23));sop(hs.contains(new Student("lisi",21)));//也是依据int hashCode()   boolean equals(Object obj)hs.remove(new Student("lisi",21));//也是依据int hashCode()   boolean equals(Object obj)sop(hs);}public static void sop(Object obj){System.out.println(obj);}
}`

三.TreeSet的两种排序方式

TreeSet具有自动排序功能,按照自然顺序排序。

`class Demo4
{public static void main(String[] args) {TreeSet ts = new TreeSet();//在添加时就已经进行排序了//因为String实现了Comparable接口中的 int compareTo(Object obj)方法//集合是依据字符串中的这个方法int compareTo(Object obj)来排序的ts.add("zwoeiuroie");ts.add("abcedf");// "abcedf".compareTo("zwoeiuroie")ts.add("wowieur");//"wowieur".compareTo("zwoeiuroie")  "wowieur".compareTo("abcedf")sop(ts);}public static void sop(Object obj){System.out.println(obj);}
}`

当我们需要对自定义对象进行排序时,就需要自定义一种排序方式了,通常有两种方式。
第一种方式:实现comparable接口,重写compareTo()方法

class Student implements Comparable
{private String name;private int age;Student(){}Student(String name,int age){this.name = name;this.age = age;}public int compareTo(Object obj){if(!(obj instanceof Student))throw new ClassCastException();Student stu = (Student)obj;int num = this.age-stu.age;//根据年龄从小到大排序return num==0?this.name.compareTo(stu.name):num;}public String getName(){return this.name;}public int getAge(){return this.age;}public String toString(){return name+","+age;}
}

如果comparable的排序方式不是我们需要的,自定义比较方式。因为我们不能轻易改动源代码,需要重写一种排序方式。
第二种方式:定义一个类实现comparator接口,并重写compare()方法,并将该类的对象作为TreeSet构造函数的参数传入。

class ComByName implements Comparator
{public int compare(Object obj1,Object obj2){if(!(obj1 instanceof Student))throw new ClassCastException("类型转换异常");if(!(obj2 instanceof Student))throw new ClassCastException("类型转换异常");Student stu1 = (Student)obj1;Student stu2 = (Student)obj2;int num = stu1.getName().compareTo(stu2.getName());return num==0?stu1.getAge()-stu2.getAge():num;}
}
class Demo5
{public static void main(String[] args) {   ComByName cbn = new ComByName();//创建自定义的排序方式对象TreeSet ts = new TreeSet(cbn);//再创建集合对象时就得确定排序方式//自定义的排序方式优先被使用ts.add(new Student("zhangsan",23));ts.add(new Student("lisi",21));//new Student("lisi",21).compareTo(new Student("zhangsan",23))ts.add(new Student("wangwu",26));ts.add(new Student("pengfei",20));ts.add(new Student("zhaosi",23));sop(ts);}public static void sop(Object obj){System.out.println(obj);}
}

当两种方式都存在时,优先使用comparator方式。

总结:人生中的第一次,写的有点挫,哈哈……,共同努力!

JAVA集合框架之List HashSet去重及TreeSet排序详解相关推荐

  1. Java集合框架综述,这篇让你吃透!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:平凡希 cnblogs.com/xiaoxi/p/60899 ...

  2. java集合框架综述

    一.集合框架图 简化图: 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下.Java的集合类主要由两个接口派生而出:Collection和Map,Collection和 ...

  3. 厉害!Java集合框架综述,这篇让你吃透!

    作者:平凡希 来源:cnblogs.com/xiaoxi/p/6089984.html 一.集合框架图 简化图: 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下.Ja ...

  4. Java 集合框架综述

    一.集合框架图 简化图: 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下.Java的集合类主要由两个接口派生而出:Collection和Map,Collection和 ...

  5. Java集合框架之Collection实例解析

    转载自https://blog.csdn.net/qq_28261343/article/details/52614411 0.集合引入 1)集合的由来? Java是面向对象编程语言,经常操作很多对象 ...

  6. java框架_这篇让你吃透Java集合框架!

    作者:平凡希 cnblogs.com/xiaoxi/p/6089984.html 一.集合框架图 简化图: 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下.Java的 ...

  7. Java集合框架详解

    一.集合框架图 简化图: 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下.Java的集合类主要由两个接口派生而出:Collection和Map,Collection和 ...

  8. Java集合框架笔记记录 --- 原创@余胜军 但有个人心得

    Java集合框架课程安排 1.集合框架API知识 List/Set/Map集合 2.常见数据结构 数组/链表/队列/树 3.集合源码解读 List/Set/Map1.为什么需要学习Java中集合框架呢 ...

  9. Java集合框架的知识总结(1)

    Java集合框架的知识总结(1) 所有集合类都位于java.util包下.集合中只能保存对象(保存对象的引用变量). Java的集合类主要由两个接口派生而出:Collection和Map,Collec ...

最新文章

  1. C# 数据库连接笔记
  2. atitit.词法分析的实现token attilax总结
  3. 动画道路上的新宠 -- Lottie
  4. 新手实用的电脑维护小常识
  5. 别“躺”着了,赶紧把「复盘」做起来
  6. 计算机辅助管理与制造,计算机辅助设计与制造,对产品的设备进行管理,完成产品加工制造...
  7. 自定义http报头_浅谈http协议(三):HTTP 报文及其结构
  8. ORACLE表、表分区、表空间的区别
  9. 爬取微博评论并存入MySQL,并对评论进行情感分析以及词云的绘制
  10. hdu 4747 Pet
  11. css transition opacity,CSS transition属性
  12. Problem Z: 亲戚
  13. python学多久可以考二级建造师吗_没有基础。学多久能过二级建造师
  14. 数据库mysql性能优化-学习笔记
  15. MySQL结课体会,听课心得体会小结
  16. Linux - cannot update mailbox /var/mail/root for user root. error writing messa ge: File too large
  17. 在局域网内如何访问另一台计算机
  18. 迅为i.MX6ULL终结者进程基础-进程创建
  19. 一些简单的shell实例
  20. 饥荒机器人雷击_饥荒17版本最强人物 机器人解读

热门文章

  1. softlayer iso_使用IBM SoftLayer标记简化操作
  2. bzoj 2648 SJY摆棋子 cdq分治+树状数组
  3. Vue-change和input事件
  4. 【红队】ATTCK - 浏览器扩展实现持久化
  5. 民政部:发展智慧服务生活圈,同时保留必要线下服务
  6. Glade+GTK+ 实现通讯录信息管理系统图形界面软件开发
  7. 前端-element-ui
  8. python爬取游戏数据,Python 爬虫之好游快爆游戏排行信息爬取
  9. LeetCode(力扣)初级算法 字符串篇
  10. Hipo-iPod 处理对象