Java集合(二)

Java集合(二),第1张

Java集合(二)

1. se接口 
 特点:值不重复,存放元素,元素无索引

注:List是按添加顺序排放的

两种实现:

   HashSet :特点:不重复,无序的

   TreeSet:特点:不重复,可以根据元素进行排序

两种循环:增强for循环和迭代器遍历

1. HashSet
     默认初始容量(16)和负载因子(0.75)

1. 创建及其常用方法
         创建默认的HashSet集合     HashSet set = new HashSet<>();

     创建容量20的HashSet集合     HashSet set = new HashSet<>(20);

2. add(E e)
添加元素时,如何判断元素是否存在(判断HashMap的键是如何判断的),在添加元素时,在里面判断元素是否存在

解决两个问题: 1. 效率要高;(hashCode()效率高,但不安全)2. 安全(equals() 绝对安全,效率低)

         add添加时,先用内容调用hashCode() 方法,计算出一个哈希值(int),用hash值比较是否相同,效率高,但是只用哈希值比较不安全,这时会调用equals()方法对每个字符进行比较。

 例: new Person()  在内存中创建一个对象,有一个内存地址

public static int hashCode(Object o) {
    return o != null ? o.hashCode() : 0;
}
默认调用object类中hashCode()方法。

import java.util.HashSet;
 
public class HashSetTest {
    public static void main(String[] args) {
        HashSet set = new HashSet<>();
        Person p1 = new Person(1,"张三1");
        Person p2 = new Person(2,"张三2");
        Person p3 = new Person(3,"张三3");
        Person p4 = new Person(1,"张三1");
        Person p5 = new Person(4,"张三4");
        set.add(p1);
        set.add(p2);
        set.add(p3);
        set.add(p4);
        set.add(p5);
        System.out.println(set);
    }
}

注:Person类中没有进行重写Object类中的hashCode(),默认调用的是Object类中的,取出的是内存地址。

一般的类都会进行重写object类中hashCode()方法,重写后的计算方式都是根据对象中的包含的内容的值进行计算的,重写后添加时,调用自己类中的hashCode() ;

例题:

import java.util.Objects;
 
public class Person {
    private int id;
    private String name;
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return id == person.id &&
                name.equals(person.name);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }
 
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + ''' +
                '}';
    }
}
3. 常用方法


判断集合是否存在指定元素                 set.contains("a");

判断集合是否为空                                  set.isEmpty();

删除集合中指定元素                              set.remove("a");

集合存储元素的个数                              set.size();
 

 4. 两种循环
import java.util.HashSet;
import java.util.Iterator;
 
public class HashSetDemo {
    public static void main(String[] args) {
        HashSet set = new HashSet<>();
        set.add("a");
        set.add("b");
        set.add("c");
        set.add("a");
        set.add("d");
 
        for (String t:set
             ) {
            System.out.println(set);
        }
        Iterator it = set.iterator();
        while (it.hasNext()){
            String str = it.next();
        }
        System.out.println(set);
    }
}
2. TreeSet 1. 创建

    默认的创建方式: TreeSet tset = new TreeSet<>();

2. 添加方法

   添加时要对元素进行排序和去重(实现compareTo()),比较大小,值如果 == 0了,则说明有重复

 
public class Person implements Comparable{
    private int id;
    private String name;
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }
 
    @Override
    public int compareTo(Person o) {
       return this.id - o.id;
//        return this.name.compareTo(o.name);
    }
 
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + ''' +
                '}';
    }
}
public class TreeSetTest {
    public static void main(String[] args) {
      
        TreeSet tset = new TreeSet<>();
        Person p1 = new Person(01, "小段");
        Person p2 = new Person(02, "小小");
        Person p3 = new Person(04, "小王");
        Person p4 = new Person(01, "小段");
        Person p5 = new Person(03, "小新");
        tset.add(p1);
        tset.add(p2);
        tset.add(p3);
        tset.add(p4);
        tset.add(p5);
        //添加时要对元素进行排序和去重(使用conpareTo()方法)
        //比较大小,值如果 == 0,有重复
        System.out.println(tset);
    }
}

3. 常用方法
 删除第一个元素                          tset1.pollFirst();
 删除最后一个元素                      tset1.pollLast();
查找第一个元素                           tset1.first();
查找最后一个元素                       tset1.last();

import java.util.TreeSet;
 
public class TreeSetDemo1 {
    public static void main(String[] args) {
      TreeSet tset1 = new TreeSet<>();
        tset1.add(3);
        tset1.add(2);
        tset1.add(4);
        tset1.add(1);
        tset1.add(2);
        System.out.println(tset1);//[1, 2, 3, 4]
        System.out.println(tset1.first());//1
        tset1.pollFirst();
        System.out.println(tset1);//[2, 3, 4]
        System.out.println(tset1.first());//2
        System.out.println(tset1.last());//4
        tset1.pollLast();
        System.out.println(tset1);//[2, 3]
        System.out.println(tset1.last());//3
 
      
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5684436.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存