1、说说&和&&的区别
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&&具有短路功能,即如果第一个表达式为false,则不需要计算第二个表达式。
&还可以用作位运算符,当&操作符两边的表达式不是boolean类型是,&表示按位与操作。
2、Java规范有这样的规则
a.高位转低位需要强制转换.
b.低位转高位自动转.
Java规范有这样的规定
复合赋值(E1 op=E2)等价于简单赋值(E1=(T)((E1) op (E2)))
使用复合赋值操作符时 : 复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。
3、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。
4、什么叫线程安全?servlet是线程安全的嘛?
线程安全就是多线程在运行期间不会产生不符合常规的数据,同样在多线程访问同一代码,不会产生不确定的结果。
Servlet是线程不安全的。
5、同步有几种实现方法
两种,分别是:synchronized和wait与notify
6、请说明下java的内存模型及其工作流程
java内存模型就是 java内存分为主内存和工作内存。
多线程 每一个线程都会有一个自己的工作内存,所使用到的变量都是主内存的一份拷贝。
7、volatile有什么用?能否用一句话说明下vplatile的应用场景?
volatile的作用就是多线程使用同一个变量时,每次都去主内存读数据,保障了数据的实时性。
应用场景就是多线程 操作同一个变量。
8、多线程执行怎么保障变量的可见性?
可见性:就是一个线程修改了变量,其他线程可以立即知道
保证可见性的方法:volatile
synvhronized(unlock之前,写变量值会主存)
final(一旦初始化完成,其他线程就可见)
9、为什么代码会重排序?
代码重排序是为了CPU的高效率执行
JVM指令重排的基本原则
-程序顺序原则:一个线程内保证语义的串行性
-volatile原则:volatile变量的写,先发生于读
-锁原则:解锁必然发生在随后的加锁前
-传递性:A先于B,B先于C,那么A必然先于C
-线程的start方法先于它的每一个动作
-线程的所有操作先于线程的终结(Thread.join())
-线程的中断(interrupt())先于被中断线程的代码
-对象的构造函数执行结束先于finalize()方法
10、抽象类和接口有什么区别
–接口是公开的,里面不能有私有的方法或变量,适用于让别人使用的,而抽象类是可以有私有方法或私有变量的。
–实现接口一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。
–接口可以实现多重继承,而一个类只能继承一个父类,但可以通过多个接口实现多重继承。
–接口还有表示和数据共享的作用。
11、反射的用途及实现
Java反射机制主要提供了以下功能:在运行是构造一个类的对象;判断一个类所具有的成员变量和方法;调用一个对象的方法;生成动态代理。
反射最大的应用就是框架。
Java反射的主要功能:
- 确定一个对象的类
- 取出类的modifiers,数据成员,方法,构造器和父类
- 找出某个接口里定义的常量和方法说明
- 创建一个类实例,这个实例在运行时刻才有名字(运行时间才生成的对象)
- 取得和设定对象数据成员的值,如果数据成员名是运行时刻确定的也能做到
- 在运行时刻调用动态对象的方法
- 创建数组,数组大小和类型在运行时刻才确定,也能更改数组成员的值
反射的应用很多,很多框架都有用到
- spring 的 ioc/di 也是反射
- javaBean 和 jsp 之间调用也是反射
- struts 的 FormBean 和页面之间也是通过反射调用
- JDBC的classForName()也是反射
- hibernate的find(Class class)也是反射
反射还有一个不得不说的问题,就是性能问题,大量使用反射系统性能大打折扣。怎么使用是你的系统达到最优就看你系统架构和综合使用问题。
12、session和cookie区别
cookie是Web服务器发送给浏览器的一块信息。浏览器会在本地文件中给每一个Web服务器存储cookie。以后浏览器在给特定的web服务器发请求的时候,同时会发送所有为该服务器存储的cookie。
无论客户端浏览器怎么样设置,session都应该能正常工作。客户端可以选择禁用cookie,但是,session任然能够工作,因为客户端无法禁用服务端的session。
13、sleep()、join()、yield()有什么区别
- sleep()方法
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。让其他线程有机会继续执行,但它不释放对象锁。也就是如果有Synchronized同步块,其他线程任然不能访问共享数据。该方法要注意捕获异常。
sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。
2.yield()方法
yield()方法也不会释放锁,但它没有参数,即yield()方法只是使当前线程重新回到可执行状态,所以执行yield()线程有可能在进入到可执行状态后马上又被执行,另外yield()方法只能使同优先级或者高优先级的线程得到执行机会。
3.join()方法
Thread 的非静态方法join()让一个线程B‘加入’到另一个线程A的尾部。在A执行完毕之前,B不能工作。
保证当前线程停止执行,直到该线程所加入的线程完成为止。然而如果它加入的线程没有存活,则当前线程不需要停止。