Java基础知识 九 (Collection集合子类 Set集合)

来源:互联网 发布:c语言access violation 编辑:程序博客网 时间:2024/05/17 22:35

Set集合
 (1)Set集合的特点

     无序,唯一


 (2)HashSet集合

  A:底层数据结构是哈希表(是一个元素为链表的数组)

  B:哈希表底层依赖两个方法:hashCode()和equals()

    执行顺序:

   首先比较哈希值是否相同

    相同:继续执行equals()方法

     返回true:元素重复了,不添加

     返回false:直接把元素添加到集合

    不同:就直接把元素添加到集合

  C:如何保证元素唯一性的呢?

   由hashCode()和equals()保证的

  D:开发的时候,代码非常的简单,自动生成即可。

  E:HashSet存储字符串并遍历

  F:HashSet存储自定义对象并遍历(对象的成员变量值相同即为同一个元素)

 

public class SetDemo {
 public static void main(String[] args) {
  // 创建集合对象
  Set set = new HashSet();

  // 创建并添加元素
  set.add("hello");
  set.add("java");
  set.add("world");
  set.add("java");
  set.add("world");

  // 增强for
  for (String s : set) {
   System.out.println(s);
  }
 }
}


 (3)TreeSet集合

  A:底层数据结构是红黑树(是一个自平衡的二叉树)

  B:保证元素的排序方式

   a:自然排序(元素具备比较性)

    让元素所属的类实现Comparable接口

   b:比较器排序(集合具备比较性)

    让集合构造方法接收Comparator的实现类对象

public class TreeSetDemo {
 public static void main(String[] args) {
  // 创建集合对象
  TreeSet ts = new TreeSet();

  // 创建元素
  Student s1 = newStudent("linqingxia", 27);
  Student s2 = newStudent("zhangguorong", 29);
  Student s3 = newStudent("wanglihong", 23);
  Student s4 = newStudent("linqingxia", 27);
  Student s5 = newStudent("liushishi", 22);
  Student s6 = newStudent("wuqilong", 40);

  // 添加元素
  ts.add(s1);
  ts.add(s2);
  ts.add(s3);
  ts.add(s4);
  ts.add(s5);
  ts.add(s6);

  // 遍历
  for (Student s : ts) {
   System.out.println(s.getName()"---" s.getAge());
  }
 }
}

 

//定义一个学生类
public class Student implements Comparable {
 private String name;
 private int age;

 public Student() {
  super();
 }

 public Student(String name, int age) {
  super();
  this.name = name;
  this.age = age;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }

 @Override
 public int compareTo(Student s) {
  // 主要条件 姓名的长度
  int num = this.name.length() -s.name.length();
  // 姓名的长度相同,不代表姓名的内容相同
  int num2 = num == 0 ?this.name.compareTo(s.name) : num;
  //姓名的长度和内容相同,不代表年龄相同,所以还得继续判断年龄
  int num3 = num2 == 0 ? this.age- s.age : num2;
  return num3;
 }
}

0 0
原创粉丝点击