Set子接口
特点:无序(和程序顺序无关)、无下标、元素不可重复 方法:全部继承Collection中的方法
Set 实现类
基于HashCode实现元素不重复 当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入
基于排列顺序实现元素不重复 实现了SortedSet接口,对集合元素自动排序 元素对象的类型必须实现Comparable接口,指定排序规则 4.通过ComparaTo方法确定是否为重复元素
public class HelloWorld {
public static void main ( String[ ] args) {
Set< String> set= new HashSet < > ( ) ;
set. add ( "苹果" ) ;
set. add ( "华为" ) ;
set. add ( "小米" ) ;
System. out. println ( "数据个数:" + set. size ( ) ) ;
System. out. println ( set. toString ( ) ) ;
set. remove ( "苹果" ) ;
for ( String s : set) {
System. out. println ( s) ;
}
Iterator< String> it= set. iterator ( ) ;
while ( it. hasNext ( ) ) {
System. out. println ( it. next ( ) ) ;
}
set. contains ( "华为" ) ;
}
}
HashSet
存储结构:哈希表(数组+链表+红黑树) 存储过程(重复依据):
根据hashcode计算保存的位置,如果此位置为空则直接保存 位置不为空,执行equals方法。equals方法为true,则认为是重复,否则形成链表
public class HelloWorld {
public static void main ( String[ ] args) {
HashSet< String> hashSet= new HashSet < > ( ) ;
hashSet. add ( "刘德华" ) ;
hashSet. add ( "梁朝伟" ) ;
hashSet. add ( "林志玲" ) ;
hashSet. add ( "周润发" ) ;
hashSet. remove ( "刘德华" ) ;
Iterator< String> iterator = hashSet. iterator ( ) ;
hashSet. contains ( "郭富城" ) ;
}
}
public class HelloWorld {
public static void main ( String[ ] args) {
HashSet< Person> persons= new Hash Set< > ( ) ;
Person p1= new Person ( "刘德华" , 20 ) ;
Person p2= new Person ( "郭富城" , 22 ) ;
Person p3= new Person ( "梁朝伟" , 18 ) ;
persons. add ( p1) ;
persons. add ( p2) ;
persons. add ( p3) ;
persons. add ( new Person ( "梁朝伟" ,25 ) ) ;
}
}
== == == == == == == == == == == == == == == == == == == ==
@Override
public int hashCode ( ) {
int n1= this . name. hashCode ( ) ;
int n2= this . age;
return n1+ n2;
}
== == == == == == == == == == == == == == == ==
@Override
public boolean equals ( Object obj) {
if ( this == obj) {
retrurn true ;
}
if ( obj== null) {
return false ;
}
if ( obj instance of Person) {
Person p= ( Person) obj;
if ( this . name. equals ( p. getName ( ) ) && ( this . age== p. getAge ( ) ) {
return true ;
}
}
return false ;
补充: hashCode重写中的31作用: (1)31是一个质数,能减少散列冲突,使数据放在不同位置 (2)31能提高执行效率:31*i=(i<<5)-i
TreeSet
存储结构:红黑树 要求:元素必须实现Comparable接口,comparaTo()方法的返回值为0,认为是重复元素
public class HelloWorld {
public static void main ( String[ ] args) {
TreeSet< String> treeSet= new TreeSet < > ( ) ;
treeSet. add ( "xaa" ) ;
treeSet. add ( "abb" ) ;
treeSet. add ( "hcc" ) ;
treeSet. remove ( "xaa" ) ;
Iterator< String> iterator = treeSet. iterator ( ) ;
treeSet. contains ( "abc" ) ;
}
}
不能用下面的创建方法创建复杂的类型 原因:没有二叉树大小比较的标准
public class HelloWorld {
public static void main ( String[ ] args) {
TreeSet< Person> persons= new TreeSet < > ( ) ;
Person p1= new Person ( "刘德华" , 20 ) ;
Person p2= new Person ( "郭富城" , 22 ) ;
Person p3= new Person ( "梁朝伟" , 18 ) ;
persons. add ( p1) ;
persons. add ( p2) ;
persons. add ( p3) ;
persons. remove ( new Person ( "梁朝伟" , 18 ) ) ;
public class Person implements Comparable < Person> {
@Override
public int compareTo ( Person o) {
int n1= this . gatName ( ) . compareTo ( o. getName ( ) ) ;
int n2= this . age- o. getAge ( ) ;
return n1== 0 ? n2: n1;
}
}
}
Comparator(比较器):实现定制比较 Comparable:可比较的
public class HelloWorld {
public static void main ( String[ ] args) {
TreeSet< Person> treeSet= new TreeSet < > ( new Comparator < Person> ( ) {
@Override
public int compare ( Person o1, Person o2) {
int n1= o1. getAge ( ) - o2. getAge ( ) ;
int n2= o1. getName ( ) . comparaTo ( o2. getName ( ) ) ;
return n1== 0 ? n2: n1;
}
} ) ;
Person p1= new Person ( "刘德华" , 20 ) ;
Person p2= new Person ( "郭富城" , 22 ) ;
Person p3= new Person ( "梁朝伟" , 18 ) ;
persons. add ( p1) ;
persons. add ( p2) ;
persons. add ( p3) ;
}
}