Java Set子接口

1.Set

1.存储一组无序的不可重复的数据,Set接口没有像List接口一样对Collection接口进行大量的扩充,而是简单的继承了Collection接口;
 2.public interface Set<E>extends Collection<E>{}
 3.Set本身是接口,操作List需要利用子类(实现类)
 4.可以使用HashSet,TreeSet,LinkedHashSet来为其实例化,如果返回的是0,那么它就会认为是重复数据,不会被保存;

1.1HashSet

/**
	 * 
	 * public class HashSet<E>
      extends AbstractSet<E>
      implements Set<E>, Cloneable, java.io.Serializable{}
	 * 特点:
	 *  a.采用hash表算法来实现
	 *  b.存放无序不可重复的值;
	 */
	Set set=new HashSet<String>();
	set.add("李煜");
	set.add("李清照");
	set.add("李煜");
	set.add("李清照");	
	for (Object object : set) {
		System.out.println(object);
	}
	Iterator<String> iterator=set.iterator();
	while(iterator.hasNext()){
	  System.out.println(iterator.next());	
	}

3.2TreeSet

class Book implements Comparable<Book>{
 private String name;
 private Double price;
 public String getName() {
	 return name;
 }
 public void setName(String name) {
	 this.name=name;
 }
 public Double getPrice() {
	 return price;
 }
 public void setPrice(Double price) {
	 this.price=price;
 }
public Book() {
	super();
}
public Book(String name, Double price) {
	super();
	this.name = name;
	this.price = price;
}
@Override
public String toString() {
	return "book [name=" + name + ", price=" + price + "]";
}
@Override
public int compareTo(Book o) {
	// TODO Auto-generated method stub
	if(this.price>o.price) {
		System.out.println(this.price);
		return 1;
	}else if(this.price<o.price) {
		System.out.println(this.price);
		return -1;
	}else {
		System.out.println(this.price);
		//return 0;//这两个对象为一个对象
		int compareTo = this.name.compareTo(o.name);//调用String比较大小的方法
		System.out.println(compareTo);
		return compareTo; 
	}
	
	
}

}
public class TestArrayList {
 public static void main(String[] args) {
	/**
	 * 排序问题说明
	 *   1.集合是一个动态的对象数组,如果想要对一组对象进行排序,在Java里面规定必须使用比较器(java.lang.Comparable)完成比较,
	 *   在比较的方法里面需要将这个类中的所有属性都一起参与到比较之中;
	 *   2.TreeSet是依靠Comparable接口中compareTo(t)方法判断是否为重复数据;
	 *重复问题说明
	 * 1.Comparable只负责TreeSet子类进行重复元素的判断,并不是真正用于能够进行重复元素验证的操作,如果要判断重复元素只能依靠Object类中提供的方法;
	 *   a.hashCode();取得哈希码
	 *    1.先判断对象的哈希码是否相同,依靠哈希码取得一个对象的内容;
	 *   b.equals();对象比较;
	 *    2.将对象的属性依次比比较
	 */
	Set<Book> set=new TreeSet<Book>();
	set.add(new Book("Java开发", 88.8));
	set.add(new Book("Java开发", 88.8));
	set.add(new Book("前端开发", 88.8));
	set.add(new Book("安卓开发", 58.8));
	System.out.println(set);
	//java.lang.ClassCastException: com.test.list2.Book cannot be cast to java.lang.Comparable
	//[book [name=安卓开发, price=58.8], book [name=Java开发, price=88.8]] 价格重复的没有显示;
	
}
}

Set重复问题

class Book{
 private String name;
 private Double price;
 public String getName() {
	 return name;
 }
 public void setName(String name) {
	 this.name=name;
 }
 public Double getPrice() {
	 return price;
 }
 public void setPrice(Double price) {
	 this.price=price;
 }
public Book() {
	super();
}
public Book(String name, Double price) {
	super();
	this.name = name;
	this.price = price;
}
@Override
public String toString() {
	return "book [name=" + name + ", price=" + price + "]";
}
@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ((name == null) ? 0 : name.hashCode());
	result = prime * result + ((price == null) ? 0 : price.hashCode());
	return result;
}
@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	Book other = (Book) obj;
	if (name == null) {
		if (other.name != null)
			return false;
	} else if (!name.equals(other.name))
		return false;
	if (price == null) {
		if (other.price != null)
			return false;
	} else if (!price.equals(other.price))
		return false;
	return true;
}


}
public class TestArrayList {
 public static void main(String[] args) {
	
	Set<Book> set=new HashSet<Book>();
	set.add(new Book("Java开发", 88.8));
	set.add(new Book("Java开发", 88.8));
	set.add(new Book("前端开发", 88.8));
	set.add(new Book("安卓开发", 58.8));
	System.out.println(set);
	
	/*[
	   book [name=Java开发, price=88.8],
	   book [name=安卓开发, price=58.8], 
	   book [name=前端开发, price=88.8], 
	   book [name=Java开发, price=88.8]
	]*/
    
	/*重复问题说明
	 * 1.Comparable只负责TreeSet子类进行重复元素的判断,并不是真正用于能够进行重复元素验证的操作,如果要判断重复元素只能依靠Object类中提供的方法;
	 *   a.hashCode();取得哈希码
	 *    1.先判断对象的哈希码是否相同,依靠哈希码取得一个对象的内容;
	 *   b.equals();对象比较;
	 *    2.将对象的属性依次比比较*/
	/*[
	 book [name=前端开发, price=88.8],
	 book [name=安卓开发, price=58.8], 
	 book [name=Java开发, price=88.8]
	]*/

}
}

总结; TreeSet使用起来比较麻烦;一般不考虑使用;如果要使用Set子类一般考虑HashSet

猜你喜欢

转载自blog.csdn.net/qq_29393273/article/details/85834633
今日推荐