黑马程序员-集合2-Set集合
来源:互联网 发布:织梦cms视频模板 编辑:程序博客网 时间:2024/05/01 09:28
集合2-Set集合
Set集合的功能和Collection是一致的。
|--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、
|--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。
注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。
|--TreeSet:可以对set集合中的元素进行排序。
底层数据结构是二叉树。
保证元素唯一性的依据:
compareTo方法相同return 0.
TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Comparable接口,覆盖compareTo方法。
也种方式也成为元素的自然顺序,或者叫做默认顺序。
TreeSet的第二种排序方式。
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。
在集合初始化时,就有了比较方式。
- import java.util.*;
- class HashSetDemo
- {
- public static void sop(Object obj)
- {
- System.out.println(obj);
- }
- public static void main(String[] args)
- {
- HashSet hs = new HashSet();//创建set集合
- sop(hs.add("java01"));//在集合中添加元素
- sop(hs.add("java01"));
- hs.add("java02");
- hs.add("java03");
- hs.add("java03");
- hs.add("java04");
- Iterator it = hs.iterator();//使用迭代器对集合元素进行获取
- while(it.hasNext())
- {
- sop(it.next());
- }
- }
- }
import java.util.*;class HashSetDemo {public static void sop(Object obj){System.out.println(obj);}public static void main(String[] args) {HashSet hs = new HashSet();//创建set集合sop(hs.add("java01"));//在集合中添加元素sop(hs.add("java01"));hs.add("java02");hs.add("java03");hs.add("java03");hs.add("java04");Iterator it = hs.iterator();//使用迭代器对集合元素进行获取while(it.hasNext()){sop(it.next());}}}
往hashSet集合中存入自定对象
姓名和年龄相同为同一个人,重复元素。
- import java.util.*;
- 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("a2",12));
- hs.add(new Person("a4",14));
- //sop("a1:"+hs.contains(new Person("a2",12)));
- hs.remove(new Person("a4",13));
- Iterator it = hs.iterator();//获取迭代器
- while(it.hasNext())
- {
- Person p = (Person)it.next();//因为要使用集合中元素的特有方法,要进行强转
- sop(p.getName()+"::"+p.getAge());//打印元素的属性
- }
- }
- }
- class Person//创建一个person类
- {
- private String name;//类中有若干成员属性
- private int age;
- Person(String name,int age)
- {
- this.name = name;
- this.age = age;
- }
- //因存入到hashset中,所以覆盖hashcode和equals方法
- public int hashCode()
- {
- System.out.println(this.name+"....hashCode");
- return name.hashCode()+age*37;//哈希值根据姓名和年龄计算
- }
- 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;
- }
- }
import java.util.*;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("a2",12));hs.add(new Person("a4",14));//sop("a1:"+hs.contains(new Person("a2",12)));hs.remove(new Person("a4",13));Iterator it = hs.iterator();//获取迭代器while(it.hasNext()){Person p = (Person)it.next();//因为要使用集合中元素的特有方法,要进行强转sop(p.getName()+"::"+p.getAge());//打印元素的属性}}}class Person//创建一个person类{private String name;//类中有若干成员属性private int age;Person(String name,int age){this.name = name;this.age = age;}//因存入到hashset中,所以覆盖hashcode和equals方法public int hashCode(){System.out.println(this.name+"....hashCode");return name.hashCode()+age*37;//哈希值根据姓名和年龄计算}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;}}
Treeset:
需求:
往TreeSet集合中存储自定义对象学生。
想按照学生的年龄进行排序。
记住,排序时,当主要条件相同时,一定判断一下次要条件。
当元素自身不具备比较性,或者具备的比较性不是所需要的。
这时需要让容器自身具备比较性。
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
当两种排序都存在时,以比较器为主。
定义一个类,实现Comparator接口,覆盖compare方法。
- class TreeSetDemo
- {
- public static void main(String[] args)
- {
- TreeSet ts = new TreeSet();//创建一个treeSet集合
- ts.add(new Student("lisi02",22));//在集合中添加若干元素
- ts.add(new Student("lisi007",20));
- ts.add(new Student("lisi09",19));
- ts.add(new Student("lisi08",19));
- //ts.add(new Student("lisi007",20));
- //ts.add(new Student("lisi01",40));
- Iterator it = ts.iterator();//获取迭代器
- while(it.hasNext())
- {
- Student stu = (Student)it.next();//强转
- System.out.println(stu.getName()+"..."+stu.getAge());//获取元素的成员属性
- }
- }
- }
- class Student implements Comparable//该接口强制让学生具备比较性。
- {
- private String name;
- private int age;
- Student(String name,int age)
- {
- this.name = name;
- this.age = age;
- }
- //覆盖compareTo方法,是该类具有一定的比较规则
- public int compareTo(Object obj)
- {
- if(!(obj instanceof Student))//判断比较的是否是同类对象
- throw new RuntimeException("不是学生对象");
- Student s = (Student)obj;
- System.out.println(this.name+"....compareto....."+s.name);
- if(this.age>s.age)//比较年龄
- return 1;
- if(this.age==s.age)
- {
- return this.name.compareTo(s.name);//如果年龄相同按照姓名排序
- }
- return -1;
- /**/
- }
- public String getName()
- {
- return name;
- }
- public int getAge()
- {
- return age;
- }
- }
class TreeSetDemo {public static void main(String[] args) {TreeSet ts = new TreeSet();//创建一个treeSet集合ts.add(new Student("lisi02",22));//在集合中添加若干元素ts.add(new Student("lisi007",20));ts.add(new Student("lisi09",19));ts.add(new Student("lisi08",19));//ts.add(new Student("lisi007",20));//ts.add(new Student("lisi01",40));Iterator it = ts.iterator();//获取迭代器while(it.hasNext()){Student stu = (Student)it.next();//强转System.out.println(stu.getName()+"..."+stu.getAge());//获取元素的成员属性}}}class Student implements Comparable//该接口强制让学生具备比较性。{private String name;private int age;Student(String name,int age){this.name = name;this.age = age;}//覆盖compareTo方法,是该类具有一定的比较规则public int compareTo(Object obj){if(!(obj instanceof Student))//判断比较的是否是同类对象throw new RuntimeException("不是学生对象");Student s = (Student)obj;System.out.println(this.name+"....compareto....."+s.name);if(this.age>s.age)//比较年龄return 1;if(this.age==s.age){return this.name.compareTo(s.name);//如果年龄相同按照姓名排序}return -1;/**/}public String getName(){return name;}public int getAge(){return age;}}
- 黑马程序员-集合2-Set集合
- 黑马程序员-------Set集合
- 黑马程序员-------Set集合
- 黑马程序员--Set集合
- 黑马程序员_集合2-set集合派系
- 黑马程序员:集合框架Set
- 黑马程序员--java集合Set
- 黑马程序员-集合(Set)
- 黑马程序员-----------------集合框架-Set
- 黑马程序员:集合框架Set
- 黑马程序员----List,Set集合
- 黑马程序员:集合框架Set
- 黑马程序员-----List,Set集合
- 黑马程序员------------List,Set集合
- 黑马程序员-----List,Set集合
- 黑马程序员-----List,Set集合
- 黑马程序员-----List,Set集合
- 黑马程序员----十七-Set集合
- Storm流式实时计算开源框架(一)
- JAVA开发(3)- 读取表单参数Get&Post
- 教你如何让你的设置QQ客服(一)
- JAVA开发(4) -JVM 内存溢出问题的解决
- JAVA开发(6) - log 4J 设置
- 黑马程序员-集合2-Set集合
- 黑马程序员-集合1-List集合
- 什么是java
- 黑马程序员-对象包装类
- 节表属性格式分析
- java方法转换大写日期及人民币大写转换方式 .txt
- 电商购物网站如何调用第三方支付平台(支付宝,财付通,盛付通等)
- FreeCMS有些功能出现乱码怎么办?
- 定位节表中RELOC所在符号表位置