Java类集--Set接口、HashSet、TreeSet、SortedSet接口

Set接口的定义

Collection就不能进行双向输出,因为没有提供get()方法,但是Set接口与Collection接口的定义一致,所以其本身也不能双向输出。

HashSet:使用散列的方式存放内容,本身没有顺序。

import java.util.HashSet ;
import java.util.Set ;
public class HashSetDemo01{
	public static void main(String args[]){
		Set<String> allSet = new HashSet<String>() ;
		allSet.add("A") ;	// 增加内容
		allSet.add("B") ;	// 增加内容
		allSet.add("C") ;	// 增加内容
		allSet.add("C") ;	// 重复内容
		allSet.add("C") ;	// 重复内容
		allSet.add("D") ;	// 增加内容
		allSet.add("E") ;	// 增加内容
		System.out.println(allSet) ;
	}
};

执行结果中可以看出插入的顺序是无序排列的,而List接口的内同插入的顺序是其保存的顺序。

如果现在希望所有的内容可以自动进行排序的操作,则可以使用Set中的第二个子类————TreeSet.

import java.util.TreeSet ;
import java.util.Set ;
public class TreeSetDemo01{
	public static void main(String args[]){
		Set<String> allSet = new TreeSet<String>() ;
		allSet.add("C") ;	// 增加内容
		allSet.add("C") ;	// 重复内容
		allSet.add("C") ;	// 重复内容
		allSet.add("D") ;	// 增加内容
		allSet.add("B") ;	// 增加内容
		allSet.add("A") ;	// 增加内容
		allSet.add("E") ;	// 增加内容
		System.out.println(allSet) ;
	}
};

TreeSet类的内容是可以排序的,那么任意给出一个类,观察能否进行排序。

import java.util.Set ;
import java.util.TreeSet ;
class Person{
	private String name ;
	private int age ;
	public Person(String name,int age){
		this.name = name ;
		this.age = age ;
	}
	public String toString(){
		return "姓名:" + this.name + ";年龄:" + this.age ;
	}
};
public class TreeSetDemo02{
	public static void main(String args[]){
		Set<Person> allSet = new TreeSet<Person>() ;
		allSet.add(new Person("张三",30)) ;
		allSet.add(new Person("李四",31)) ;
		allSet.add(new Person("王五",32)) ;
		allSet.add(new Person("王五",32)) ;
		allSet.add(new Person("王五",32)) ;
		allSet.add(new Person("赵六",33)) ;
		allSet.add(new Person("孙七",33)) ;
		System.out.println(allSet) ;
	}
};

import java.util.Set ;
import java.util.TreeSet ;
class Person implements Comparable<Person>{
	private String name ;
	private int age ;
	public Person(String name,int age){
		this.name = name ;
		this.age = age ;
	}
	public String toString(){
		return "姓名:" + this.name + ";年龄:" + this.age ;
	}
	public int compareTo(Person per){
		if(this.age>per.age){
			return 1 ;
		}else if(this.age<per.age){
			return -1 ;
		}else{
			return 0 ;
		}
	}
};
public class TreeSetDemo03{
	public static void main(String args[]){
		Set<Person> allSet = new TreeSet<Person>() ;
		allSet.add(new Person("张三",30)) ;
		allSet.add(new Person("李四",31)) ;
		allSet.add(new Person("王五",32)) ;
		allSet.add(new Person("王五",32)) ;
		allSet.add(new Person("王五",32)) ;
		allSet.add(new Person("赵六",33)) ;
		allSet.add(new Person("孙七",33)) ;
		System.out.println(allSet) ;
	}
};

import java.util.Set ;
import java.util.TreeSet ;
class Person implements Comparable<Person>{
	private String name ;
	private int age ;
	public Person(String name,int age){
		this.name = name ;
		this.age = age ;
	}
	public String toString(){
		return "姓名:" + this.name + ";年龄:" + this.age ;
	}
	public int compareTo(Person per){
		if(this.age>per.age){
			return 1 ;
		}else if(this.age<per.age){
			return -1 ;
		}else{
			return this.name.compareTo(per.name) ;	// 调用String中的compareTo()方法
		}
	}
};
public class TreeSetDemo04{
	public static void main(String args[]){
		Set<Person> allSet = new TreeSet<Person>() ;
		allSet.add(new Person("张三",30)) ;
		allSet.add(new Person("李四",31)) ;
		allSet.add(new Person("王五",32)) ;
		allSet.add(new Person("王五",32)) ;
		allSet.add(new Person("王五",32)) ;
		allSet.add(new Person("赵六",33)) ;
		allSet.add(new Person("孙七",33)) ;
		System.out.println(allSet) ;
	}
};

此时去掉的重复元素并不是真正意义上的重复元素的取消。

import java.util.Set ;
import java.util.HashSet ;
class Person{
	private String name ;
	private int age ;
	public Person(String name,int age){
		this.name = name ;
		this.age = age ;
	}
	public String toString(){
		return "姓名:" + this.name + ";年龄:" + this.age ;
	}
};
public class RepeatDemo01{
	public static void main(String args[]){
		Set<Person> allSet = new HashSet<Person>() ;
		allSet.add(new Person("张三",30)) ;
		allSet.add(new Person("李四",31)) ;
		allSet.add(new Person("王五",32)) ;
		allSet.add(new Person("王五",32)) ;
		allSet.add(new Person("王五",32)) ;
		allSet.add(new Person("赵六",33)) ;
		allSet.add(new Person("孙七",33)) ;
		System.out.println(allSet) ;
	}
};

import java.util.Set ;
import java.util.HashSet ;
class Person{
	private String name ;
	private int age ;
	public Person(String name,int age){
		this.name = name ;
		this.age = age ;
	}
	public boolean equals(Object obj){	// 覆写equals,完成对象比较
		if(this==obj){
			return true ;
		}
		if(!(obj instanceof Person)){
			return false ;
		}
		Person p = (Person)obj ;	// 向下转型
		if(this.name.equals(p.name)&&this.age==p.age){
			return true ;
		}else{
			return false ;
		}
	}
	public int hashCode(){
		return this.name.hashCode() * this.age	; // 定义一个公式
	}
	public String toString(){
		return "姓名:" + this.name + ";年龄:" + this.age ;
	}
};
public class RepeatDemo02{
	public static void main(String args[]){
		Set<Person> allSet = new HashSet<Person>() ;
		allSet.add(new Person("张三",30)) ;
		allSet.add(new Person("李四",31)) ;
		allSet.add(new Person("王五",32)) ;
		allSet.add(new Person("王五",32)) ;
		allSet.add(new Person("王五",32)) ;
		allSet.add(new Person("赵六",33)) ;
		allSet.add(new Person("孙七",33)) ;
		System.out.println(allSet) ;
	}
};

SortedSet接口:

import java.util.SortedSet ;
import java.util.TreeSet ;
public class TreeSetDemo05{
	public static void main(String args[]){
		SortedSet<String> allSet = new TreeSet<String>() ;	//
		allSet.add("A") ;	// 增加内容
		allSet.add("B") ;	// 增加内容
		allSet.add("C") ;	// 增加内容
		allSet.add("C") ;	// 增加内容
		allSet.add("C") ;	// 增加内容
		allSet.add("D") ;	// 增加内容
		allSet.add("E") ;	// 增加内容
		System.out.println("第一个元素:" + allSet.first()) ;
		System.out.println("最后一个元素:" + allSet.last()) ;
		System.out.println("headSet元素:" + allSet.headSet("C")) ;
		System.out.println("tailSet元素:" + allSet.tailSet("C")) ;
		System.out.println("subSet元素:" + allSet.subSet("B","D")) ;
	}
};

总结:

时间: 2024-10-18 07:27:08

Java类集--Set接口、HashSet、TreeSet、SortedSet接口的相关文章

Java类集--Map接口、HashMap、IdentityHashMap、SortedMap

Collection的操作中之前已经发现,每次保存的对象都是一个对象,但是在Map中保存的是一对对象,对象的形式是以:key->value的形式保存的. 就好像电话本:张三-->12445 Map接口中的方法 Map接口中常用的子类: import java.util.HashMap ; import java.util.Map ; public class HashMapDemo01{ public static void main(String args[]){ Map<String

Java类集--Iterator接口、ListIterator接口、foreach及Enumeration接口

Iterator接口简介: import java.util.List ; import java.util.ArrayList ; import java.util.Iterator ; public class IteratorDemo01{ public static void main(String args[]){ List<String> all= new ArrayList<String>() ; // all.add("hello") ; all

Java类集--List接口

Collection下分为很多的子接口,其中有一个List接口,List接口中可以存放任意的数据.而且在List接口中内容是允许重复的.List接口的功能要比Collection接口强大很多,因为大量的扩充了Collection接口的操作. List接口的扩展方法: List接口的常用子类--ArrayList 如果要想使用接口,则肯定要使用对象的多态性进行实例化的操作.ArrayList是List中最常用的子类. 添加数据: import java.util.ArrayList ; impor

Java类集--LinkedList类

LinkedList子类与Queue接口 Queue接口定义的方法 LinkedList中操作链表的部分方法 本身大量的扩充了Queue接口和List接口的操作.所以,在使用时最好直接使用LinkedList类完成操作. 为链表的开头和结尾增加数据. import java.util.LinkedList ; public class LinkedListDemo01{ public static void main(String args[]){ LinkedList<String> lin

Java类集--属性类Properties

属性是在程序中经常出现的一种形式. 在类集中提供了一个专门的Properties类,以完成属性的操作. public class Properties extends Hashtable<Object, Object> Properties是Hashtable的子类,则也是Map的子类,可以使用Map的全部操作,但是一般情况下属性类是单独使用的. import java.util.Properties; public class PropertiesDemo01{ public static

Java类集--Stack类

栈是采用先进后出的数据存储方式,每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出. Stack类 常用方法: import java.util.Stack ; public class StackDemo{ public static void main(String args[]){ Stack<String> s = new Stack<String>() ; s.push("A") ; // 入栈 s.push("B") ; // 入

Java类集--Collections

Collections常用方法及常量: 验证:空集合的操作 import java.util.Collections ; import java.util.List ; import java.util.Set ; public class CollectionsDemo01{ public static void main(String args[]){ List<String> allList = Collections.emptyList() ; // 返回空的 List集合 Set&l

java-求解答,关于Java类和接口问题

问题描述 求解答,关于Java类和接口问题 在书上看到,对于实现了Comparable接口的类,Arrays类中的sort方法就可以对其进行排序, 那么,我们自己写的接口也能有这样的功能吗? 即,自己声明一个接口并定义一个类方法,对于实现了该接口的其他类,那么就可以使用该类方法. 如果能的话,能给个例子吗? 解决方案 Android问题:Java接口与类 解决方案二: http://blog.csdn.net/dliyuedong/article/details/21788731http://w

java类或接口中的泛型到底什么时候该设置他们的类型,什么时候不该?

问题描述 java类或接口中的泛型到底什么时候该设置他们的类型,什么时候不该? 一个类实现了一个接口 (1)首先是正常情况下对接口中泛型的实现 (2)接着是用T和?来模糊的表示接口的泛型 (3)接着把子类的泛型也设置成T,这时候又不报错了 到底什么时候该设置泛型,什么时候又可以用通配符来代替? 解决方案 关键是你的T在派生类中是否具体化 具体化 class IntList extends List<int> 保持泛化 class LinkedList<T> extends List