(36)Java学习笔记——集合框架 / Set集合
2017-02-11 21:50
337 查看
Set集合
不包含重复元素,存储顺序和取出顺序不一致
HashSet()方法
不保证Set的迭代顺序,特别是不保证该顺序恒久不变。
为什么存储字符串的时候,字符串内容相同的只存储一个呢?
因为这个方法的底层依赖两个方法:hashCode() 和 equals()
步骤:
首先比较哈希值
如果相同,继续走,比较地址值或者走equals()
如果不同,直接添加到集合中。
解释:
先看hashCode()值是否相同
相同:
继续走equals()方法
返回true,说明元素重复,就不添加。
返回false,说明元素不重复。就添加。
不同:
直接吧元素添加到集合。
如果类没有重写这两个方法,默认使用Object()。一般来说不会相同。
而String类重写了hashCode()和equals()方法,所以,就可以吧内容相同的字符串去掉,只留下一个。
范例:
相同的元素,只保存一个:
范例:
范例03:存储自定义对象,并保证元素的唯一性。
要求:如果两个对象的成员变量值都相同,则为同一个元素。
错误的代码:
修改后的代码:
在Student类中重写了hashCode 和 equals方法
————————————————————————
LinkedHashSet<E> 集合
底层数据结构由哈希表和链表组成
哈希表保证元素的唯一性,链表保证元素有序。(存储和取出是一致的)
——————————————————————
TreeSet<E>集合
可以对元素进行自然排序 和 Comparator(比较器排序),具体取决于构造方法。
特点:
排序和唯一性
范例01:存储Integer类型保证唯一性并排序
图解:
范例02:储存自定义对象并遍历
自然排序:按照年龄从小到大排序
需要定义:
A / 定义怎么排序 :按照年龄
B / 元素唯一的条件 :元素内容不一样
如果一个类的元素要想能够自然排序,就必须实现自然排序接口
不包含重复元素,存储顺序和取出顺序不一致
HashSet()方法
不保证Set的迭代顺序,特别是不保证该顺序恒久不变。
为什么存储字符串的时候,字符串内容相同的只存储一个呢?
因为这个方法的底层依赖两个方法:hashCode() 和 equals()
步骤:
首先比较哈希值
如果相同,继续走,比较地址值或者走equals()
如果不同,直接添加到集合中。
解释:
先看hashCode()值是否相同
相同:
继续走equals()方法
返回true,说明元素重复,就不添加。
返回false,说明元素不重复。就添加。
不同:
直接吧元素添加到集合。
如果类没有重写这两个方法,默认使用Object()。一般来说不会相同。
而String类重写了hashCode()和equals()方法,所以,就可以吧内容相同的字符串去掉,只留下一个。
范例:
package cn.itcast_01; import java.util.HashSet; import java.util.Set; /* * Set * HashSet */ public class SetDemo { public static void main(String[] args) { //创建集合对象 Set<String> set = new HashSet<String>(); //创建并添加元素 set.add("hello"); set.add("world"); set.add("java"); set.add("world"); set.add("java"); //遍历 for(String s :set){ System.out.println(s); //返回结果:无序 且,唯一 } } }
相同的元素,只保存一个:
范例:
package cn.itcast_02; import java.util.HashSet; /* * HashSet : 存储字符串并遍历 */ public class HashSetDemo { public static void main(String[] args) { //创建集合对象 HashSet<String> hs = new HashSet<String>(); //创建并添加元素 hs.add("hello"); hs.add("world"); hs.add("java"); hs.add("world"); //遍历集合 for(String s : hs){ System.out.println(s); } } } /*返回结果: world java hello*/
范例03:存储自定义对象,并保证元素的唯一性。
要求:如果两个对象的成员变量值都相同,则为同一个元素。
错误的代码:
package cn.itcast_02; public class Student { private String name; private int age; public Student() { super(); // TODO Auto-generated constructor stub } public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }
package cn.itcast_02; import java.util.HashSet; /* * 需求:存储自定义对象,并保证元素的唯一性 * 要求:如果两个对象的成员变量值都相同,则为同一个元素 * */ public class HashSetDemo02 { public static void main(String[] args) { //创建集合对象 HashSet<Student> hs = new HashSet<Student>(); //创建学生对象 Student s1 = new Student("唐僧",20); Student s2 = new Student("孙悟空",800); Student s3 = new Student("猪八戒",200); Student s4 = new Student("沙僧",100); Student s5 = new Student("唐僧",27); Student s6 = new Student("白龙马",30); Student s7 = new Student("唐僧",20); //添加元素 hs.add(s1); hs.add(s2); hs.add(s3); hs.add(s4); hs.add(s5); hs.add(s6); hs.add(s7); //遍历元素 for(Student s : hs){ System.out.println(s.getName()+"---"+s.getAge()); } } } /*返回结果: 猪八戒---200 白龙马---30 唐僧---20 唐僧---27 唐僧---20 孙悟空---800 沙僧---100 //因为HashSet底层依赖的是hashCode() 和equals()方法,而这两个方法我们在学生类中没有重写, 默认使用的是Object类。这个时候,他们的哈希值是不会一样的,根本不会继续判断,就执行了添加操作,所以有相同成员变量的元素。*/
修改后的代码:
在Student类中重写了hashCode 和 equals方法
package cn.itcast_02; public class Student { private String name; private int age; public Student() { super(); // TODO Auto-generated constructor stub } public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }@Override //重写
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override //重写
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
package cn.itcast_02; import java.util.HashSet; /* * 需求:存储自定义对象,并保证元素的唯一性 * 要求:如果两个对象的成员变量值都相同,则为同一个元素 * */ public class HashSetDemo02 { public static void main(String[] args) { //创建集合对象 HashSet<Student> hs = new HashSet<Student>(); //创建学生对象 Student s1 = new Student("唐僧",20); Student s2 = new Student("孙悟空",800); Student s3 = new Student("猪八戒",200); Student s4 = new Student("沙僧",100); Student s5 = new Student("唐僧",27); Student s6 = new Student("白龙马",30); Student s7 = new Student("唐僧",20); //添加元素 hs.add(s1); hs.add(s2); hs.add(s3); hs.add(s4); hs.add(s5); hs.add(s6); hs.add(s7); //遍历元素 for(Student s : hs){ System.out.println(s.getName()+"---"+s.getAge()); } } } /*返回结果: 唐僧---20 孙悟空---800 猪八戒---200 沙僧---100 唐僧---27 白龙马---30 //因为HashSet底层依赖的是hashCode() 和equals()方法,而这两个方法我们在学生类中没有重写, 默认使用的是Object类。这个时候,他们的哈希值是不会一样的,根本不会继续判断,就执行了添加操作,所以有相同成员变量的元素。*/
————————————————————————
LinkedHashSet<E> 集合
底层数据结构由哈希表和链表组成
哈希表保证元素的唯一性,链表保证元素有序。(存储和取出是一致的)
package cn.itcast_03; import java.util.LinkedHashSet; /* * LinkedHashSet */ public class LinkedHashSetDemo { public static void main(Str 4000 ing[] args) { //创建集合对象 LinkedHashSet<String> hs =new LinkedHashSet<String>(); //创建并添加元素 hs.add("hello"); hs.add("world"); hs.add("java"); hs.add("world"); hs.add("java"); //遍历 for(String s : hs){ System.out.println(s); } } } /*返回值: hello world java*/
——————————————————————
TreeSet<E>集合
可以对元素进行自然排序 和 Comparator(比较器排序),具体取决于构造方法。
特点:
排序和唯一性
范例01:存储Integer类型保证唯一性并排序
图解:
package cn.itcast_04; import java.util.TreeSet; /* * TreeSet */ public class TreeSetDemo { public static void main(String[] args) { //创建集合对象 TreeSet<Integer> ts = new TreeSet<Integer>(); //创建元素并添加 //20,18,23,22,17,24,19,18,24 //利用Integer的自动装箱添加元素 ts.add(20); ts.add(18); ts.add(23); ts.add(22); ts.add(17); ts.add(24); ts.add(19); ts.add(19); ts.add(24); //遍历 for(Integer t : ts){ System.out.println(t); } } } /*返回结果: 17 18 19 20 22 23 24 */
范例02:储存自定义对象并遍历
自然排序:按照年龄从小到大排序
需要定义:
A / 定义怎么排序 :按照年龄
B / 元素唯一的条件 :元素内容不一样
如果一个类的元素要想能够自然排序,就必须实现自然排序接口
相关文章推荐
- 黑马程序员-java学习笔记-集合框架
- Java的集合框架学习笔记
- 黑马程序员—Java学习笔记之集合框架(三)以及1.5新特性
- 【转】Java集合框架学习笔记
- java学习笔记-集合框架-黑马
- 黑马程序员----Java集合框架学习笔记2 Map-工具类-泛型
- 黑马程序员----Java集合框架学习笔记1-List 与Set
- Java基础知识强化之集合框架笔记36:List练习之键盘录入多个数据在控制台输出最大值
- java学习笔记集合框架概述及List集合
- 06-java学习笔记-集合框架
- 【Java学习笔记】集合框架的学习
- java学习笔记:集合框架之TreeSet
- Java学习笔记之集合框架2
- java基础学习笔记——集合框架
- 【Java学习笔记】集合框架(一)
- 黑马程序员—Java学习笔记之集合框架(二)
- Java学习笔记之集合框架1
- 黑马程序员 java学习笔记——集合框架1
- java学习笔记:集合框架之TreeSet
- 黑马程序员_java基础学习笔记06_集合框架