您的位置:首页 > 编程语言 > Java开发

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));
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: