java面试常见问题

1.JVM基本概念
JVM是可运行Java代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆 和 一个存储方法域。JVM是运行在操作系统之上的,它与硬件没有直接的交互。
运行过程:我们都知道Java源文件,通过编译器,能够生产相应的.Class文件,也就是字节码文件,而字节码文件又通过Java虚拟机中的解释器,编译成特定机器上的机器码 。

2.数组与链表的优缺点和区别?
数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。
链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起,每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针。如果要访问链表中一个元素,需要从第一个元素始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。
链表和数组的本质差异
1 在访问方式上
数组可以随机访问其中的元素
链表则必须是顺序访问,不能随机访问
2 空间的使用上
链表可以随意扩大
数组则不能

3.重写和重载的区别?
重载:在同一类中。方法名相同,参数列表不同。重载可以改变返回类型。
重写:在不同类中(子父类中),方法声明相同(返回类型,方法名,参数列表均相同)。
重写需要注意:
**子类方法的访问权限要大于等于父类方法的访问权限。
**静态只能重写静态。但是这种情况一般不会出现。

4.接口和抽象类的区别?
接口里只能包含抽象方法,静态方法和默认方法,不能为普通方法提供方法实现,抽象类则完全可以包含普通方法。
接口里只能定义静态常量,不能定义普通成员变量,抽象类里则既可以定义普通成员变量,也可以定义静态常量。
接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
接口里不能包含初始化块,但抽象类里完全可以包含初始化块。
一个类最多只能有一个直接父类,包括抽象类,但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承不足。

5.如何解决高并发和高负载
Html页面静态化,图片服务器分离,数据库集群和库表散列,redis缓存,镜像,Nginx负载均衡。

6.Java设计模式:单例模式,工厂方法模式,抽象工厂模式,适配器模式,代理模式,观察者模式等等…
单例模式:分为懒汉式和饿汉式,饿汉式单例在类别加载时就实例化一个对象交给自己的引用,懒汉式只有在真正使用时才会实例化一个对象交给自己的引用。

7.垃圾回收机制:理论上java有垃圾回收机制不存在内存泄漏的问题,实际开发中存在无用但无法回收的对象,比如session一级缓存中的持久态对象可能存在无用的,但是无法回收
为什么有垃圾回收机制:安全性考虑,减少内存泄漏,减少程序员工作,主要回收的是jvm中的方法区和堆中的内存

8.内存溢出 常见原因:内存中加载的数据量过大,如一次性从数据库取出过多的数据 代码中存在死循环 第三方软件的bug 启动参数内存值设定的过小
解决方法:修改启动参数,增加内存 对代码进行检查分析,找出可能导致内存溢出的地方 检查错误日志

9.连接池的机制
从连接池获取连接或创建连接 使用完毕把连接还给连接池 在系统关闭前断开所有连接释放内存 处理无效连接。

10.HTTP常见状态码
200请求成功 301请求的URL已移走 302重定向 400客户端请求语法有误 401请求未授权 403服务器收到请求但拒绝提供服务 404请求资源不存在 500服务器发生不可预期的错误 503服务器当前不能处理客户端的请求,过一段时间可能恢复

11.Get和post的区别
地址栏不同 get有上传大小限制 post的安全性高

12.转发和重定向
转发是服务器行为,重定向是客户端行为 重定向:两次请求 地址栏会变 传输的数据不会丢失 转发一次请求,地址栏不变,传输的数据会丢失
13.Session与cookie的区别
session是存在服务器端的,cookie存在客户端 无论客户端怎样设置,session都能正常工作,当客户端禁用cookie时就无法使用cookie session能储存任意java对象,cookie只能存储string对象

14.单点登录的原理
后端生成一个session ID保存进cookie,后面的所有请求浏览器都会带上cookie,然后服务器从cookie中取得sessionID再查询客户信息。可以使用CAS实现分布式的单点登录。

15.Jsp和Servlet的区别
jsp本质上就是一个Servlet,是一种特殊形式,
Servlet是用于开发web服务器应用程序的一个组件,运行在客户端,由Servlet容器管理,用来生成动态内容 区别:jsp是html页面中内嵌的java代码,侧重页面显示,Servlet是html和java代码分离,侧重逻辑控制。
16.Xml常见的两种解析器 Dom和SAX。

17.Ajax是创建页面交互式的网页开发技术 优势:实现页面异步刷新,提高用户体验 优化了浏览器和服务器间的传输,减少不必要的数据往返

18.异常的分类
编译时异常 运行时异常 error虚拟机相关的问题

19.常见的异常
java.lang.NullPointerException 空指针异常
java.lang.ClassNotFoundException 指定的类找不到
java.lang.NumberFormatException 字符串转换为数字异常
java.lang.IndexOutOfBoundsException 数组角标越界异常
java.lang.ClassCastException 数据类型转换异常
SQLException SQL 异常,常见于操作数据库时的 SQL 语句错误。
java.lang.ClassCastException 数据类型转换异常。

20.String 、StringBuilder 、StringBuffer 的区别?
String 是只读字符串内容不能被改变 每次改变都是指向一个新的对象,原先的对象不变.
StringBuffer/StringBuilder 表示的字符串对象可以直接进行修改。方法完全相同
区别 StringBuilder 单线程环境下运行 不安全 速度最快
StringBuffer是线程安全的 速度较慢
String线程安全速度最慢
21.+号进行字符串连接比stringBuilder好?
实际上编译时+号会装换成stringBuilder 那么"+"和 StringBuilder 是完全等效的,但是资源消耗方面”+” 比StringBuilder 高,所以建议使用StringBuilder 。

22.String 是基本数据类型吗?
string是引用类型,底层用char数组实现.

23.String常用方法

24.请问 ArrayList、HashSet、HashMap 是线程安全的吗?
都是线程不安全的
Collections 工具类提供了相关的 API,可以让上面那 3 个不安全的集合变为安全的。 Collections.synchronizedList(list) Collections.synchronizedMap(map)
Collections.synchronizedSet(set).

25.ArrayList 内部用什么实现的?
object[]实现

26.List 和 Map、Set 的区别
List和set是储存单列数据的集合,Map是储存健和值这样的双列数据的集合 List中存储的数据时有顺序有索引并且允许重复,Map存储的数据时没有顺序,建不能重复的,值可以重复 Set中存储的数据时无序的且不能重复 ,当元素在集合中的顺序由hashcode决定,位置是固定的。

27.线程创建方法
继承Thread类和实现Runnable接口

28.线程中wait和sleep的不同
wait等待时会释放锁 sleep一直持有锁 wait通常用于线程间交互,sleep 通常被用于暂停执行

29.什么是线程池
线程池就是实现把多个线程放入到一个容器中,用的时候可以笔直去池中拿线程即可,节省了开辟子线程的时间,提高了效率.
好处:降低资源消耗,提高响应速度,提高线程的可管理性。

30.什么是死锁
指多个线程因竞争资源而造成一种僵局(互相等待),若无外力介入,这些进程都无法前进.
产生死锁的必要条件 互斥条件:线程要求对所分配的资源进行排他性控制,在某一段时间内资源仅为一个线程所占用,此时如果有其他资源请求该资源只能等待.
不剥夺条件:线程所获得的资源在使用完毕之前,不能被其他线程夺走.
请求和保持条件:线程已经保持了一个资源,但又提出请求新资源,而该资源被其他线程占用,此时请求被阻塞,但对自己已获得的资源保持不放.
循环等待条件:存在一种线程资源的循环等待链,链中的每一个线程所获得的资源同时被链中的下一个资源所请求.
如何避免死锁? 加锁顺序,线程按照一定的顺序加锁 加锁时限,线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁

31.线程与进程的区别
进程是具有一定独立能力的程序关于某个数据集合上的一次运动活动,是操作系统进行资源分配和调度的一个独立单位
线程是进程的一个实体,是cpu调度和分派的基本单位,是比进程更小的可以独立运行的基本单位 区别:线程的划分尺度小于进程,这使多线程程序拥有高并发性,进程在运行时各自内存单元相互独立,线程之间内存共享,这使多线程编程可以拥有更好的性能和用户体验。

32.同步线程级线程调度的相关方法
Wait():使一个线程处于等待状态,并且释放所持有对象的锁。
Sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法。
Notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由jvm确定唤醒哪一个线程,而且与优先级有关。
NotifyAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让他们竞争,只有获得锁的线程才能进入就绪状态。

33.Run()与start()的区别
start是启动线程的办法,使线程所代表的虚拟处理机处于可运行状态,可以由jvm调度执行,这并不意味着线程就会立即执行。
Run()是线程启动后要进行回调的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值