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的主要内容,如果未能解决你的问题,请参考以下文章

廖雪峰Java5Java集合-1Java集合简介-1Java结合简介

java 遍历集合的时候对集合进行操作

java集合是啥?

Java 集合类

Java集合源码剖析Java集合框架

Java集合