Java基础面试题

Java面试题

1、String、StringBuffer、StringBuilder的区别?

​ String底层是使用final修饰的字节数组,所以String是不可变的字符串常量,每次对String进行操作的时候都会new一个新的对象,然后将指针指向这个新的对象;StringBuffer和StringBuilder都继承至AbstractStringBuilder,两者都是可变的,当操作时,不会产生新的对象,操作的是对象本身;Stringbuffer的每个方法都被sync关键字修饰,所以他是线程安全的,但是他的速度就要比stringBuilder慢一点,比String快;

2、int 和 Integer 的区别?

​ int属于八大基本数据类型之一,直接存数值;

​ Integer 是 int的包装类 在jdk1.5之前需要手动装箱和拆箱,但是在1.5之后就是自动拆装箱;

​ int的默认值是0,而Integer的默认值为null;

3、==和equals的区别是什么?

​ == 如果比较的是基本数据类型,则比较他们的值是否相等;如果比较的是引用类型,则比较他们对象的地址是否相等;

​ equals通常比较的是两个对象的值是否相等,但是要重写hashcode方法和equals方法

4、jdk8的新特性

​ lambda表达式

​ 函数式接口

​ 方法引用

​ stream流,支持链式编程

​ 新日期类localDate

5、final关键字的作用

​ final可以修饰类、方法、属性;

​ final修饰的类是最终类,无法被继承;final修饰的方法是最终方法,无法被子类重写,但是可以被继承;final修饰的属性,如果修饰的是基本数据类型。那么数值一但初始化就不能改,如果修饰的是引用数据类型,初始化之后就不能指向另一个对象

6、什么是内存泄漏和内存溢出

​ 内存泄漏指的是程序在申请内存后,无法释放已经申请的空间,一次内存泄漏可以忽略,但是任其发展下去会导致内存溢出;(对流的操作要及时关闭或者数据库的链接等)

​ 内存溢出指的是程序申请内存时,没有足够的空间供其使用过(简而言之就是内存不够了)

7、抽象内和接口的区别是什么?

​ 抽象类必须使用abstract关键字修饰,子类必须实现抽象类中的抽象方法,如果不实现父类的抽象方法,那么子类也必须使用abstract修饰,抽象类默认使用public修饰,也可以使用protected修饰,如果定义为private修饰,那么子类无法继承;抽象类是不能够new对象的;抽象类中可以有抽象方法,也可以没有抽象方法;

​ 接口中只能定义公开抽象方法(默认public abstract)和公开静态常量(默认public static final);

​ 抽象类只能被继承一次,而接口可以多实现

8、error和exception的区别

​ error和exception都继承至throwable,在Java中只有throwable的实例才能抛出或者捕获,他是异常处理机制的基本组成类型

​ exception是程序正在运行时的异常,并且可能应该被捕获,进行相应的处理

​ error是指在正常情况下,不太可能出现的情况,绝大部分的error对导致系统处于非正常的、不可恢复的状态,既然是不正常的,那么也没有必要捕获处理了;

9、重写和重载的区别?

​ 重写:发生在继承的时候,子类和父类具有相同的方法,并且方法的返回值,参数以及参数的类型、顺序都是一样的;

​ 重载:一个类中具有方法名相同,参数类型、参数个数以及参数的顺序是不同的;

10、什么是Java反射?

​ Java反射是在运行状态中,可以获取任意类的所有属性和方法;

​ 通过class的字节码文件,我们可以获取类的所有属性,包括私有属性,可以为属性赋值,也可以调用类中的所有方法,当然也包括私有方法;

​ Java反射可以实现动态装配、动态代理等,但是过度使用反射会严重消耗系统资源;

11、事务控制在那一层?

​ 事务必须控制在service层,因为dao层的设计是按照单一原则设计的,一个类对应一张数据表,类中最好都是单表查询,增加代码的复用率。事务是具有隔离性的,在service层会调用dao层的多个方法进行业务的处理,如果事务在dao层,那么事务就被分开了,无法整体控制,将事务控制在service层,保证了一个业务,要么全部成功,要么全部失败;

12、cookie和session有什么联系?

​ cookie是客户端保存数据的一块空间,cookie中保存的数据有大小的限制,一般为4k,cookie没有session安全;

​ session是服务端保存数据的一块空间;

​ cookie和session的联系:当用户第一次访问网站的时候,cookie中没有数据,这个时候服务器就会产生一个session对象,session对象中有一个唯一的id叫做sessionId,这个id会被保存到客户端的cookie中。当用户第二次访问网站是,cookie中携带的sessionId就会被带到服务器中,服务器根据sessionId找到对象的session对象使用,如果服务器没有找到sessionId,这个时候服务器就会产生一个新的session对象,该对象的id再次写入cookie中保存;

13、一个线程两次调用start方法,会出现什么情况?

​ Java线程不允许启动两次的,第二次调用会抛出异常,这是一种运行时异常,多次调用start被认为是编程错误

14、final、finally、finalize有什么不同?

​ final修饰的类不可被继承,修饰的方法不能被子类重写,可以被继承,修饰的变量的值不可以改变;

​ finally保证Java的重点代码一定要执行,我们可以使用try-finally或者try-catch-finally,比如数据库的链接和流的关闭;

​ finalize是基类Object的一个方法,他的设计目的是保证对象在被垃圾回收前做特定资源的回收

15、强引用、软引用、弱引用、幻象引用有什么区别?

​ 强引用:就是最常见的普通对象,只要还有一个强引用指向这个对象,就代表这个对象还活着,垃圾回收器就不回去碰它,如果没有其他的引用关系,只要超过了引用的作用域范围或者显式的将引用赋值为null,就可以被垃圾回收器收集了;

​ 软引用:相对于强引用弱一些的引用,可以是对象豁免一些垃圾收集,只有当jvm认为内存不足时,才会试图回收软引用指向的对象,jvm会确保在抛出OutOfMemoryError之前,清理软引用指向的对象;

​ 弱引用:并不能豁免垃圾收集,仅仅是提供一种访问在弱引用状态下对象的途径,这就可以用来构建一种没有特定约束的关系;

​ 幻象引用:不能通过它访问对象,仅仅提供了一种确保对象被finalize之后,做某些事情的机制;

16、父子类的静态代码块,非静态代码块,构造方法执行顺序?

​ 父类的静态代码块---->子类的静态代码块---->父类的非静态代码块---->父类的构造方法---->子类的静态代码块---->子类的构造方法

17、如何实现对象的克隆?

​ 实现cloneable接口,重写其中的clone方法;

​ 实现序列化Serializable接口,通过对象的序列化和反序列化实现克隆,这个可以实现真正的深度克隆;

18、什么是Java序列化?如何实现序列化?

​ 序列化是一种处理对象流的机制,所谓对象流就是将对象的内容进行流化,可以对流化后的对象进去读写操作,还可以将对象传输与网络之间,序列化是为了解决对象在读写操作时引发的问题;

​ 实现序列化的类必须实现Serializable接口;

19、深拷贝和浅拷贝的区别?

​ 浅拷贝:复制对象的引用地址,拷贝出来的对象:如果修改的是基本数据类型,那么原对象基本数据类型的值不会变;如果修改的是引用数据类型,那么原来对象的值也会被改变;

​ 深拷贝:拷贝出来的对象:不管修改是基本数据类型还是引用类型,原对象的值都不会改变;

20、jsp和servlet有什么区别?

​ jsp编译之后就变成servlet,jsp的本质就是基于servlet实现的,jvm只能识别Java类,不能识别jsp代码,web容器将jsp编译成jvm能能识别的类;jsp擅长于前台页面的展示,servlet擅长于业务逻辑的处理;

21、说一下jsp的四种作用域?

​ jsp的作用域分为:page,request,session,application;

​ Page:与一个页面相关的对象和属性;

​ request:与一个请求相关的对象和属性。一个请求可能跨越多个页面;需要web支持;

​ session:代表一个用户与服务器建立连接的一次会话相关的对象和属性。需要web支持;

​ application:代表与整个web组件相关的对象和属性,包括了多个页面、请求、会话。需要web支持;

22、重定向和转发的区别?

​ 转发是发生在服务器内部的跳转,保存在request作用域的数据可以带入其他方法中,转发时地址栏中的地址不会发生改变;

​ 重定向是发生在客户端之间的跳转,地址栏中的地址会发生变化,重定向时无法携带数据到其他方法中;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZeroKing_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值