Java学习笔记_10
2017-05-04 11:04
246 查看
Set
常用方法:与collection的方法基本相同。
HashSet:
特点:元素唯一,但是无序
创建一个HashSet集合,添加String元素,测试唯一性,无序性
public static void main(String[] args) {
//创建一个HashSet集合
HashSet<String> set = new HashSet<String>();
//给集合中添加元素
set.add("hello");
set.add("world");
set.add("hello");
set.add("java");
//遍历集合
/**
* HashSet集合特点:
* 1.元素无序
* 2.元素唯一
*/
for (String string : set) {
System.out.println(string);
}
如何保证元素的唯一性的呢(分析源码)?
通过简单的分析,我们知道HashSet集合保证元素的唯一性和add()方法相关。
如何我们想深入的了解,就必须看add()方法的源码,看它的底层依赖什么内容?
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {...}
左边:e.hash == hash
比较对象的哈希值。
右边:((k = e.key) == key || key.equals(k))
左边:(k = e.key) == key
比较对象的地址值。
右边:key.equals(k)
比较的是对象的内容是否相同。默认情况下比较的是地址值
执行流程:
首先判断哈希值是否相同,如果不同,就直接添加到集合。
如果相同,继续执行equals(),看其返回值,
如果是false,就直接添加到集合。
如果是true,说明元素重复不添加。
TreeSet:
元素顺序:使用元素的自然顺序对元素进行排序,或者根据创建 set时提供的 Comparator进行排序(比较器排序),
具体取决于使用的构造方法。
底层算法:二叉树(画图进行讲解)
元素要求, 加入自定义JavaBean
事例:创建集合存储Integer类型元素,并输出
public static void main(String[] args) {
/**
* 1.创建集合存储Integer类型的元素(20,18,23,22,17,24,19,18,24),
* 分析如何保证元素唯一性,以及排序的规则。二叉树
*(首先讲解二叉树数据结构是怎么存入元素的,根据compareTo()方法的返回值来确定要存入元素的安放位置)
*
*/
//创建一个TreeSet集合
/**
* TreeSet集合特点:
* 1.元素唯一
* 2.元素有序
*/
TreeSet<Integer> ts = new TreeSet<Integer>();
//给集合中存储元素
//(20,18,23,22,17,24,19,18,24)
ts.add(20);
ts.add(18);
ts.add(23);
ts.add(22);
ts.add(17);
ts.add(24);
ts.add(19);
ts.add(18);
ts.add(24);
//遍历集合
for (Integer integer : ts) {
System.out.println(integer);
}
}输出17 18 19 20 22 23 24
分析图解:
创建学生类,按照学生年龄排序输出。
1、可以通实现Comparable接口的同时必须实现这个比较法
public int compareTo(Student s) {
//就是写的是元素的比较规则,由你自己去动手写出
int num = this.age - s.age;
//判断年龄是否相同,如果相同比较姓名
/**
* 写这个比较规则的时候注意两点:
* 1.他有主要条件,先按照主要条件进行排序
* 2.如果主要条件相同,就需要你自己分析出来他的次要条件,再去按照次要条件进行比较
*/
int num2 = num==0?this.name.compareTo(s.name):num;
return num2;
}
2、利用比较器comparator实现
public class ComparatorImpl implements Comparator<Student>{
@Override
public int compare(Student s1, Student s2) {
/**
* s1--this
* s2 -- s
* 按照年龄进行排序,年龄相同按照姓名排序
*
*/
int num = s1.getAge() - s2.getAge();
int num2 = num==0?s1.getName().compareTo(s2.getName()):num;
return num2;
}
}
通过比较器实现(匿名内部类)
public static void main(String[] args) {
//创建集合,参数是一个接口,实际需要的是接口的实现类对象
//TreeSet<Student> ts = new TreeSet<Student>(new ComparatorImpl());
//使用匿名内部类来进行改进
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
int num = s1.getAge() - s2.getAge();
int num2 = num==0?s1.getName().compareTo(s2.getName()):num;
return num2;
}
});
//创建对象存入集合
Student s = new Student("guodegang", 50);
Student s6 = new Student("liuyifei", 50);
Student s2 = new Student("zhangxueyou", 55);
Student s3 = new Student("amu", 45);
Student s4 = new Student("tf-boys", 18);
Student s5 = new Student("wangfeng", 49);
ts.add(s);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
ts.add(s6);
//遍历集合
for (Student student : ts) {
System.out.println(student);
}
}
HashSet与TreeSet的相同点与不同点
相同点:
单列集合,元素不可重复
不同点
1. 底层存储的数据结构不同
HashSet底层用的是HashMap哈希表结构存储,而TreeSet底层用的是TreeMap树结构存储
2.存储时保证数据唯一性依据不同
HashSet是通过复写hashCode()方法和equals()方法来保证的,而TreeSet通过Compareable接口的compareTo()方法来保证的
3.有序性不一样
HashSet无序,TreeSet有序
这种情况的数据,属于一一对应的映射关系。这种关系的集合在java叫Map。
Map:将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
Map接口中的方法概述(创建集合测试方法):
A:删除功能
void clear():移除集合中的所有键值对元素
V remove(Object key):根据键移除键值对元素,并返回值
B:判断功能
boolean containsKey(Object key):判断集合中是否包含指定的键
boolean containsValue(Object value):判断集合中是否包含指定的值
boolean isEmpty():判断集合是否为空
C:获取功能
Set<Map.Entry<K,V>> entrySet():获取键值对对象的集合,遍历键值对对象,
利用getKey(),getValue()取出键和值(理解即可)
V get(Object key):根据键获取值
Set<K> keySet():获取所有的键
Collection<V> values():获取所有的值
D:添加功能
V put(K key,V value):集合添加键值对
E:长度功能
int size():键值对对数。
HashMap
1元素顺序:元素顺序不可预测
2底层算法:哈希算法
3对键没有要求(仅仅相对于TreeMap来说)
事例:存入(String,Student)键:String(国籍) 值:Student
public static void main(String[] args) {
// 2.存入(String,Student)键:String(国籍) 值:Student
HashMap<String, Student> hm = new HashMap<String, Student>();
//创建学生对象
Student s1 = new Student("杰克逊", 60);
Student s2 = new Student("孙楠", 50);
Student s3 = new Student("权志龙", 30);
//将对象存入集合
hm.put("美国", s1);
hm.put("中国", s2);
hm.put("韩国", s3);
//同过键找值
Set<String> keys = hm.keySet();
for (String key : k
9915
eys) {
System.out.println(key+" "+hm.get(key));
}
}
常用方法:与collection的方法基本相同。
HashSet:
特点:元素唯一,但是无序
创建一个HashSet集合,添加String元素,测试唯一性,无序性
public static void main(String[] args) {
//创建一个HashSet集合
HashSet<String> set = new HashSet<String>();
//给集合中添加元素
set.add("hello");
set.add("world");
set.add("hello");
set.add("java");
//遍历集合
/**
* HashSet集合特点:
* 1.元素无序
* 2.元素唯一
*/
for (String string : set) {
System.out.println(string);
}
如何保证元素的唯一性的呢(分析源码)?
通过简单的分析,我们知道HashSet集合保证元素的唯一性和add()方法相关。
如何我们想深入的了解,就必须看add()方法的源码,看它的底层依赖什么内容?
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {...}
左边:e.hash == hash
比较对象的哈希值。
右边:((k = e.key) == key || key.equals(k))
左边:(k = e.key) == key
比较对象的地址值。
右边:key.equals(k)
比较的是对象的内容是否相同。默认情况下比较的是地址值
执行流程:
首先判断哈希值是否相同,如果不同,就直接添加到集合。
如果相同,继续执行equals(),看其返回值,
如果是false,就直接添加到集合。
如果是true,说明元素重复不添加。
TreeSet:
元素顺序:使用元素的自然顺序对元素进行排序,或者根据创建 set时提供的 Comparator进行排序(比较器排序),
具体取决于使用的构造方法。
底层算法:二叉树(画图进行讲解)
元素要求, 加入自定义JavaBean
事例:创建集合存储Integer类型元素,并输出
public static void main(String[] args) {
/**
* 1.创建集合存储Integer类型的元素(20,18,23,22,17,24,19,18,24),
* 分析如何保证元素唯一性,以及排序的规则。二叉树
*(首先讲解二叉树数据结构是怎么存入元素的,根据compareTo()方法的返回值来确定要存入元素的安放位置)
*
*/
//创建一个TreeSet集合
/**
* TreeSet集合特点:
* 1.元素唯一
* 2.元素有序
*/
TreeSet<Integer> ts = new TreeSet<Integer>();
//给集合中存储元素
//(20,18,23,22,17,24,19,18,24)
ts.add(20);
ts.add(18);
ts.add(23);
ts.add(22);
ts.add(17);
ts.add(24);
ts.add(19);
ts.add(18);
ts.add(24);
//遍历集合
for (Integer integer : ts) {
System.out.println(integer);
}
}输出17 18 19 20 22 23 24
分析图解:
创建学生类,按照学生年龄排序输出。
1、可以通实现Comparable接口的同时必须实现这个比较法
public int compareTo(Student s) {
//就是写的是元素的比较规则,由你自己去动手写出
int num = this.age - s.age;
//判断年龄是否相同,如果相同比较姓名
/**
* 写这个比较规则的时候注意两点:
* 1.他有主要条件,先按照主要条件进行排序
* 2.如果主要条件相同,就需要你自己分析出来他的次要条件,再去按照次要条件进行比较
*/
int num2 = num==0?this.name.compareTo(s.name):num;
return num2;
}
2、利用比较器comparator实现
public class ComparatorImpl implements Comparator<Student>{
@Override
public int compare(Student s1, Student s2) {
/**
* s1--this
* s2 -- s
* 按照年龄进行排序,年龄相同按照姓名排序
*
*/
int num = s1.getAge() - s2.getAge();
int num2 = num==0?s1.getName().compareTo(s2.getName()):num;
return num2;
}
}
通过比较器实现(匿名内部类)
public static void main(String[] args) {
//创建集合,参数是一个接口,实际需要的是接口的实现类对象
//TreeSet<Student> ts = new TreeSet<Student>(new ComparatorImpl());
//使用匿名内部类来进行改进
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
int num = s1.getAge() - s2.getAge();
int num2 = num==0?s1.getName().compareTo(s2.getName()):num;
return num2;
}
});
//创建对象存入集合
Student s = new Student("guodegang", 50);
Student s6 = new Student("liuyifei", 50);
Student s2 = new Student("zhangxueyou", 55);
Student s3 = new Student("amu", 45);
Student s4 = new Student("tf-boys", 18);
Student s5 = new Student("wangfeng", 49);
ts.add(s);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
ts.add(s6);
//遍历集合
for (Student student : ts) {
System.out.println(student);
}
}
HashSet与TreeSet的相同点与不同点
相同点:
单列集合,元素不可重复
不同点
1. 底层存储的数据结构不同
HashSet底层用的是HashMap哈希表结构存储,而TreeSet底层用的是TreeMap树结构存储
2.存储时保证数据唯一性依据不同
HashSet是通过复写hashCode()方法和equals()方法来保证的,而TreeSet通过Compareable接口的compareTo()方法来保证的
3.有序性不一样
HashSet无序,TreeSet有序
这种情况的数据,属于一一对应的映射关系。这种关系的集合在java叫Map。
Map:将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
Map接口中的方法概述(创建集合测试方法):
A:删除功能
void clear():移除集合中的所有键值对元素
V remove(Object key):根据键移除键值对元素,并返回值
B:判断功能
boolean containsKey(Object key):判断集合中是否包含指定的键
boolean containsValue(Object value):判断集合中是否包含指定的值
boolean isEmpty():判断集合是否为空
C:获取功能
Set<Map.Entry<K,V>> entrySet():获取键值对对象的集合,遍历键值对对象,
利用getKey(),getValue()取出键和值(理解即可)
V get(Object key):根据键获取值
Set<K> keySet():获取所有的键
Collection<V> values():获取所有的值
D:添加功能
V put(K key,V value):集合添加键值对
E:长度功能
int size():键值对对数。
HashMap
1元素顺序:元素顺序不可预测
2底层算法:哈希算法
3对键没有要求(仅仅相对于TreeMap来说)
事例:存入(String,Student)键:String(国籍) 值:Student
public static void main(String[] args) {
// 2.存入(String,Student)键:String(国籍) 值:Student
HashMap<String, Student> hm = new HashMap<String, Student>();
//创建学生对象
Student s1 = new Student("杰克逊", 60);
Student s2 = new Student("孙楠", 50);
Student s3 = new Student("权志龙", 30);
//将对象存入集合
hm.put("美国", s1);
hm.put("中国", s2);
hm.put("韩国", s3);
//同过键找值
Set<String> keys = hm.keySet();
for (String key : k
9915
eys) {
System.out.println(key+" "+hm.get(key));
}
}
相关文章推荐
- 孙鑫JAVA学习笔记9-10
- 学习笔记10—JAVA高级视频04_Applet
- java学习笔记10
- JAVA学习笔记(10)
- 黑马程序员_JAVA学习笔记10
- Effective Java 学习笔记 (10)
- java学习笔记10--枚举
- java学习笔记10——多态
- 【Java学习笔记】基础知识学习10【继承与多态】
- java个人学习笔记10(extends+super+override+final)
- Java学习笔记---10.面向对象编程05-面向对象程序的设计步骤
- java学习笔记10 - 以@AspectJ方式在Spring中实现AOP
- Java学习笔记10:求两个数的最小公倍数和最大公约数
- java 交通灯 黑马程序员学习笔记(10)
- Java学习笔记10
- Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口
- Java学习笔记 10——文件和流
- Java 学习笔记10:获取POST数据以及简单模板输出
- 黑马程序员_JAVA 学习笔记23 WEB篇10
- 黑马程序员—10—java基础:有关多线程安全的学习笔记和学习心得体会