java开发⾯试题(40个常问⾯试题含答案,亲测有效)
1.连接数据库的配置和操作
加载JDBC驱动程序
提供JDBC连接的URL
创建数据库的连接
需要向java.sql.DriverManager请求并获得Connection对象
创建⼀个Statement对象
执⾏SQL语句
关闭JDBC对象
2.创建对象的四种⽅式?
1.使⽤new关键字创建对象
2.通过反射的⽅式
3.通过clone的⽅式
j4.通过反序列化的⽅式
3.接⼝与抽象类的区别?
⼀个类只能继承⼀个抽象类,但可以实现多个接⼝
抽象类可以有构造器,但接⼝不能有构造器
抽象类中可以包含⾮抽象的普通⽅法,接⼝中的所有⽅法必须都是抽象的
抽象类中的抽象⽅法的访问类型可以是public,protected和默认类型,但接⼝中的抽象⽅法只能是public类型的
抽象类中的变量的访问类型可以任意,但接⼝中定义的变量只能是public static final类型
4.==与equals的区别?
基本数据类型:⽐较的值是否相等;
引⽤数据类型:如String,==⽐较的是引⽤是否指向同⼀块内存;euqals被重写了,⽐较的是引⽤指向内存中的值是否相等
5.String、StringBuffer和StringBuilder的区别?
String ⼤⼩固定,不可变
StringBuffer ⼤⼩可变,线程安全(有锁),同步,效率低,适⽤于多线程,低并发
StringBuilder ⼤⼩可变,线程不安全(⽆锁),不同步,效率⾼,适⽤于单线程,⾼并发
6.List问题汇总
ArrayList 底层数组,在查元素的时候效率⾼(每个元素都有对应的索引),线程⾮安全,不同步
LinkedList 基于双向链表,在插⼊和删除元素的时候效率⾼(链表不需要内存移位)线程⾮安全,不同步
Vector 线程安全,同步,操作与ArrayList类似
7.HashMap和HashTable的区别?
(1)hashMap同步,hashTable不同步,都⾮安全
(2)hashTable的key和value都不允许null,hashMap允许
(3)HashTable使⽤Enumeration进⾏遍历,HashMap使⽤Iterator进⾏遍历
(4)HashTable直接使⽤对象的hashCode,hashmap重新计算hash值
8.介绍泛型
泛型:数据类型参数化
泛型类:类名{}
泛型接⼝:接⼝名{}
泛型⽅法:访问修饰符 返回值类型 ⽅法名称(){}
<?>不确定的数据类型,是实参
受限泛型<? extends E>,只能填写E或者E的⼦类,确定上限
<? super E>,只能填写E或者E的⽗类,确定下限
泛型擦拭:.java–>.class,泛型会被消除掉,这个过程叫做泛型擦拭。(JVM不认识泛型)
泛型的作⽤:1.提⾼java程序的类型安全 2.消除强制类型转换 3.提⾼了代码的复⽤性
9.Throw和Throws的区别?
Throw ⽤来抛出⼀个具体的异常类型。
Throws ⽤来声明⼀个⽅法可能产⽣的所有异常,不做任何处理⽽是将异常往上传,谁调⽤就抛给谁。
10.进程和线程的区别?
进程是系统进⾏资源分配和调度的最⼩单位
线程是CPU调度和分派的基本单位
⼀个进程包含⼀个或多个线程
进程在执⾏过程中拥有独⽴的内存单元,⽽多个线程共享内存
线程执⾏开销⼩,但不利于资源的管理和保护;进程则相反
线程有6种状态:新建,运⾏(可运⾏),阻塞,等待,计时等待和终⽌。
11.创建线程的四种⽅式?
继承Thread类,重写run⽅法
实现Runnable接⼝
实现Callable接⼝
12.Callable和Runnable的区别:
Runnable接⼝不会返回结果和抛出异常,Callable接⼝可以返回结果和抛出异常。
通过线程池来创建线程
13.sleep和wait的区别?
sleep()⽅法是Thread类的静态⽅法,⽽wait()⽅法是object类的⽅法
调⽤sleep()⽅法并不会释放锁。⽽wait()⽅法会
wait()⽅法必须放在同步⽅法和同步块中使⽤,sleep()⽅法则可以放在任何地⽅使⽤。
sleep()⽅法必须捕获异常,⽽wait()不需要捕获异常
14.synchronized 底层实现原理?
⽅法和代码块被synchronized修饰后,同⼀时刻只有⼀个⽅法可以进⼊到临界区
synchronized会阻⽌其它线程获取当前对象的监控锁,这样synchronized修饰的代码块就⽆法被其它线程访问,也就⽆法并发执⾏synchronized还会保证所有操作结果都会直接刷到主存中,从⽽保证了内存可见性
15.volatile底层实现原理?
volatile只能修饰变量,不能修饰⽅法和代码块
volatile保证可见性
使⽤volatile之后,变量在被修改后可以⽴即同步到主内存,变量每次在使⽤之前都从主内存拷贝。所
以其他线程可以⽴马看到变量的更新
volatile保证有序性。volatile可以禁⽌指令重排,CPU会严格按照代码顺序执⾏。
volatile不能保证原⼦性
原⼦性是指⼀个操作是不可中断的,要全部执⾏完成,要不就都不执⾏
CPU有时间⽚的概念,当⼀个线程时间⽚耗尽之后,就会失去CPU使⽤权。所以在多线程场景下,由于时间⽚在线程间轮换,就会发⽣原⼦性问题。
16.线性安全的
Vector:只要是关键性的操作,⽅法前⾯都加了synchronized关键字,来保证线程的安全性
Hashtable:使⽤了synchronized关键字,所以相较于Hashmap是线程安全的。
ConcurrentHashMap:使⽤锁分段技术确保线性安全,是⼀种⾼效但是线程安全的集合。
Stack:栈,也是线程安全的,继承于Vector。
17.线性不安全的
Hashmap
Arraylist
LinkedList
HashSet
TreeSet
TreeMap
18.Synchronized和Lock的区别?
Synchronized是关键字,Lock是接⼝。
Synchronized会⾃动释放锁。Lock异常时不会⾃动释放锁,所以需要在finally中释放锁。
Synchronized是⾮中断锁,必须等待线程执⾏完成释放锁,Lock是可中断锁。
Synchronized在竞争不激烈的情况下性能更好。Lock功能更强⼤灵活,竞争激烈时性能较好
19.实现线程同步的⽅式?
1.使⽤Synchronized关键字修饰的同步⽅法⽅法或同步代码块实现线程同步
2.使⽤volitile关键字修饰的特殊域变量实现线程同步
3.使⽤重⼊锁实现线程同步
4.使⽤局部变量实现线程同步
20.Sql优化
查询使⽤适当的索引
避免空判断语句
避免左侧模糊查询
避免使⽤in ⽤exists代替
避免使⽤or 和 不等于条件查询
避免在 where ⼦句中对字段进⾏表达式操作和函数操作
尽可能的使⽤ varchar 代替 char
避免使⽤"*"返回所有,可以⽤具体的字段代替
上述会导致数据库引擎放弃索引进⾏全表扫描
21.什么是索引及其类型与种类?
索引是表的⽬录,是数据库中专门⽤于帮助⽤户快速查询数据的⼀种数据结构(就像新华字典的⽬录⼀样)类型:BTREE、RTREE、HASH、FULLTEXT
种类:普通索引、唯⼀索引、主键索引、全⽂索引、组合索引
哪些情况适合使⽤索引?
数据量较⼤的表、
经常查询的字段、
主键和做外键的字段、
经常与其他表连接的表中连接字段、
经常做排序的字段、
经常⽤在where⼦句、order by、group by的字段
22.哪些情况不适合使⽤索引?
查询很少使⽤的情况不适合建⽴索引;
经常增、删、改的字段不适合建⽴索引;
当数据过少的时候不适合建⽴索引;
定义为text, image和bit数据类型的列不适合建⽴索引
23.聚集索引和⾮聚集索引的区别?
聚集索引⼀个表只能有⼀个,⽽⾮聚集索引⼀个表可以存在多个
聚集索引存储记录是物理上连续存在,⽽⾮聚集索引是逻辑上的连续
聚集索引物理存储按照索引排序,⽽⾮聚集索引物理存储不按照索引排序
24.什么是事务及其属性?
事务包含⼀个或多个操作,这些操作如果都成功就全部提交;如果有⼀条失败,则全部回滚
事务的属性:
原⼦性:事务开始后的所有操作要么全部执⾏,要么全部回滚
⼀致性:事务开始前和结束后,数据库的完整性没有被破坏,数据处于⼀致状态
隔离性:并发的不同事务之间不能互相⼲扰
隔离级别:读未提交、读已提交、可重复读、串⾏化
持久性:事务提交后,对数据库的改变是永久的
25.事务的并发问题?
脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
不可重复读 :事务 A 多次读取同⼀数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同⼀数据时,结果不⼀致
幻读 :事务A将数据库分数改为等级,事务B在此期间插⼊⼀条分数数据,插⼊的这条数据没有改过来
乐观锁和悲观锁
悲观锁:在操作数据之前把数据锁住,然后再对数据读写,在释放锁之前其他不能对该数据进⾏操作
乐观锁:在操作数据时不会对操作的数据进⾏加锁,只有到数据提交的时候才通过⼀种机制来验证数据是否存在冲突(⼀般实现⽅式是通过加版本号然后进⾏版本号的对⽐⽅式实现)
26.TCP和UDP的区别?
TCP是基于连接的可靠的传输协议,UDP是基于⼴播的不可靠的传输协议.
TCP保证数据的正确性,同时保证数据的顺序,UDP有可能丢包,同时不保证数据的顺序
TCP是⾯向字节流的,他把数据看成⼀串⽆结构的⼆进制数据,UDP是通过报⽂传递数据的
TCP是点对点连接的,只能是⼀对⼀的,UDP可以是⼀对⼀的,⼀对多的,多对⼀的,多对多的
27.GET提交和POST提交的区别?
GET将表单数据追加在提交地址的后⾯进⾏提交,提交速度快,提交的数据有⼤⼩的限制
POST将表单数据作为⼀个整体的数据块进⾏提交,提交速度慢,提交的数据⼤⼩没有限制
28.重定向和转发的区别?
重定向:重新发起⼀次新的请求/响应来完成页⾯的跳转,不能带数据,浏览器的URL会发⽣变化
转发:使⽤现有的请求/响应来完成页⾯的跳转,可以带数据,浏览器的URL不会发⽣变化
常⽤的选择器
id选择器、元素选择器、类选择器、后代选择器、⼦元素选择器、兄弟选择器
29.常见错误代码及含义?
400 错误请求
403 禁⽌访问
404 ⽆法到⽂件
408 请求超时
500 服务器错误
30.JSP九⼤内置对象、七⼤动作与三⼤指令?
内置对象:request、response、session、application、out、page、pageContext、config和exception
动作:jsp:include、jsp:useBean 、jsp:setProperty、jsp:getProperty、jsp:forward、jsp:plugin、jsp:param
指令:Page指令、include指令、taglib指令
排序算法
n:数据规模;k:"桶"的个数;In-place:占⽤常数内存,不占⽤额外内存;Out-place:占⽤额外内存;
1.冒泡排序
2.选择排序
3.插⼊排序
4.希尔排序
5.归并排序
6.快速排序
7.堆排序
8.计数排序
9.桶排序
10.基数排序
JVM GC回收机制
HashMap的底层及扩容机制?
31.Spring
介绍及优点:
Spring⼀个轻量级的Java 开发框架,Spring的核⼼是控制反转(IoC)和⾯向切⾯(AOP)
1.⽅便解耦,简化开发 (⾼内聚低耦合)
Spring就是⼀个⼤⼯⼚(容器),可以将所有对象的创建和依赖关系,交给Spring容器管理
2.⽀持AOP
Spring提供⾯向切⾯编程,可以⽅便的实现对程序进⾏权限拦截、运⾏监控等功能
3.⽅便集成各种优秀框架
Spring不排斥各种优秀的开源框架
32.IOC:
Spring作为容器,负责⽣成bean的实例和对bean的依赖注⼊
三种注⼊⽅法:
构造⽅法注⼊、setter⽅法注⼊、注解注⼊
33.AOP:
Aop是⾯向切⾯编程,是通过动态代理的⽅式,
在不改变原有代码的情况下对类的功能进⾏⽆限的增强
主要的功能有:添加⽇志,事务,权限
特点是:降低模块间的耦合度、提⾼可维护性
34.SpringMVC
介绍springMVC,说⼀下优点
springmvc是⼀个基于MVC的轻量级Web框架,能够完成前后台的交互
Model 业务层 = Service层 + Dao层
View 显⽰层 表现层 前台的页⾯表现(jsp页⾯)
Controller层 控制层 前台页⾯与后台代码之间的数据的交互(Servlet)
优点:耦合性低、与Spring框架集成、简化JSP开发、⽀持Restful风格
35.MyBatis
介绍MyBatis
ORM框架 DAO层
对象关系映射框架,以⾯对对象的⽅式完成对数据库的操作
类 --> 表
java面试八股文属性 --> 字段
实例 --> 记录
MyBatis中#和KaTeX parse error: Expected 'EOF', got '#' at position 5: 区别? #{}是预编译处理,防⽌SQL注…{}是字符串替换。
36.注解
注解是说明程序的,给计算机看的。JDk 1.5之后的新特性,可以声明在包、类、字段、⽅法、局部变量、⽅法参数等前⾯,⽤来对这些元素进⾏说明、注释
作⽤:安全性考虑 减少内存泄露 减少程序员⼯作量。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论