1.Set接口下的集合是如何保证无序不可重复的?
答: Set集合是按照hash表的遍历去找的,把数据存放在固定位置,hash表是用算法把不同的数据按照规则放在对应的地址,哈希表是无序的,也就是第一个放进去的值它是在最后才读取出来的,也就是先进后出,后进先出的是没有顺序的,保证了无序,,
当向Set集合存入数据时,会根据对象的哈希值计算存储位置,如果当前位置没有元素则直接存入,存入的元素会和集合里的元素做比较,会先比较hashCode()的哈希值,如果不同那么,就会认为这是两个不同的数据就会直接加入,如果hashCode()的值相同,接着就会调用equals()方法做比较,如果相同就会判定为同一个数据,否则就是两个数据(当hashCode()的值不同就不会调用equals()方法)前提是要重写HashCode( )和equals()方法.
2.我们为什么要重写HashCode( )和equals()方法?
答: 重写HashCode( )和equals()方法,是为了确保不会存入两个相同的数据,当存入数据时会先调用hashCode()方法获取哈希值,再与存入的下一个数据进行比较如果不同则存入数据, 当哈希值相同时会再调用equals()方法,进行比较 如果这两个方法与存入的数据比较,结果都相等的话,则判定为是同一个元素,便不会存入集合中.
3.数据在存入Set集合的时候,是先判断HashCode()还是先判断equals(),为什么?
答:往Set中存储元素,一定要重写hashCode方法和equals()方法,重写了两个方法之后,会优先获取对象的哈希值参与计算是否相同,相同则在调用 equals方法,减少了equals()方法的使用次数,不重写光使用equals方法比较内容,在元素多的情况下使用equals()方法进行比较,执行效率极低,例如集合中已经有10000多个元素,那么第10001个数据存入集合时,就需要调用10000次equals()方法,大大降低了效率..如果光使用一个方法就不能实现Set集合的共性特点,(不允许出现重复元素),两个方法配合使用,确保了存入数据的唯一性.
4.Comparable和Comparator两个接口的区别,哪种接口使用的多,为什么?
答: 用Comparable比较简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码, 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比较大小, 并且在Comparator里面可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复步骤,例如想按名字同时又按年龄排序,这种情况我们用 Comparable无法同时满足两种情况,那么我们就需要 Comparator接口,Comparable接口里面的方法只需要1个参数,因为另一个参数就是这个 A 类实例自己,而Comparator需要2个参数,它是第三方比较器,接收2个参数。Comparator使用的比较多
5.什么是泛型?使用泛型有什么好处?
答:泛型是JDK-5 之后引入的新特性,有泛型类、泛型接口、泛型方法三种.,他的本质类型是参数化类型,就是将原本具体的类型参数化,在调用的时候传入具体类型,泛型可以自定义类型为26个大写英文字母,返回值类型为调用的自定义类型.常用的为(T,E,K,V)..
使用泛型有三大好处 :
1 能够把运行期间出现的异常提前到编译期,就可以节省调试程序的时间,这样编译错误可以比较容易和快速地被发现和修复.
2 避免了强制类型转换,
3 可以做到只编写一份代码,这份代码的参数和返回值类型都是可变的,提高代码的复用性
|