JDK 和 JRE 有什么区别?
JDK是java的开发工具包,包含各种类库,并且包含了JRE,javac是在JDK中的;
JRE是java程序的运行环境,安装过程中自动添加PATH
== 和 equals 的区别是什么?
两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
首先,两个对象equals相等,hashcode一定相等;但是hashcode相等时,equals不一定相等.
其次,两个不同的对象,因为可能存在哈希碰撞,所以hashcode可能是相等的,但是显然equals不为true.
还有就是,在object类中,euqals方法还是用的==来判断的,==对于对象而言比较的是地址值,所以equals相等
hashcode一定一样,反之就不一定了.
final 在 java 中有什么作用?
final关键字可作用于类,类属性和方法;
作用于类上时,该类不能被继承
作用于属性时,该属性不能被重新复制
作用于方法时,该方法不能被重写
java 中的 Math.round(-1.5) 等于多少?
Math的round方法是四舍五入,如果参数是负数,则往大的数如,Math.round(-1.5)=-1
String 属于基础的数据类型吗?
不是,String是一个类,是引用数据类型.
java 中操作字符串都有哪些类?它们之间有什么区别?
有String,StringBuilder,StringBuffer
String str="i"与 String str=new String(“i”)一样吗?
他们的值相等,用equals得到true,但是他们是两个对象,如果用==判断返回false.
且str="i"是直接在常量池中引用字符串,而new String(“i”)是在堆中根据i再创建一个对象.
如何将字符串反转?
StringBuilder sb = new StringBuilder("abc");
sb.reverse().toString();
public String reverseString(String str) {
if ((null == str) || str.length()<2) {
return str;
}
return reverseString(str.subString(1)) +str.charAt(0);
}
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”);
}
}