Java SE基础(2)
一、hashcode和equals如何使用
- equals()源自于java.lang.object,该方法用来简单验证两个对象的相等性。object类中定义的默认实现只检查两个对象的对象引用,以验证它们的相等性。通过重写该方法可以自定义验证对象相等新的规则,如果你使用ORM处理一些对象的话,你要确保在hashCode()和equals()对象中使用getter和setter而不是直接引用成员变量
- hashCode()源自于java.lang.bject ,该方法用于获取给定对象的唯一的整数(散列码)。当这个对象需要存储在哈希表这样的数据结构时,这个整数用于确定桶的位置。默认情况下,对象的hashCodel)方法返回对象所在内存地址的整数表示。hashCode()是HashTable,HashMap和HashSet使用的。默认的,object类的hashCode()方法返回这个对象存储的内存地址的编号。
- hash散列算法,使得在hash表中查找一个记录速度变(1).每个记录都有自己的hashcode,散列算法按照hashcode把记录放置在合适的位置.在查找一个记录,首先先通过hashcode快速定位记录的位置.然后再通过equals来比较是否相等。如果hashcode没找到,则不equal,元素不存在于哈希表中;即使找到了,也只需执行hashcode相同的几个元素的equal,如果不equal还是不存在哈希表中。
二、Java中==和equals有哪些区别
- equals和==最大的区别是一个是方法一个是运算符。
- ==∶如果比较的对象是基本数据类型,则比较的是数值是否相等;如果比较的是引用数据类型,则比较的是对象的地址值是否相等。
- equals():用来比较方法两个对象的内容是否相等。
- 注意: equals方法不能用于基本数据类型的变量,如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址。
三、Java中的异常处理机制是什么?

- Java通过面向对象的方法进行异常处理,一旦方法抛出异常,系统自动根据该异常对象寻找合适异常处理器(Exception Handler)来处理该异常,把各种不同的异常进行分类,并提供了良好的接口。
- 在Java中,每个异常都是一个对象,它是Throwable类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。Java的异常处理是通过5个关键词来实现的: try、catch、throw、throws和finally。
- 在Java应用中,异常的处理机制分为声明异常,抛出异常和捕获异常。
- throw和throws的区别:
-
位置不同:
throw:方法内部
throws:方法的签名处,方法的声明处
-
内容不同:
throw+异常对象(检查异常,运行时异常)throws+异常的类型(可以多个类型,用拼接)
-
作用不同:
throw:异常出现的源头,制造异常。
throws:在方法的声明处,告诉方法的调用者,这个方法中可能会出现我声明的这些异常。然后调用者对这个异常进行处理:要么自己处理要么再继续向外抛出异常
四、Java中重写和重载有哪些区别
- 方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。
- 方法重载的规则:
- 方法名一致,参数列表中参数的顺序,类型,个数不同。
- 重载与方法的返回值无关,存在于父类和子类,同类中。
- 可以抛出不同的异常,可以有不同修饰符
- 方法重写的规则:
- 参数列表必须完全与被重写方法的一致,返回类型必须完全与被重写方法的返回类型一致。
- 构造方法不能被重写,声明为 final的方法不能被重写,声明为static的方法不能被重写,但是能够被再次声明。
- 访问权限不能比父类中被重写的方法的访问权限更低。
- 重写的方法能够抛出任何非强制异常(UncheckedException,也叫非运行时异常),无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强性异常,反之则可以。
五、String、StringBuffer、StringBuilder区别及使用场景
Java平台提供了两种类型的字符串: String和StringBuffer(JDK1.0之后,线程安全,效率低)/StringBuilder(JDK1.5之后线程不安全,效率高),它们都可以储存和操作字符串,区别如下。
String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。初学者可能会有这样的误解:
string str = “abc";
str = “bcd”;
如上,字符串str明明是可以改变的呀!其实不然, str仅仅是一个引用对象,它指向一个字符串对象"abc"。第二行代码的含义是让str重新指向了一个新的字符串"bcd"对象,而"abc"对象并没有任何改变,只不过该对象已经成为一个不可及对象罢了。
StringBuffer/StringBuilder表示的字符串对象可以直接进行修改,底层是数组,当一个数组不够时会进行数组扩容。
StringBuilder是Java5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方法都没有被synchronized修饰,因此它的效率理论上也比StringBuffer要高。
六、怎样声明一个类不会被继承,什么场景下会用
如果一个类被final修饰,此类不可以有子类,不能被其它类继承,如果一个中的所有方法都没有重写的需要,当前类没有子类也罢,就可以使用final修饰类,例如Math类用的final修饰。
七、自定义异常在生产中如何应用
Java虽然提供了丰富的异常处理类,但是在项目中还会经常使用自定义异常,其主要原因是Java提供的异常类在某些情况下还是不能满足实际需求。例如以下情况:
- 系统中有些错误是符合Java语法,但不符合业务逻辑。
- 在分层的软件结构中,通常是在表现层统一对系统其他层次的异常进行捕获处理。

浙公网安备 33010602011771号