JavaSE基础 集合2

来源:互联网 发布:淘宝自主品牌女装 编辑:程序博客网 时间:2024/06/05 05:33

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> {@Overridepublic int compare(Student s1, Student s2) {//return 0;//按照学生姓名长度从小到大进行排序//int num = this.name.lengt()-s.name.length();//this--:s1//s---:s2int 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>() {@Overridepublic 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());}  }}