ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

set集合 hashset treeset

2021-01-09 13:00:46  阅读:152  来源: 互联网

标签:set hashset int add println n1 treeSet treeset


Set集合

概述:

set集合特点:无序 无下标 不可重复

方法全部继承自collection

set集合中区别对象是不是唯一的标准是:两个对象的hashcode是否一样,再判定两个对象是否equals

set接口的使用

添加数据 add

删除数据 remove

遍历:1.增强for

​ 2.迭代器

判断 contains

非空 isempty

Set<String> set = new HashSet();
set.add("华为");
set.add("苹果");
set.add("小米");
System.out.println(set.size());
System.out.println(set.toString());
//set.remove("华为");
//System.out.println(set.size());
//遍历 1.增强for
for (String x:set
     ) {
    System.out.println(x);
}
System.out.println("___________");
//2.迭代器
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
    System.out.println(iterator.next());
}
System.out.println(set.contains("华为"));
System.out.println(set.isEmpty());

set实现类

hashset

HashSet<String> hashSet = new HashSet();

基于hashcode实现 元素不重复

当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入

hashset的存储过程

根据hashcode计算保存的位置。

如果此位置为空,则直接保存。

如果不为空,执行equals方法,如果equals方法为true,则认为是重复。否则:形成链表。

判断重复的依据:hashcode和equals

set集合中区别对象是不是唯一的标准是:两个对象的hashcode是否一样,再判定两个对象是否equals

重写hashcode方法和equals方法
//hashcode方法重写
public int hashCode() {
    int n1 = this.name.hashCode();
    int n2 = this.age;
    return n1+n2;
}

重写hashcode方法中,会加一个数字。一般是质数 17或者31

原因:1. 31是一个质数,减少散列冲突

  1. 提高执行效率 31*i=(i<<5)-i i的5次方 左移五位

treeset

普通元素

TreeSet<String> treeSet = new TreeSet();
treeSet.add("abc");
treeSet.add("bcd");

红黑树,节点颜色不同

二叉查找树,一个节点最多有两个子节点

基于排列顺序实现元素不重复

实现了SortedSet接口,对集合元素自动排序

元素对象的类型必须实现Comparable接口,指定排序规则

通过Compareto方法确定是否为重复元素

复杂元素

报错 classcastexception

在二叉树中,左边的元素比右边的小,但是程序不知道如何比较大小,所以报错。

要求:元素必须要实现comparable接口,接口里要实现抽象方法 public int compareTo。(此方法视为比较规则)

方法返回0,则认为是重复元素。

compareTo方法
public class Person implements Comparable<Person>
public int compareTo(Person o) {
    //n1==0时 说明姓名一样
    int n1 = this.getName().compareTo(o.getName());
    int n2 = this.age-o.getAge();
    //n1=0时 说明名字相同,返回n2
    //.n1不相同时,说明名字不同,直接返回n1
    return n1==0?n2:n1;
}

比较规则:先按姓名比,再按年龄比

compareTo的作用是比较重复,与list中的重写equals,hashset中重写hashcode,equals的作用相同

Comparator接口(比较器)

Comparator接口:定制比较

Comparable接口:内置compareTo方法,适用于元素的类可以实现接口(比如自建的类),String类则使用Comparator比较器

匿名内部类

//创建集合并指定比较规则
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().compareTo(o2.getName());

        return n1==0?n2:n1;
    }
});

案例

要求:使用TreeSet集合,实现字符串按长度排序,短到长

import java.util.Comparator;
import java.util.TreeSet;

public class Test {
    public static void main(String[] args) {
        //接口不能实例化,此处使用匿名内部类来实现接口
        //创建集合并指定比较规则
        TreeSet<String>treeSet = new TreeSet<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                int n1 = o1.length()-o2.length();
                int n2 = o1.compareTo(o2);
                return n1==0?n2:n1;
            }
        });
        treeSet.add("helloworld");
        treeSet.add("zhang");
        treeSet.add("lisi");
        treeSet.add("wangwu");
        treeSet.add("beijing");
        treeSet.add("xian");
        treeSet.add("nanjing");

        System.out.println(treeSet.size());
        System.out.println(treeSet.toString());
    }
}

标签:set,hashset,int,add,println,n1,treeSet,treeset
来源: https://blog.csdn.net/weixin_43903813/article/details/112254521

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有