面试时遇到的几个小问题,大家来讨论
面试时遇到的几个问题,大家来讨论啊
1、一个类的静态变量能在同一个WebServer中的多个WebApp中共享么?请说明原因。
2、请列举出java用于线程同步的各种技术(如synchronized关键字),说出他们的区别。
3、写一个函数计算一个32位整数中有多少Bit位为1
public int countBits(int value){
}
------解决方案--------------------
2.synchronized有两中实现方法吧,一个是在方法或属性前加关键字
还有一个synchronized block是用来解决第三方提供的方法与属性的同步问题的
------解决方案--------------------
3、
1、一个类的静态变量能在同一个WebServer中的多个WebApp中共享么?请说明原因。
2、请列举出java用于线程同步的各种技术(如synchronized关键字),说出他们的区别。
3、写一个函数计算一个32位整数中有多少Bit位为1
public int countBits(int value){
}
------解决方案--------------------
2.synchronized有两中实现方法吧,一个是在方法或属性前加关键字
还有一个synchronized block是用来解决第三方提供的方法与属性的同步问题的
------解决方案--------------------
3、
- Java code
public int countBits(int value){ int count=0; while(value!=0){ count+=value&1; value>>>=1; } return count; }
------解决方案--------------------
3、这个更高效
- Java code
public int countBits(int value){ int count=0; int[] bits4={0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4}; while(value!=0){ count+=bits4[value&0xf]; value>>>=4; } return count; }
------解决方案--------------------
------解决方案--------------------
1、一个类的静态变量能在同一个WebServer中的多个WebApp中共享么?请说明原因。
静态变量是JVM级别的,所以能在同一个WebServer中的多个WEBAPP中共享
------解决方案--------------------
- Java code
public class Test{ public static void main(String[] args) { System.out.println(countBits(3)); } public static int countBits(int countValue){ int count=0; while (countValue!=0) { ++count; countValue=countValue>>1; } return count; } }
------解决方案--------------------
------解决方案--------------------
不能用>>啊,负数就麻烦了,死循环了。
------解决方案--------------------
对wxwyes的例子的一点补充:
package test;
public class Test{
public static final int a=0;
public Test(){
System.out.println(Test.class.getClassLoader().getClass().getName());
}
}
jsp中引用的时候:
<%
out.println(new test.Test().a
%>
在构造函数中把类装载器打印出来。
结果发现,当放在tomcat的lib目录下面的时候,打印:org.apache.catalina.loader.StandardClassLoader
当放在某一个工程下面的classes下面的时候,打印:
org.apache.catalina.loader.WebappClassLoader
既然不是由同一个类装载器载入的,肯定不可以共享。但是,在同一个类装载器内部,
应该只有一个静态变量。
------解决方案--------------------
1.是可以共享的.
以tomcat为例,它支持多个层次的类加载器.其中有shared类型加载器,其加载的类在所有webapps下的项目都可见.
把类的class文件放在shared/classes目录下即可.
------解决方案--------------------
------解决方案--------------------