• java 深入技术四(Set)


    1)Set接口

    set接口的父接口-Collection

    set接口的重要子类-HashSet

    set接口的重要子类 -TreeSet

    set 接口的特别子类-LinkedHashSet

    2)HashSet

    内部数据结构:哈希表(散列表)

    哈希表的一种典型结构是数组和链表的结合体

    添加:园内的元素上的数字表示哈希值,简单起见,决定元素在数组上的位置,算法:index=hashCode%length;

    元素的hashCode()方法决定元素在数组中位置,元素添加到链表是,会一次和链表的每个元素判断是否相等,如果有相等情况就丢弃,否则,添加到链表的末尾

    1.确定在数组中的位置

    2.判断元素在链表上有没有出现过(equals),hashSet中不能存相同的元素

    删除:remove(obj) 会先根据元素的hashCode方法定位此对象所在数组的索引位置,依次比较次位置链表的每一个元素,如果相等,则把链表中的此元素删除

    特点://元素无序:添加顺序和取出顺序不同
     //不能添加重复的数据
     //可以添加null
     //添加方法效率高

    //删除方法效率高

    /、HashSet 不支持get获取方法,因为没有索引

    3)TreeSet

    内部数据结构:二叉树

    二叉树特点:一个节点最后只有两个子节点左<父>右,没有重复元素

    取出顺序:左-父-右,3,8,10,15,18,20,24(元素在集合中就已排好序)从小到大

    按照终序遍历

    先找根节点左边的节点

    TreeSet的方法和Collection接口的方法一致

    TreeSet集合的元素无序(取出顺序和添加顺序不一致)

                       元素不可重复

                      元素具有排序性

    TreeSet取出元素只能通过迭代器

    TreeSet各种操作的效率分析:

    添加:只需要定位添加位置,效率很快

    删除:只需要定位元素位置,效率很快

    4)Comparable

    TreeSet元素排序规则:

    Comparable接口用来标明元素自身的排序规则,也就是说只有实现此接口才具有比较性,才可以添加到TreeSet中

    java常见类如String ,Integer 等都已实现Comparable接口,都有自己独特的排序规则,但我们定义的类Person由于没有实现Comparable接口,因此不具备排序性(比较性)

    如果我们想按照Person的姓名排序,我们可以实现Comparable接口,实现此接口的comparable方法,在此方法中按照姓名排序的代码

    元素自身所具有的排序规则称为自然排序

    只对TreeSet 有效:添加到TreeSet中的元素实现了Comparable接口,实现CompareTo方法后,自身就具有排序性,自然排序

     5)Comparator比较器

     和元素排序有关的两个接口:Comparable,Comparator

    Comparable要求元素本身实现Comparable接口,本身具有比较性

    public class Person implements Comparable{

    .

    .

    .

    //按照姓名字符串的字典顺序排序
            public int compareTo(Object o){
             //如果返回值等于0,就说明要比较的两个对象相等
             //如果返回小于0的数呢?
             
             if(name==null){
              return 1;
             }
             Person other=(Person)o;
             return name.compareTo(other.getname());
            }

    }

    Comparator元素并不需要实现接口,接口和集合对象相关

    MyComparator mycomparator=new MyComparator();
      TreeSet treeSet=new TreeSet(mycomparator);

    。。。

    //专门用来比较Person对象
    class MyComparator implements Comparator{
     public int compare(Object o1,Object o2){
      Person p1=(Person)o1;
      Person p2=(Person)o2;
      //为了简单起见,不考虑p1,p2为null的情况
      int age1=p1.getage();
      int age2=p2.getage();
      if(age1==age2){
       String name1=p1.getname();
       String name2=p2.getname();
       //String类型本身就具有比较性.name1不为null
       return name1.compareTo(name2);
      }else{
       return age1-age2;
      }
     }

    6)Set接口综述

    特点:元素无序,不可重复

    Set接口没有提供特殊的方法:Collection Set接口,HashSet,TreeSet类方法都是一样

     7)LinkedHashSet

    LinkedHashSet是哈希表和链表的结合体

    结合后的特点:元素有序,元素不可重复,添加删除效率高

    8)Set练习

    1.去除集合中的重复元素

    //1.使用迭代器一个一个添加
    //  Iterator it=list.iterator();
    //  while(it.hasNext()){
    //   Object element=it.next();
    //   set.add(element);
    //   
    //  }
    //  System.out.println(set);
      //2.HashSet 中可以添加一个Collection类的参数
    //  Set set2=new HashSet(list);
    //  System.out.println(set2);
      //3.SetAll(Collection)
      Set set3=new HashSet();

    2.把一个字符串数组中的元素按字符串的长度降序排序,如果长度一样,按照字符串的自然顺序排序

    HashSet set= new HashSet(new Comparator{

    public int compare(Object o1,Object o2){

    String str1=(String)o1;

    String str2=(String)o2;

    if(str1==null){

    return 1;

    }

    if(str2==null){

    return -1;

    }

    int len1=str1.length();

    int len2=str2.length();

    if(len1==len2){

    return len1.compare(len2);

    }else{

    return len1-len2

    }

    }

    })

     3. 简单实现自己的HashSet类-MyHashSet,简单实现add(obj),remove(obj)方法,实现自己的printAllElement()方法,此方法打印出所有的元素(不用实现其他接口)

     1.创建一个LinkedList 数组,在add方法中添加链表,LinkedList linkedList=datas[index];

    2.if(linkedList==null){

    linkedList=new LinkedList();

    data[index]=linkedList();

    }

    Iterator it=linkedList.iterator();

    while(it.hasNext()){

    Object element=it.next();

    if(obj.equals(element)){

    return;

    }

    linkedList.add(obj);

    }

  • 相关阅读:
    7.Layout布局(tabs、accordion、layout)
    6.form表单四种提交方式
    5.form表单验证
    4.easyloader.js文件的作用
    3.window窗口
    2.panel面板
    1.messager消息提示框
    2017-10-5-Python
    2017-9-24-Linux移植:ubuntu server 16.04无法联网&无法apt-get update解决
    2017-9-17-EDFA
  • 原文地址:https://www.cnblogs.com/shiyeyeyeye/p/5018972.html
Copyright © 2020-2023  润新知