1.Set接口:Set集合继承自Collection集合
Set:底层数据结构是一个哈希表,能保证元素是唯一的,元素不重复!
通过它的子实现了HashSet集合去实例化,HashSet集合底层是HashMap集合的实例!
/**
*
*/
package org.zst.set;
import java.util.HashSet;import java.util.Set;
/**
* 需求:Set集合存储字符串元素并遍历
* @author:zsyht
* @date:2017-11-16下午1:24:08
*/
public class Demo {
public static void main(String[] args) {
//创建Set集合对象
Set<String> set = new HashSet<String>() ;
//添加元素
set.add("枯藤");
set.add("枯藤") ;
set.add("西风") ;
set.add("瘦马") ;
set.add("瘦马") ;
set.add("人家") ;
//增强for遍历
for(String s :set){
System.out.println(s);
}
}
}
Set集合的子实现类:此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。
看源码
HashSet集合的add()方法,底层是依赖于双列集合HashMap<K,V>的put(K key,V value)来实现的
put(K key,V value):底层又依赖于HashCode()和equals()方法,传递添加元素的时候,首先判断的是每一个元素对应的HashCode值是否一样,如果HashCode值一样,还比较他们的equals()方法,由于现在集合存储的是String类型,String类型本身重写了equals()方法,所以,默认比较的是内容是否相同,如果内容相同,这里最终返回的就是第一次存储的那个元素,由这两个方法保证元素唯一性!
package org.zst.set;
import java.util.HashSet;
/**
* @author:zsyht
* @date:2017-11-16下午1:30:51
*/
public class Demo2 {
//private int num ;
transient int num ;
public static void main(String[] args) {
//创建HashSet集合对象
HashSet<String> hs = new HashSet<String>();
//给该集合中添加元素
hs.add("hello") ;
hs.add("ssy") ;
hs.add("ssy") ;
hs.add("哈哈哈") ;
hs.add("哈哈哈") ;
//遍历
for(String s :hs){
System.out.println(s);
}
}
}
具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。
LinkedHashSet集合:
由哈希表保证元素的唯一性
由链接列表来保证元素的有序性
/**
*
*/
package org.zst.linkedList;
import java.util.LinkedHashSet;
/**
* @author:zsyht
* @date:2017-11-16下午2:32:46
*/
public class Demo {
public static void main(String[] args) {
//创建LinkedHashSet集合对象
LinkedHashSet<String> link = new LinkedHashSet<String>();
//给集合中添加元素
link.add("枯藤") ;
link.add("老树") ;
link.add("老树") ;
link.add("老树") ;
link.add("昏鸦") ;
link.add("古道") ;
link.add("古道") ;
//遍历集合
for(String s: link){
System.out.println(s);
}
}
}
TreeSet集合:
TreeSet集合底层是依赖于TreeMap的实例,而TreeMap<k,v>是依赖于红黑树结构实现的
两种:
自然排序
比较器排序
/**
*
*/
package org.zst.treeset;
import java.util.TreeSet;
/**
* @author:zsyht
* @date:2017-11-16下午3:17:54
*/
public class Demo {
public static void main(String[] args) {
// 创建TreeSet集合对象
TreeSet<Integer> ts = new TreeSet<Integer>();//
// 添加元素
ts.add(20);// Integer i = Integer.valueOf(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 i : ts) {
System.out.print(i + " ");// 17 18 19 20 22 23 24 :唯一并且排序:自然排序(升序排序)
}
}
}
TreeSet集合存储自定义对象并遍历实现了compareable接口,重写了comapreTo()方法,里面的逻辑是一个排序条件;
一个类中的元素想要自然排序,那么必须实现Compareable接口,实现compareTo(类名 对象名){}方法
按照学生姓名长度进行排序:
元素唯一性:取决返回值是否为0
要使用TreeSet集合的比较器排序:依赖于构造方法
两种方式实现比较器排序:
Comparator接口作为形式参数进行传递,需要该接口的子实现类对象
/**
*
*/
package org.zst.treeset2;
/**
* @author:zsyht
* @date:2017-11-16下午3:28:00
*/
public class Student {
private String name ;
private int age ;
public Student() {
super();
}
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 org.zst.treeset2;
import java.util.Comparator;
/**
* @author:zsyht
* @date:2017-11-16下午3:29:16
*/
public class mycomparator implements Comparator<Student> {
@Override
public int compare(Student s1, Student s2) {
// return 0;
// 按照学生姓名长度从小到大进行排序
//int num = this.name.lengt()-s.name.length();
//this--:s1
//s---:s2
int num = s1.getName().length() - s2.getName().length() ;
//次要条件:姓名长度一样,还要比较姓名的内容是否一样
int num2 = num==0 ? s1.getName().compareTo(s2.getName()): num ;
//姓名长度和内容都一样,还需比较两个人的年龄是否一样
int num3 = num2 ==0 ? s1.getAge() - s2.getAge() : num2 ;
return num3 ;
}
}
/**
*
*/
package org.zst.treeset2;
import java.util.Comparator;
import java.util.TreeSet;
/**
* @author:zsyht
* @date:2017-11-16下午3:39:26
*/
public class Demo {
public static void main(String[] args) {
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
// return 0;
int num = s1.getName().length() - s2.getName().length() ;
//次要条件:姓名长度一样,还要比较姓名的内容是否一样
int num2 = num==0 ? s1.getName().compareTo(s2.getName()): num ;
//姓名长度和内容都一样,还需比较两个人的年龄是否一样
int num3 = num2 ==0 ? s1.getAge() - s2.getAge() : num2 ;
return num3 ;
}
}) ;
//创建学生对象
Student s1 = new Student("gaoyuanyan", 27) ;
Student s2 = new Student("liushishi", 22);
Student s3 = new Student("fengqingy", 23) ;
Student s4 = new Student("wuqilong", 35) ;
Student s5 = new Student("gaoyuanyuan",27) ;
Student s6 = new Student("zhangguorong",29) ;
Student s7 = new Student("gaoyuanyuan",26) ;
//添加元素
ts.add(s1) ;
ts.add(s2) ;
ts.add(s3) ;
ts.add(s4) ;
ts.add(s5) ;
ts.add(s6) ;
ts.add(s7) ;
//增强for遍历
for(Student s : ts){
System.out.println(s.getName()+"----"+s.getAge());
}
}
}