java基础知识(三)
1.21 说一说hashCode()和equals()的关系
hashCode用于获取哈希值,equal用于确定两个对象是否相等
- 如果两个对象相等,则他们必须拥有相同的哈希值
- 两个对象哈希值相等,则他们未必相等
1.22 为什么要重写hashCode()和equals()?
- Object类提供的equals()方法默认是用==进行比较,但在实际业务中,通常是要两个对象内容相同则相同,所以要重写
- equal()重写了,则hashcode()必须重写。
1.23 ==和equals()有什么区别?
==运算符:
- 对于基本数据类型,比较其值大小
- 对于引用数据类型,则比较两个对象的内存地址
equals():
- 没有重写前默认是==运算符,比较两个对象的内存地址
- 重写后通常是比较两个对象内容,内容相等则相等
1.24 String类有哪些方法?
- charAt() 获取指定字符索引
- indexOf() 获取索取指定索引字符
- subString(int beginIndex, int endIndex)获取指定位置子字符串
- String toUpperCase():将此字符串中所有的字符大写;
- String toLowerCase():将此字符串中所有的字符小写;
1.25 String可以被继承吗?
String类有final修饰,不可被继承
因为要保证String类不可变,所以用final修饰,如果可以继承的话就可能存在子类方法修改字符串的值,字符常量池就没有存在的意义了
1.26 说一说String和StringBuffer有什么区别
- String是一个不可变类型的类,一旦对象创建好之后,只到对象销毁其字符串序列都不会变
- StringBuffer是一个字符可变类型,内部有许多操作字符串的API,最终可以转换为String
1.27 说一说StringBuffer和StringBuilder有什么区别
- StringBuffer和StringBuilder都是字符可变的
- StringBuffer和StringBuilder有共同的父类AbstractStringBuilder,常用API差不多
- StringBuffer是线程安全的,StringBuilder是线程不安全的
- 要创建可变字符串,建议使用StringBuilder
1.28 使用字符串时,new和""推荐使用哪种方式?
- “hello”会在常量池保存一个hello的字符串,由JVM管理
- new String(“hello”)的话首先会在常量池保存,然后再创建一个String对象
- new方法会多创建一个对象
1.29 说一说你对字符串拼接的理解
- +运算符适合字符直接量的拼接,java会有编译器优化和完整的字符串一样
- StringBuilder适合线程不安全,字符串包含变量,性能较高
- StringBuffer适合线程安全,字符包含变量
1.30 两个字符串相加的底层是如何实现的?
- 如果是字符串直接量相加的话,编译器会将其优化为一个完整的字符串
- 如果拼接的字符串中包含变量,则在编译时编译器采用StringBuilder对其进行优化,即自动创建StringBuilder实例并调用其append()方法,将这些字符串拼接在一起。
1.31 String a = "abc"; ,说一下这个过程会创建什么,放在哪里?
- JVM会使用常量池管理字符串,这个过程首先会检查常量池中存不存在abc,如果存在则直接复用常量池中已有的abc,不存在则将abc放入常量池
1.32 new String("abc") 是去了哪里,仅仅是在堆里面吗?
JVM首先将abc放入字符串常量池,然后再在堆内存创建一个String对象,对象中的数据引用常量池的直接量
1.33 接口和抽象类有什么区别?
接口体现的是一种规范,而抽象类体现的是一种模板式设计
- 接口和抽象类都不能实例化,他们都位于继承树的顶端,用于被其他类实现或继承
- 接口和抽象类都可以包含抽象方法,其实现类或者子类都必须实现这些抽象方法
- 一个类最多只能继承一个父类,包括抽象类,而一个类可以实现多个接口
- 接口里不包含构造器;抽象类里可以包含构造器。抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
1.34 接口中可以有构造函数吗?
由于接口定义的是一种规范,因此接口里不能包含构造器和初始化块定义。
1.35 谈谈你对面向接口编程的理解
接口体现的是一种规范和实现分离的设计,充分利用接口可以降低程序各模块间的耦合,从而提高程序的扩展性和可维护性

浙公网安备 33010602011771号