二.JAVA基础面试题:面向对象
1.面向对象和面向过程的区别
2.如何创建一个对象?对象实体和对象引用的区别?
3.对象相等和引用相等的区别
4.构造方法的作用是什么
5.一个类未声明构造方法,程序能否执行
6.构造方法的特点
7.类的封装,继承和多态
8.接口和抽象类的共同点和区别
9.深拷贝,浅拷贝和引用拷贝的区别
1.object类中的==和equals的区别
2.object类中的hascode的作用
3.object类中的equals和hascode结合使用
1.String类,Stringbuffer和StringBuilder的区别
2.String为什么不可变
3.字符串的拼接的三种方式的区别
4.字符串常量池的理解
4.String的intern方法理解?
二.JAVA基础面试题:面向对象
1.面向对象和面向过程的区别
- 面向对象:先抽象出对象,然后通过对象.方法完成问题。
- 面向过程:把解决问题拆分成一个一个方法
2.如何创建一个对象?对象实体和对象引用的区别?
- 通过new关键字创建对象,并且对象存储在堆内存中。
- 对象实体和对象引用
对象引用指向对象实体。
对象引用存储在栈内存中,对象实体存储在堆内存中。
对象引用可以指向一个对象实体。
对象实体可以有多个对象引用。
3.对象相等和引用相等的区别
- 对象相等:是对象在堆内存存储的地址是否相等。
- 引用相等:是引用指向具体的堆内存地址是否相等。
4.构造方法的作用是什么
- 构造方法主要是完成对象的初始化工作
5.一个类未声明构造方法,程序能否执行
- 可以执行,一个类未声明构造方法,JAVA会默认提供默认无参个构造器。
- 如果自己添加了构造器,那么JAVA则不会提供默认构造器
- 使用时要提供无参有参构造器
6.构造方法的特点
- 名字与类名相同
- 可以重载
- 无返回值
- 生成对象时自动调用
7.类的封装,继承和多态
- 封装性:把一个对象的信息隐藏在对象内部,不允许外部直接访问。
- 继承性:用已存在的类的定义为基础建立新的类。
子类拥有父类的全部结构,不能直接调用私有结构但是拥有。
子类可以对父类进行扩展。
子类可以重写父类的方法。 - 多态性:父类的引用指向子类的对象。
必须为子父类关系。
引用类型调用的方法必须为父类所有。(不一定执行)。
引用类型具体调用的方法在运行时确定。(子类重写后的方法)
8.接口和抽象类的共同点和区别
- 共同点
都有抽象方法。都可以有默认实现。都无法实例化。 - 区别
类继承一个类,实现多个接口。
抽象类的成员变量无限制,接口的成员变量默认修饰符为public static final
9.深拷贝,浅拷贝和引用拷贝的区别
- 引用拷贝:两个不同的引用指向同一个对象。
- 浅拷贝:
创建一个新对象。
对象内部的引用变量属性仍然为引用拷贝。 - 深拷贝:
创建一个新对象。
对象内部的引用变量属性仍然为新创建的对象。 - 实现
实现Cloneable接口。重写clone方法。
深拷贝内部成员变量也实现,浅拷贝内部成员变量不用实现。
1.object类中的==和equals的区别
- ==
基本类型:值
引用类型:地址值 - equals
基本类型:无法使用
引用类型:未重写的则是==,重写后一般比较属性值。
2.object类中的hascode的作用
- 类无散列结构则hascode无作用
- 类由散列结构则hascode获取哈希码,确定在哈希表中的位置
3.object类中的equals和hascode结合使用
- ①类无散列表结构
equals和hascode无关 - ②类有散列表结构
equals相等,则hascode一定相等。
hascode相等,equals不一定相等。 - ③过程:
hascode先确定索引位置,位置有值时则用equals来比较值是否相等。
1.String类,Stringbuffer和StringBuilder的区别
- String 不可变 线程安全 性能较差
- StringBuffer 可变 线程安全 性能较差
- StringBuilder 可变 线程不安全 性能较好
- 少量数据:用String
单线程且大量使用数据:用StringBuilder
多线程且大量使用数据:用StringBuffer
2.String为什么不可变
- 保存字符串的数组被final修饰且私有化
- string类未提供修改字符串的方法
3.字符串的拼接的三种方式的区别
- “+”
本质为 new StrinrgBuilder . append . append .toString - StringBuilder.append
- String,concat
每次产生新的String对象(用数组拼接) - 多次拼接时应该使用第二种,生成的对象最少
4.字符串常量池的理解
- ①方法区中有专门存放字符串的常量池
- ②String a = “abc”
在常量池中生成了abc字符串,然后引用变量a直接赋值为常量池中的地址 - ②String b = new String(“abc”)
若常量池已有abc,在堆中生成String对象,然后value指向常量池
若常量池没有abc,则先在常量池生成abc,再最后用value指向常量池
4.String的intern方法理解?
- ①String a = “a” + “b”
编译期常量会直接合并,故a指向常量池 - ②String b = “a” + a
生成StringBuilder对象后生成String对象,value指向常量池 - ③String c = (“abc” + a).intern()
此时c由value指向常量池直接转化c直接指向常量池