Java中的集合(二)
作者:互联网
2、Set接口
Set接口以散列形式存储数据,所以元素没有顺序,可以存储一组无序,唯一的对象;
Set的常用子接口有HashSet、LinkedHashSet、TreeSet。
2.1HashSet
HashSet存储一组无序,且唯一的对象,这里的无序是指元素的存储数据和遍历数据不一致。
/**
* @author EA_emran
*/
public class LearnHashSet {
public static void main(String[] args) {
HashSet hashSet = new HashSet();
hashSet.add("Hello");
hashSet.add("Mysql");
hashSet.add("Hello");
hashSet.add("HTML");
hashSet.add("JavaSE");
System.out.println(hashSet);
System.out.println(hashSet.size());
System.out.println("遍历HashSet");
Iterator iterator = hashSet.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next()+",");
}
hashSet.remove("Hello");
System.out.println("删除之后遍历HashSet");
iterator = hashSet.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next()+",");
}
}
}
运行结果
2.2LinkedHashSet
LinkedHashSet存储一组有序,且唯一的对象(这里的有序是指,存储顺序和遍历顺序相同)
/**
* @author EA_emran
* LinkedHashSet除了存入顺序和遍历顺序相同外,其他和HashSet一样;
* ==和equals的区别
*/
public class LearnLinkedHashSet {
public static void main(String[] args) {
LinkedHashSet linkedHashSet = new LinkedHashSet();
linkedHashSet.add(new A(1));
linkedHashSet.add(new A(1));
Iterator iterator = linkedHashSet.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next()+",");
}
}
}
class A{
private int num;
public A(int num){
this.num = num;
}
@Override
public boolean equals(Object o) {
return true;
}
@Override
public int hashCode() {
return 1;
}
@Override
public String toString() {
return "A{" +
"num=" + num +
'}';
}
}
==比较的是两个对象的内存地址;如果要判断内容相等,首先我们需要判断两个对象的hashCode相等,hashCode简单来说是将对象的内部信息如内存地址,属性值的等转换为一个散列值,这个散列值就是hashCode。
两个对象的hashCode相等这两个对象可能还不相等,但是两个对象的hashCode不相等,那么这两个对象一定不相等。
所以集合在两个对象是否相等的时候,先判断两个对象的hashCode是否相等,如果相等在用equals()进行进一步判断,这样能够减少equals方法的调用可以提高效率。
运行结果
2.2TreeSet
除了LinkedHashSet中可以存放有序元素外,TreeSet中也能存放有序数据,但它的有序是根据内部集合自动给所有元素升序排列,遍历时也会按照升序的顺序遍历。
/**
* @author EA_emran
*/
public class LearnTreeSet {
public static void main(String[] args) {
TreeSet treeSet = new TreeSet();
treeSet.add(new B(4));
treeSet.add(new B(6));
treeSet.add(new B(1));
treeSet.add(new B(3));
treeSet.add(new B(2));
treeSet.add(new B(12));
treeSet.add(new B(5));
treeSet.add(new B(1));
System.out.println(treeSet);
System.out.println("长度:"+treeSet.size());
System.out.println("遍历");
Iterator iterator = treeSet.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next()+",");
}
System.out.println("=================");
}
}
class B implements Comparable{
private int num;
public B(int num){
this.num = num;
}
@Override
public int compareTo(Object o) {
/**
* 返回值:
* 1表示A大于B
* 0表示A等于B
* -1表示A小于B
*/
B b = (B) o;
if (this.num > b.num){
return 1;
}else if(this.num == b.num){
return 0;
}else {
return -1;
}
}
@Override
public String toString() {
return "B{" +
"num=" + num +
'}';
}
}
标签:Java,iterator,add,num,集合,new,public,treeSet 来源: https://blog.csdn.net/wolf827/article/details/122717599