一些java中常见的基础问题的总结
无聊的问题总结.1.&和&&的区别.
java中的逻辑运算符:
& 逻辑与(AND)
| 逻辑或(OR)
^ 逻辑抑或(XOR)
! 逻辑非
&& 条件与(AND)
|| 条件或(OR)
注意&&和||会进行短路计算,第一个条件可以判断表达式的结果时,不对后面的条件进行判断了.
位操作运算符:
& 按位与(AND)
| 按位或(OR)
^ 按位抑或(XOR)
~ 按位取反
所以,问&和&&的区别时,千万别仅仅说一个是位操作符,一个是逻辑运算符.
2. short s=0;
s+=1;
正确,而
s=s+1;
不正确,为什么?
java中byte ,short,char之类的运算都是提升为int类型进行的,所以运算完之后要进行强制类型转换,复合赋值操作符编译器会自动添加强制转换操作.建议:尽量不要对byte,short,char这样的类型使用复合赋值运算符.
3.String str=new String("abc");
这句话创建了几个对象?
如果有人这么问问题,直接不要理会了,这个问题太难回答.不精通jvm的话还难精确的说会创建很多"对象".自己目前能想到的,比如String类型对应的Class对象,这个Class内部的对象就好多个,可以去看Class类的源代码.
如果问创建了多少个"String对象",那起码还好说点,起码有个限定是吧?首先对于"abc",如果常量池中已经有了的话,那就不用创建了,如果没有肯定要解析常量池,并创建String对象,进行intern()操作.所以这里肯定会存在一个常量池里的对象.new String("abc");当然会导致在堆中创建一个对象.这里自己也不知道答案该如何归纳,1个或2个?等深入的学习一下再总结.
【有资料说字符串字面常量是在类加载的时候创建的,那样的话,执行上面语句的时候肯定只有一个String对象创建,因为执行这句话之前肯定要加载类,继而创建字符串字面量对应的对象,也就说执行这句话之前,"abc"已经存在了,这句话可以说是创建了一个String对象。但是,问问题的人可能根本不知道自己想问什么,所以答案可能是五花八门的了。】
String str="a"+"b"+"c"+"d";
这句话会创建几个对象?
用SUN的jdk处理,经过javac编译之后,常量运算已经直接处理掉了,所以生成的class文件里的常量池表中有"abcd"这个串.(遵从java语言规范的编译器应该都是这个样子的)
所以执行这句话的时候,只会有一个对象.对于连编译和运行都分不清的人就不用多解释了.
这个问题有人用组合的方法得出很多结论,后来看到有人说,Thinking in Java上介绍的,内部原理是用的StringBuilder来连接的,这里有2个问题,第一,如果这个例子会用StringBuilder来连接的话,那么String对象还是只有1个,第二,如果问一共有几个对象,再考虑StringBuilder来连接的问题的话,那这里面起码又带来了StringBuilder类对应的Class对象及其内部对象,这个数量就很大了.一个值得思考的问题是,既然能看到Thinking In Java中的结论,为什么不能看看TIJ中分析问题的思路呢.
顺便写点测试代码:
<div class="highlighter">
[*]publicclassMain{
[*]publicstaticvoidmain(Stringarg[]){
[*]Stringstr="a"+"b"+"c"+"d";
[*]}
[*]}
页:
[1]