Java集合Set
Posted 菜菜小谭
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java集合Set相关的知识,希望对你有一定的参考价值。
***************************Set*********************************************
类似数学中的集合
迭代顺序相关 排序相关的
Set(接口)
HashSet(实现类) 1.去重 2.没有迭代顺序 SortedSet(接口)
LinkedHashSet(实现类) 有迭代顺序的HashSet NavigableSet(接口)
TreeSet(实现类)
集合的两个设计原则
1. Ordered 迭代顺序(输出顺序、遍历顺序)
2. Sorted 排序顺序
*************************************HashSet***************************************
唯一性、无序性、确定性
唯一性: 不能重复
特点:
1. 去重
2. 没有迭代顺序
不是说顺序是随机的,每次运行顺序都是固定的..没有迭代顺序的意思是它的输出顺序和添加顺序不一致的
顺序: 是和对象的hashCode相关的一个算法,求出这个int类型的数值 作为数组的一个下标 存到数组中的
实质都是数组
****************************LinkedHashSet*************************
有迭代顺序的HashSet
它的输出顺序和添加顺序是一致的
先打进来的客户 先给它打出去 要使用LinkedHashSet
**************************HashSet是如何去重的?(面试题)*****************************
使用hashCode()和equals()去重
如果两个对象 hashCode() 相等 、equals()比较结果是true 两个对象意义上是同一个对象 第二个会被去掉
hashCode()和equals()只要有一个不相等 就不是同一个对象 第二个会被添加进去
****************************请说出往HashSet中添加元素时的具体执行过程******************
set.add(dvd1);//添加第一个元素 首先调用第一个对象的hashCode()算法 得到一个hashCode
并且把这个hashCode 的值 放到一个数组中
int[] hashCodeArr = {10,10,10}
如果有重复的hashCode继续比较equals,拿着当前添加的对象和集合中的所有元素挨个比较equals.
如果没有重复的hashCode,就不会调用equals.
set.add(dvd1);
set.add(dvd2);
set.add(dvd3);
set.add(dvd4);
控制台显示效果如下:
hashCode
hashCode
equals
hashCode
equals
equals
hashCode
equals
equals
equals
*********************************TreeSet**************************************
排序相关的Set,直接把想要排序的元素添加到TreeSet中 就自动帮你排序好了 底层用的是 红黑树
*********************************自然排序**************************************
package com.chapter12.set;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;
import java.util.TreeSet;
/**
* 公司:蓝桥软件学院 作者:zhangzy 时间:2017年7月18日 上午10:46:03 功能:演示自然排序
*/
public class 演示自然排序 {
public static void main(String[] args) {
// 1.对数字排序
/*
* Set<Integer> set = new TreeSet<Integer>();
*
* set.add(3);
*
* set.add(1);
*
* set.add(5);
*
* for(int i:set){ System.out.println(i); }
*/
// 2.对字符串排序
// 排序字符串 按照ascii码排序
//先取第一个字符 先按第一个字符的ascii码排序
//如果第一个字符相同 依次取第2个
/*Set<String> set = new TreeSet<String>();
set.add("bba");
set.add("baa");
set.add("aaa");
for (String s : set) {
System.out.println(s);
}*/
//3. 对日期和时间进行排序 时间早的 小 在左边
String s1 = new String("2017-07-19 00:00:00");
String s2 = new String("2017-07-18 00:00:00");
String s3 = new String("2017-07-21 00:00:00");
String s4 = new String("2017-07-20 00:00:00");
Set<Date> set = new TreeSet<Date>();
//字符串--------->Date对象
//yyyy year 年
//MM month 月
//dd day 日期
//hh hour
//mm minute
//ss second
/*SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
try {
Date date1 = sdf.parse(s1);
Date date2 = sdf.parse(s2);
Date date3 = sdf.parse(s3);
Date date4 = sdf.parse(s4);
set.add(date1);
set.add(date2);
set.add(date3);
set.add(date4);
for(Date date:set){
System.out.println(date);
}
} catch (ParseException e) {
e.printStackTrace();
}*/
//Date------------>String对象
//需求: 创建当前时间
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String currentTime = sdf.format(date);
System.out.println(currentTime);
}
}
*****************************使用TreeSet实现DVD排序****************************
先按DVD的名称排序、名称相同的按价格排序
演示代码:
package com.chapter12;
public class DVD implements Comparable{
private int no;
private String name;
private int price;
@Override
public int compareTo(Object obj){
//1.先按DVD的名称排序
DVD otherDVD = (DVD)obj;
int nameResult = this.name.compareTo(otherDVD.getName());
if(nameResult==0){//名称相同
//2.按照价格排序
int priceResult = new Integer(this.price).compareTo(otherDVD.getPrice());
return priceResult;
}else{
return -nameResult;
}
}
public static void main(String[] args) {
DVD dvd1 = new DVD(1,"神偷奶爸3",50);
DVD dvd2 = new DVD(2,"神偷奶爸3",50);
System.out.println(dvd1==dvd2);//false
System.out.println(dvd1.equals(dvd2));//true
System.out.println(dvd1.hashCode());
System.out.println(dvd2.hashCode());
}
}
测试代码:
package com.chapter12.set;
import java.util.Set;
import java.util.TreeSet;
import com.chapter12.DVD;
/**
* 公司:蓝桥软件学院
* 作者:zhangzy
* 时间:2017年7月18日 下午2:09:08
* 功能: 往TreeSet中添加的对象 有要求 对象所属的类 一定要实现Comparable接口才能够添加到TreeSet中进行排序
* DVD类如果没有实现Comparable接口 编译是可以通过的 运行时报错 com.chapter12.DVD cannot be cast to java.lang.Comparable
*/
public class 演示DVD排序 {
public static void main(String[] args) {
DVD dvd1 = new DVD(1,"bbb",50);
DVD dvd2 = new DVD(2,"aaa",50);
DVD dvd3 = new DVD(3,"aaa",40);
DVD dvd4 = new DVD(4,"aaa",60);
DVD dvd5 = new DVD(5,"ccc",60);
Set<DVD> set = new TreeSet<DVD>();
set.add(dvd1);
set.add(dvd2);
set.add(dvd3);
set.add(dvd4);
set.add(dvd5);
for(DVD dvd:set){
System.out.println(dvd);
}
}
}
*****************************TreeSet是使用compareTo()方法去重****************************
1.两个对象compareTo()比较结果如果是0,认为两个对象意义上是同一个对象,第二个会被去掉
2.两个的对象equals()比较结果是true,两个对象compareTo()比较结果一定要是0
因为两个对象equals()比较结果是true,说明它俩意义上是同一个对象,这样第二个应该被去掉,为了保证第二个对象
被去掉,所以它们的compareTo()比较结果一定要是0
3.重写 equals()使用的条件,compareTo()也要用
这样compareTo()的比较条件 被equals()卡死了,equals()用什么条件,compareTo()也要用什么条件
******************************第二个比较接口-------Comparator*****************************
需求: 想按DVD的编号排序
第一步: 先写一个排序规则类 实现Comparator接口
//第一步: 定义一个排序规则类
public class SortedDVDByNo implements Comparator<DVD>{
@Override
public int compare(DVD dvd1, DVD dvd2) {
Integer thisNO = dvd1.getNo();
Integer anotherNo = dvd2.getNo();
int noResult = thisNO.compareTo(anotherNo);
return noResult;
}
}
第二步:
package com.chapter12.set;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.chapter12.DVD;
/**
* 公司:蓝桥软件学院
* 作者:zhangzy
* 时间:2017年7月18日 下午2:54:20
* 功能:使用排序工具类进行排序
*/
public class TestCollections {
public static void main(String[] args) {
List<DVD> list = new ArrayList<DVD>();
DVD dvd1 = new DVD(3,"bbb",50);
DVD dvd2 = new DVD(1,"aaa",50);
DVD dvd3 = new DVD(2,"aaa",40);
list.add(dvd1);
list.add(dvd2);
list.add(dvd3);
//Collections.sort(list, new SortedDVDByNo());
Collections.sort(list);
for(DVD dvd:list){
System.out.println(dvd);
}
}
}
*****************************************两个排序工具类************************************
Object
--Collections(排序集合的 只能用来排序List)
--Arrays(排序数组的)
演示代码:
package com.chapter12.set;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import com.chapter12.DVD;
/**
* 公司:蓝桥软件学院
* 作者:zhangzy
* 时间:2017年7月18日 下午2:54:20
* 功能:使用排序工具类进行排序
*/
public class TestArrays {
public static void main(String[] args) {
DVD[] dvdArr = new DVD[3];
DVD dvd1 = new DVD(3,"bbb",50);
DVD dvd2 = new DVD(1,"aaa",50);
DVD dvd3 = new DVD(2,"aaa",40);
dvdArr[0] = dvd1;
dvdArr[1] = dvd2;
dvdArr[2] = dvd3;
Arrays.sort(dvdArr,new SortedDVDByNo());
for(DVD dvd:dvdArr){
System.out.println(dvd);
}
}
}
以上是关于Java集合Set的主要内容,如果未能解决你的问题,请参考以下文章