鱼C论坛

 找回密码
 立即注册
查看: 3282|回复: 0

[学习笔记] Java暑期学习Day38

[复制链接]
发表于 2017-8-13 23:27:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 马太效应 于 2017-8-13 23:45 编辑

今天是第38天,要于茫然中找到方向


                               
登录/注册后可看大图


内容不重复的Set
A.Set于API
public interface Set<E>
extends Collection<E>
  不包含重复元素的集合。 更正式地,集合不包含一对元素e1和e2 ,使得e1.equals(e2) ,并且最多一个空元素。 正如其名称所暗示的那样,这个接口模拟了数学集抽象。
  Set接口除了继承自Collection接口的所有构造函数的合同以及add,equals和hashCode方法的合同外 , 还增加了其他规定。 其他继承方法的声明也包括在这里以方便。

(伴随这些声明的规范已经量身定做Set接口,但它们不包含任何附加的规定。)
  构造函数的额外规定并不奇怪,所有构造函数都必须创建一个不包含重复元素的集合(如上所定义)。


  注意如果可变对象用作设置元素,则必须非常小心。 如果对象的值以影响equals比较的方式更改,而对象是集合中的元素, 则不指定集合的行为。 这种禁止的一个特殊情况是,一个集合不允许将其本身作为一个元素。


  一些集合实现对它们可能包含的元素有限制。
  例如,一些实现禁止空元素,有些实现对元素的类型有限制。 尝试添加不合格元素会引发未经检查的异常,通常为NullPointerException或ClassCastException 。
  尝试查询不合格元素的存在可能会引发异常,或者可能只是返回false;
  一些实现将展现出前者的行为,一些实现将展现出后者。 更一般来说,尝试对不符合条件的元素的操作,其完成不会导致不合格元素插入到集合中,可能会导致异常,或者可能会成功执行该选项。 此异常在此接口的规范中标记为“可选”。


  此接口是成员Java Collections Framework


B.代码辅助理解
import java.util.HashSet;
import java.util.Set;

class Student {
        private String name;
        private String number;

        Student(String name, String number) {

                this.name = name;
                this.number = number;

        }

        @Override
        public String toString() {
                return String.format("%s,%s", name, number);

        }

}

public class Students {
        public static void main(String[] args) {

                Set students = new HashSet();
                students.add(new Student("Justin", "B835031"));
                students.add(new Student("Monica", "B835032"));
                students.add(new Student("Justin", "B835031"));
                System.out.println(students);

        }

}
结果是——
  [Justin,B835031, Justin,B835031, Monica,B835032]


  结果并没有排除重复,因为它在例子中判断不出来。以HashSet为例子,会使用对象的hashCode()与equals()来判断对象是否相同。
HashSet的操作概念是,在内存中开设空间,每个空间会有个哈希编码(HashCode)。


                               
登录/注册后可看大图



  ps.百科之哈希码
  哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。
  几个常用的哈希码的算法。
  1、Object类的hashCode.返回对象的[1]  内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
  2、String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同。
  3、Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。





  


评分

参与人数 1鱼币 +4 收起 理由
小甲鱼 + 4 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 12:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表