A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

今天我们继续了集合的学习,请根据自己的理解回答下面问题:
1.Set接口下的集合是如何保证无序不可重复的
2.我们为什么要重写HashCode( )和equals()方法?
3.数据在存入Set集合的时候,是先判断HashCode()还是先判断equals(),为什么?
4.Comparable和Comparator两个接口的区别,哪种接口使用的多,为什么?
5.什么是泛型?使用泛型有什么好处?

6 个回复

倒序浏览
1.Set接口下的集合是如何保证无序不可重复的?
答: (1)往Set接口下的集合中存储元素,先重写hashCode方法。
      (2)当调用add方法时,先去调用重写的hashCode计算对象的值。
      (3)根据对象的hash值计算存储位置,如果存储位置无元素或者有元素会比较hash值且不相同,会直接存储。
      (4)如果有相同的hash值,调用equals方法进行比较,内容相同,则不存储,内容不同,直接存储。
      
2.我们为什么要重写HashCode( )和equals()方法?
答: (1)重写hashCode方法可以保证对象内容不一致。
      (2)重写equals方法可以确保元素是唯一的。

3.数据在存入Set集合的时候,是先判断HashCode()还是先判断equals(),为什么?
答: 先判断hashCode(),可以减少元素调用equals()方法的次数,提高程序效率。

4.Comparable和Comparator两个接口的区别,哪种接口使用的多,为什么?
答: 前者为自然排序,后者为比较器排序;Comparator接口用的比较多,比较器排序,可以在一个实体对象实
现复杂逻辑,修改方便,代码的解耦性和独立性比较强。

5.什么是泛型?使用泛型有什么好处?
答: 泛型是定义类、方法、接口的时候指定的未知的数据类型。
      好处有2点: (1)将运行期的异常提前到编译期。
                       (2)避免了强制类型转换。
回复 使用道具 举报

1.Set接口下的集合是如何保证无序不可重复的
  答:(1)首先根据元素计算出哈希值
(2)然后通过哈希值就算出元素应该存放的位置,如果该位置没有任何元素,就直接存放进去,如果该位置有元素,就
对比哈希值
(3)通过比较哈希值,如果哈希值不同,就把元素存放进去,如果哈希值相同,就通过equals进行比较
(4)通过equals比较元素内容,如果元素内容不同,就把元素存放进去,如果相同,就舍弃

2.我们为什么要重写HashCode( )和equals()方法?
答:创建Set集合时,要保证集合中元素的唯一性,(使用hash算法实现,并需要重写hashCode()和equals()方法)

3.数据在存入Set集合的时候,是先判断HashCode()还是先判断equals(),为什么?
答;先判断HashCode(),因为创建的每一个元素对象的哈希值都是不同,如果哈希值不同了,就可以直接把元素存放到集合中,不需要再判断equals()方法了,如果哈希值相同,再判断equals()方法。

4.Comparable和Comparator两个接口的区别,哪种接口使用的多,为什么?
答:Comparator使用的更多,因为使用Comparable接口进行排序,提高了代码的耦合性,而Comparator没有这种情况,直接使用匿名内部类,提高代码的操作效率。

5.什么是泛型?使用泛型有什么好处?
答:泛型:在定义类的时候,没有确定具体的数据类型
好处:
(1)避免了强转的麻烦
(2)让运行期间出现的错误提前到了编译器
(3)使用泛型可以在创建对象的时候确定数据类型,那么类中只写一段代码,可以重复使用,提高代码的复用性
回复 使用道具 举报

今天我们继续了集合的学习,请根据自己的理解回答下面问题:
1.Set接口下的集合是如何保证无序不可重复的
    HashSet 根据hashCode方法计算出哈希值,判断在哈希表中的位置,
            如果有元素的哈希值一致,那么就会判断两个元素的equals,
            如果返回false代表元素不同可以进行存储,否则代表元素相同不进行存储
    TreeSet 根据内部比较器重写的CompareTo或者外部比较器的Compare方法返回值判断
            如果返回值为-1,代表会被添加到被比较者的前面
                返回值为1,代表会被添加到被比较者的后面
                返回值为0,代表两个元素为同一个元素,不进行存储
2.我们为什么要重写HashCode( )和equals()方法?

            为了HashSet的唯一不可重复性,不重写调用的是父类的方法

3.数据在存入Set集合的时候,是先判断HashCode()还是先判断equals(),为什么?
            先判断HashCode(),在判断equals()
            在存储的时候先根据HashCode计算哈希值,哈希值相同在判断equals()

4.Comparable和Comparator两个接口的区别,哪种接口使用的多,为什么?
           Comparable 内部比较器   定义在类中,通过实现Comparable 接口重写comparTo方法
           Comparator 外部比较器   定义在TreeSet的构造中,重写Compare方法
           外部比较器用的多,外部比较器使用匿名内部类的形式,相对于内部比较器来说更方便
           开发中基本不会再源码中定义内部比较器
5.什么是泛型?使用泛型有什么好处?
          泛型:        jdk1.5的新特性,在编译时类型安全检测机制,本质为可参数化类型,在使用/调用时传入具体的类型
                  泛型类,泛型接口,泛型方法
          好处:将运行时期可能发生的异常转为编译时期
                在调用某些方法(迭代器.next不指定泛型返回Object类型,需要强转)
                会自动进行类型检测,使用对应的类型接受,而不需要进行强转
回复 使用道具 举报
1、先去计算该元素的哈希值(hashCode())
        如果哈希值相同
                会调用equals()进行比较  
                        true : 认为是相同元素 不进行存储
                        false: 认为是不同元素 进行存储
        如果哈希值不相同
                直接将该元素存储
2、因为object中的equals()方法比较的是对象的引用地址是否相等,如何你需要判断对象里的内容是否相等,则需要重写equals()方法。HashCode不重写的话,会发生相同元素重复存储。
3、先判断HashCode(),再比较值是否相同,因为先判断两个元素的哈希值是否相同如果不同直接存入,如果相同的话才会用到equcls()方法
4、Comparable

Comparable 定义在 Person类的内部:

public class Persion implements Comparable {..比较Person的大小..},

因为已经实现了比较器,那么我们的Person现在是一个可以比较大小的对象了,它的比较功能和String完全一样,可以随时随地的拿来
比较大小,因为Person现在自身就是有大小之分的。Collections.sort(personList)可以得到正确的结果。

Comparator

Comparator 是定义在Person的外部的, 此时我们的Person类的结构不需要有任何变化,如

public class Person{ String name; int age },

然后我们另外定义一个比较器:

public PersonComparator implements Comparator() {..比较Person的大小..},

在PersonComparator里面实现了怎么比较两个Person的大小. 所以,用这种方法,当我们要对一个 personList进行排序的时候,
我们除了了要传递personList过去, 还需要把PersonComparator传递过去,因为怎么比较Person的大小是在PersonComparator
里面实现的, 如:

Collections.sort( personList , new PersonComparator() ).
comperable用的更多,因为比较容易修改
5、- 是JDK5中引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型
  它的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型。这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法、泛型接口
泛型的好处

- 把运行时期的问题提前到了编译期间
- 避免了强制类型转换


回复 使用道具 举报
1.        Set接口下的集合是如何保证无序不可重复的
HashSet集合:通过计算对象的hashcode的方法,如果hashCode()相同,则比较
Equals(),如果都相同,则去除重复的元素;
TreeSet集合:①在自定义类中实现Comparable接口,重写compareTo()方法,如果return 0,则去除重复元素②在创建对象时加入比较器Comparator,如果return 0,则去除重复元素。

2.        我们为什么要重写HashCode( )和equals()方法?
自定义类默认继承Object类,根据对象的地址值计算出HashCode(),并比较对象是否是同一对象;而实际开发中是根据对象的内容判断是对象是否是同一对象。

3.        数据在存入Set集合的时候,是先判断HashCode()还是先判断equals(),为什么?
先判断HashCode()再判断equals().因为Set底层源码,是通过先判断对象的hashCode()是否相同,如果相同,再比较对象的equals(),是否为true,如果为true,则去除该元素。

4.        Comparable和Comparator两个接口的区别,哪种接口使用的多,为什么
1)Comparable是自然排序,需要在类中实现接口,并且在类中重写方法;
Comparator是外部比较器,在创建对象时建立在参数列表中,并且在Comparator对象中重写comparaTo方法。
2)Comparator接口用的比较多,因为实现接口比较灵活。

5.        什么是泛型?使用泛型有什么好处?
1)泛型是定义类、方法、接口的时候指定的未知的数据类型。
2)好处:①将运行期的异常提前到编译期;避免了强制类型转换。
回复 使用道具 举报

今天我们继续了集合的学习,请根据自己的理解回答下面问题:

1.Set接口下的集合是如何保证无序不可重复的
答:通过重写hashcode方法、equals方法,本身算法算出的顺序

2.我们为什么要重写HashCode( )和equals()方法?
答:因为我们要保证元素的唯一性源码

3.数据在存入Set集合的时候,是先判断HashCode()还是先判断equals(),为什么?
答:先判断HashCode();
因为我们需要先判断哈希值是否相等,如果不相等存入该元素,如果相等,就去判断equals()

4.Comparable和Comparator两个接口的区别,哪种接口使用的多,为什么?
答:Comparable是自然排序属于内部比较;Comparator是比较器排序属于外部比较。

5.什么是泛型?使用泛型有什么好处?
答:将类型由原来的具体的类型参数化、然后调用/使用时传入具体的类型
好处:①把运行期的异常提前到编译时期
②避免了强制类型转换
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马