日期:2014-05-20  浏览次数:20702 次

面试时遇到的几个问题,大家来讨论啊

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;
    }

------解决方案--------------------
探讨
3、这个更高效
Java codepublicint 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;
    }
}

------解决方案--------------------
探讨
引用:
1、一个类的静态变量能在同一个WebServer中的多个WebApp中共享么?请说明原因。

静态变量是JVM级别的,所以能在同一个WebServer中的多个WEBAPP中共享


一个类的静态变量不可以在同一个WebServer中的多个WebApp中共享的吧。
因为不同的WebApp有不同的逻辑,如果其中一个WebApp改变了这个变量势必会影响到其的WebApp,这样所造成的结果是无法预见的。
这是从逻辑上来分析,那么从技术的角度应该怎么分析呢?哪位大虾有好的想法?

------解决方案--------------------
不能用>>啊,负数就麻烦了,死循环了。
------解决方案--------------------
对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目录下即可.
------解决方案--------------------
探讨
1、一个类的静态变量能在同一个WebServer中的多个WebApp中共享么?请说明原因。

2、请列举出java用于线程同步的各种技术(如synchronized关键字),说出他们的区别。

3、写一个函数计算一个32位整数中有多少Bit位为1

public int countBits(int value){

}

------解决方案--------------------