JDK 和 JRE 有什么区别?
JDK是java的开发工具包,包含各类类库,而且包含了JRE,javac是在JDK中的;
JRE是java程序的运行环境,安装过程当中自动添加PATHhtml
== 和 equals 的区别是什么?前端
两个对象的 hashCode()相同,则 equals()也必定为 true,对吗?
首先,两个对象equals相等,hashcode必定相等;可是hashcode相等时,equals不必定相等.
其次,两个不一样的对象,由于可能存在哈希碰撞,因此hashcode多是相等的,可是显然equals不为true.
还有就是,在object类中,euqals方法仍是用的==来判断的,==对于对象而言比较的是地址值,因此equals相等
hashcode必定同样,反之就不必定了.java
final 在 java 中有什么做用?
final关键字可做用于类,类属性和方法;
做用于类上时,该类不能被继承
做用于属性时,该属性不能被从新复制
做用于方法时,该方法不能被重写node
java 中的 Math.round(-1.5) 等于多少?
Math的round方法是四舍五入,若是参数是负数,则往大的数如,Math.round(-1.5)=-1mysql
String 属于基础的数据类型吗?
不是,String是一个类,是引用数据类型.web
java 中操做字符串都有哪些类?它们之间有什么区别?
有String,StringBuilder,StringBuffer面试
String str="i"与 String str=new String(“i”)同样吗?
他们的值相等,用equals获得true,可是他们是两个对象,若是用==判断返回false.
且str="i"是直接在常量池中引用字符串,而new String(“i”)是在堆中根据i再建立一个对象.正则表达式
如何将字符串反转?redis
StringBuilder sb = new StringBuilder("abc");
sb.reverse().toString();
12复制代码
public String reverseString(String str) {
if ((null == str) || str.length()<2) {
return str;
}
return reverseString(str.subString(1)) +str.charAt(0);
}
123456复制代码
String 类的经常使用方法都有那些?
charAt(int index)返回指定索引处的字符
length()返回字符串长度
split()根据给定的正则表达式拆分字符串
toString()返回此对象自己算法
抽象类必需要有抽象方法吗?
抽象类能够没有抽象方法,可是若是一个类已经声明为抽象类,那么它也不能再实例化,不能直接构造该类对象.
普通类和抽象类有哪些区别?
抽象类能使用 final 修饰吗?
不能,final修饰的类是不能被继承的,若是抽象类不能继承,就没有意义了.
接口和抽象类有什么区别?
java 中 IO 流分为几种?
大的方面来讲有两种:字节流和字符流
字节流继承于InputStream、OutputStream
字符流继承于Reader、Writer
BIO、NIO、AIO 有什么区别?
Files的经常使用方法都有哪些?
String getName():返回File对象所表示的文件名或文件路径
String getPath():返回File对象所对应的相对路径
boolean exists():判断File对象的文件或者目录是否存在
boolean isDirectory():判断File对象是不是目录
并行和并发有什么区别?
并行是多个事件同时进行,并发是多个事件在某一时间段内间隔发生.
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。
线程和进程的区别?
进程是操做系统资源分配的基本单位,线程是任务调度和执行的基本单位.
进程有独立的地址空间,一个进程崩溃后在保护模式下不会对其余进程产生影响,而线程只是一个进程中的
不一样执行路径,线程有本身的堆栈和局部变量.在操做系统中能同时运行多个进程,而在同一个进程内有多个
线程同时执行.
守护线程是什么?
守护线程是服务其余线程的,在java中,线程有两种:守护线程和用户线程.
java中的jvm垃圾回收线程就是一个典型的守护线程.当用户线程所有执行完,包括main线程也执行完毕,那么
jvm会自动退出,此时守护线程也就中止了.
建立线程有哪几种方式?
三种: 1. 继承Thread类,重写run方法,用子类实例调用start()方法;
2. 实现Runnable接口并重写run方法,建立Thread实例并传入Runnable实例,代用Thread的start()方法
3. 建立Callable接口的实现类,重写call方法;
构造此实现类的实例,将其做为参数构造一个FutureTask类的实例;
以FutureTask的实例为参数构造一个Thread对象执行start()方法.
第三种方式能够容许有返回值,也能够声明抛出异常类.
说一下 runnable 和 callable 有什么区别?
runnable方式时,多个线程间能够共享实例变量,callable方式则不行
runnable方式没有返回值,callable有返回值
runnable方式run方法的异常只能在内部消化,callable的call()方法容许抛出异常
线程有哪些状态?
sleep() 和 wait() 有什么区别?
notify()和 notifyAll()有什么区别?
notify()方法随机唤醒一个wait线程到锁池中去竞争锁,而notifyAll方法唤醒全部wait线程到锁池.
notity()方法可能产生死锁,notifyAll则不会.
线程的 run()和 start()有什么区别?
run()方法只是定义了线程的执行单元并不是直接开启了线程资源,只有start()方法被调用,才能够启动一个线程.
若是直接调用run方法,会被当成普通方法在main线程执行,并不会建立线程.
44.建立线程池有哪几种方式?
java中的Executors能够为咱们建立现成的线程池,有如下几种:
线程池中 submit()和 execute()方法有什么区别?
在 java 程序中怎么保证多线程的运行安全?
多线程锁的升级原理是什么?
在java中,锁有三种状态,级别从低到高依次为:偏向锁、轻量级锁、重量级锁,这几个状态会随着竞争状况逐渐升级,可是不能降级.
先说为何要有锁升级:由于synchronized是重量级锁,每次在进行锁请求时,若是当前资源被其余线程占有,就要将当前线程阻塞,加入到阻塞队列中而后
清空当前线程的缓存,等到锁释放时再经过notify或者notifyAll方法唤醒当前线程,让其处于就绪状态.在这个过程当中是很是消耗资源的,并且有时候线程刚挂起,锁就释放了.
而java的线程是映射到操做系统的原生线程之上的,每次线程的阻塞和唤醒都要在用户态和核心态之间转换,十分浪费资源.因此jvm对syncronized进行了优化,分为三种锁.
什么是死锁?
死锁是指两个或两个以上的进程或线程在执行过程当中,因争夺资源而形成的一种相互等待的过程,若是没有外力做用,他们讲没法推动下去.
怎么防止死锁?
ThreadLocal 是什么?有哪些使用场景?
也成为线程本地变量,ThreadLocal在每一个线程中对一个变量建立了一个副本,且在线程内部任何地方均可以使用,线程间互不影响.
应用场景:spring的声明式事物管理.
说一下 synchronized 底层实现原理?
首先,每一个对象都有一个监视器锁(monitor),当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的全部权,过程以下:
synchronized 和 volatile 的区别是什么?
synchronized 和 Lock 有什么区别?
synchronized 和 ReentrantLock 区别是什么?
说一下 atomic 的原理?
atomic包用中的类能够实现多线程环境下的变量操做,底层是调用CPU的CAS指令来进实现线程安全的.
CAS,比较并操做,每次在set前,对比一下当前值和预期值是否同样,同样则set,不然认为失败,循环对比直到成功.
throw 和 throws 的区别?
throws:用来声明一个方法可能抛出的全部异常信息,不会处理异常,只是将异常向上传,交给调用者
throw:抛出一个具体的异常类型.
throws出如今方法声头,而throw出如今函数体
throws表示出现异常的可能,并不必定会发生,throw则是抛出了一个存在的异常实例.
final、finally、finalize 有什么区别?
final: 修饰类,表示该类不可继承
修饰方法,表示该方法不可重写
修饰变量,表示该变量不容许被修改
finally:是保证代码必定要被执行的一种机制.经常使用来关闭链接资源或者解锁等.
finalize:是Object的一个方法,它的目的是保证对象在被垃圾收集前完成特定资源的回收.1.9后已通过时.
try-catch-finally 中哪一个部分能够省略?
catch能够省略
无论有没有捕获到异常,finally中的代码都会被执行;
finally是在return以后执行的,程序在执行完return以后,会将值保存起来,当执行完finally中的代码以后再将return值返回
若是finally中存在return,会致使最后返回的是finally中的值.
try-catch-finally 中,若是 catch 中 return 了,finally 还会执行吗?
会执行,return的值会暂时保存.等到运行完finally中的代码块时才会返回return的值
常见的异常类有哪些?
空指针异常类型:NullPointerException
类型强制转换类型:ClassCastException
数组下标越界异常:ArrayIndexOutOfBoundsException
输入输出异常:IOException
为何要使用 hibernate?
1.对JDBC访问数据库的代码作了大量的封装,简化开发
2.性能好,支持各类关系数据库.
什么是 ORM 框架?
ORM的意思是对象关系映射,它的做用是在关系型数据库和业务实体对象之间作映射
这样咱们在操做具体业务对象的时候,就不须要去和具体的SQL语句打交道,只须要操做对象的属性和方法.
hibernate 中如何在控制台查看打印的 sql 语句?
在hibernate配置文件中配置hibernate.show_sql属性
hibernate 有几种查询方式?
三种:HQL查询 QBC查询(也叫Criteria查询) 本地SQL查询
hibernate 实体类能够被定义为 final 吗?
不能,由于hibernate使用代理方式在延迟加载的状况下提升性能,若是定义为final
就不能继承,也就没法实现代理.
在 hibernate 中使用 Integer 和 int 作映射有什么区别?
1.若是数据库返回字段值是null的话,int类型会报错,Integer则不会
hibernate 是如何工做的?
经过Configuration config = new Configuration().configure();解析配置文件
由hibernate.cfg.xml中的读取并解析映射信息
经过SessionFactory sf = config.buildSessionFactory();//建立SessionFactory
Session session = sf.openSession();//打开Sesssion
Transaction tx = session.beginTransaction();//建立并启动事务Transation
persistent operate操做数据,持久化操做
tx.commit();//提交事务
关闭session和sessionFactory
get()和 load()的区别?
get方式会直接触发sql语句查出对象,load方式会使用延迟加载的机制加载这个对象,此时是个代理对象
只保存实体对象的id值,只有用到其余属性的时候才会调用sql查出来.
若是对象不存在,get方式会抛出空指针异常,load方式会抛出ObjectNotFoundException
说一下 hibernate 的缓存机制?
hibernate为了下降对数据库访问的频率,加入了缓存机制.缓存内的数据是对物理数据库数据的复制,
应用程序在运行时,从缓存中读写数据.
Hibernate的缓存包括两大类:session一级缓存和sessionFactory二级缓存.一级缓存不可卸载.
当根据ID查询数据的时候,首先从session缓存中查,查不到,若是设置了二级缓存,那么从二级缓存中查,
若是都查不到,再查数据库.将查到的数据按照ID放入缓存中,在删除,更新,增长数据的时候更新缓存.
hibernate 对象有哪些状态?
Hibernate对象有三种状态
Transient 瞬时态, 此时对象刚new出来,尚未save()
Persistent 持久态, 调用了save方法或者游离态的对象调用了update方法后会变成持久态
若是对象是持久化对象时,那么对该对象的任何修改,都会在提交事务时才会与之进行比较
当调用了session.clear()方法,之后 对象就会变成游离态
在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?
采用getCurrentSession()得到的session会绑定到当前线程,而openSession则不会
getCurrentSession()得到的session在commit或者rollback后会自动关闭,而openSession必须手动关闭
hibernate 实体类必需要有无参构造函数吗?为何?
必需要有,觉得hibernate是经过反射的方式来得到对象实例的,此时会调用默认的无参构造.
mybatis 中 #{}和 ${}的区别是什么?
前者会将传入的数据当成字符串,在以前加入双引号,后者是直接将数据显示在sql中
前者会当作占位符,防sql注入,后者不能
mybatis 有几种分页方式?
两种,一种是内存分页,一种是物理分页
内存分页: 一次性查询出全部知足条件的数据,临时保存在集合中,经过List的subList的方式获取分页数据.
物理分页: 借助sql进行分页或者利用拦截器分页
RowBounds 是一次性查询所有结果吗?为何?
不是,由于mybatis是对JDBC的封装,在JDBC的驱动中有一个Fetch Size的配置,它规定了每次最多从数据库查询多少条数据.这样作能够防止内存溢出.
mybatis 逻辑分页和物理分页的区别是什么?
逻辑分页一次性查询不少数据,而后再结果中检索分页的数据,消耗内存.
物理分页是从数据库查询指定条数的数据.
mybatis 是否支持延迟加载?延迟加载的原理是什么?
支持,在配置文件的标签中设置就能够激活
原理: 在调用的时候出发加载,而不是在初始化的时候加载信息.如a.getB().getName(),若是a.getB()的值为null,会触发保存好的关联B对象的sql语句查询出B,而后再调用getName().
说一下 mybatis 的一级缓存和二级缓存?
一级缓存是SqlSession级别的,在一个sqlsession中,第一次查询缓存中是否有数据,没有就会查询数据库,并将数据保存在一级缓存中.第二次去查的时候会直接从缓存中查询.若是这中间sqlsession进行了commit操做则会清空缓存.
二级缓存是Mapper级别的,多个sqlsession共享,默认关闭.它基于Mapper文件的namespace,若是两个mapper的namespace相同,那么会共享缓存的数据.使用二级缓存要在配置文件中开启,而且序列化po类.
mybatis 和 hibernate 的区别有哪些?
mybatis灵活,能够写sql,hibernate学习困难
mybatis 有哪些执行器(Executor)?
SimpleExecutor:每执行一次 update 或 select 就开启一个 Statement 对象,用完马上关闭 Statement 对象
ReuseExecutor:执行update或select以SQL做为key查找Statement对象,存在就使用,不存在就建立,用完后不关闭,能够重复使用
BatchExecutor:执行update(没有select,jdbc批处理不支持select)时,将全部SQL都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象.
mybatis 分页插件的实现原理是什么?
分页插件的基本原理是使用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的SQL,而后重写SQL,根据dialect方言,添加对应的物理分页语句和参数
mybatis 如何编写一个自定义插件?
只需实现Interceptor接口,并指定要拦截的方法签名
@Intercepts({
@Signature(
type=Executor.class,method=“update”,args={ MappedStatement.class,Object.class })})
public class ExamplePlugin implements Interceptor {
public Object intercept(Invocation invocation) throws Throwable {
//自定义实现
return invocation.proceed();
}
public Object plugin(Object target){
return Plugin.wrap(target,this)
}
public void setProperties(Properties properties){
//传入配置项
String size = properties.getProperty(“size”);
}
}
<!-- mybatis-config.xml -->
<plugins>
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<!-- 这里的配置项就传入setProperties方法中 -->
<property name="size" value="100">
</plugin>
</plugins>
1234567复制代码