这两个星期累死了,几乎没睡过懒觉!上星期部门组织了出游,新入职场,还真是不得不去,这星期部门组织类户外拓展,本来不去的,后来被部长点名,我这不去也得去了!到头来这两个星期几乎天天6点半起床,要不上班,要不就是出去活动!我勒个去!
Gloria在前面趴着看pad,等着我总结完一起去游泳。这种日子的时光还是挺好的,安静,怡情~程序员的生活就这么的在她的陪伴下开始了,我也算是解决了程序员最大的个人问题了。
1、当编译器观察到一个String后面紧跟一个“+”,而这个“+”的后面又紧跟一个非String类型的元素时,就会尝试着将这个非String类型的元素转换成String,如下面代码中所展示的那样,它成功的将a和b转换为了String类型。
public class Precedence{ public static void main(String[] arg){ int x = 1,y = 2,z = 3; int a = x+y-2/2+z; int b = x+(y-2)/(2+z); System.out.println("a="+a+"b="+b); } }
2、引用传递我觉得其实也是有内嵌的复制现象的,只不过复制的是这个引用的句柄,两个引用同时指向一个对象,在方法结束之后,方法内部的复制的引用的“句柄”将被释放。
3、通过在创建Random对象时提供种子(用于随机数生成器的初始化值,随机数生成器对于特定的种子值总是产生相同的随机数序列),就可以在每一此执行程序的时候都生成相同的随机数,因此输出时可验证的。通过Ramdom类的对象,程序可生成许多不同类型的随机数字,只要调用相对应的nextXxx()方法就可。传递给这个方法的参数设置类所产生的随机数的上限。这个随机数生成的方法是Java中基础中的基础,在今后的项目工程代码当中会经常用到,下面是测试代码:
import java.util.*; import statci java.lang.System.*; public class MathOps{ public static void main(String[] arg){ Ramdom rand = new Ramdom(47); int i,j; j = rand.nextInt(100); out.println(j); k = rand.nextInt(100); out.println(k); } }
4、一元加号(+)就是表示正数的符号,他的唯一的作用仅仅是将较小类型的操作数提升为int。
5、自动递增与递减符号的问题。这个使用时自从我开始学习计算机开始,一直到如今的。其用法我已经不想再总结了。这里我写出来主要想把我前几天看书看到的一个东西总结出来,就是再多线程的情况下,这两个符号所代表的运算其实是非线程安全的,原因我用下面代码说明:
public class Test{ public static void main(String[] arg){ int i = 0; i++; //下面是jvm真实运行的情况代码,在每段代码之间如果线程切换,其他线程修改i这个变量,那当线程回复的时候i的值将失效! int temp = i; temp = temp+1; i = temp; } }
7、-127~128这之间的整数将被缓存到系统的一个空间,所以用Integer保证这之间的数据的时候,他们用=比较,是相等的!
8、Java与C/C++不同,Java不能将一个非布尔类型的值当做布尔值在逻辑表达式中使用。可将整数类型替换成除了布尔类型以外的其他任何基本数据类型。
9、短路的应用在很多时候是很常见的,他可以节省我们程序运行的时间,提高效率,代码中常用:
if(list!=null&&list.size()>0)//我从项目中拷出来的一段代码
上面这段代码就用到了短路,因为list这个容器类有可能是一个null的空值,所以如果要为null的时候就不去进行&&后面的计算了,因为进行后面的计算是要在list这个容器不为空且要是List类型的对象时候才可以,否则后面这段代码将会报空指针的错误。
10、在Java中,e代表10这个指数,e的9次方,就是10的9次方,为什么用e来代表10,这个和历史有点关系(Exponential这个单词为指数)
11、默认情况下编译器会把指数作为双精度来处理(double),小数也是如此,将直接常量的小数直接赋值给float类型的变量,系统会报错,必须要在结尾加上“f”或者是“F”,以表示这个直接常量当成float类型来处理。long类型不用,因为系统编译器默认将直接常量的整数处理成整形int,long类型的存储空间比int类型要大。多一嘴,double这个类型在Java中是一个非常危险的东西,因为它存储的数据并不准确,精度不够。在进行多次运算之后,将会有精度损耗的现象发生,自我以往的项目经历中,这个碰到过几次,解决办法就是用BigDicimal这个类进行包装与运算!
12、位运算:这个东西在某些方面其实有着很强大的功能,例如可以使用位运算来模拟Java并没有的无符号操作数;可以运用位运算来快速的进行加法减法运算,而不用使用加号减号,底层运行效率加快……这种运算符是一种偏向底层的运算,虽然Java是一个纯上层的语言,不过对于底层的了解与掌握,一时一刻都不能停!
13、对于boolean类型的作为一种单比特值对待,所以它多少有些独特。我们可以对它进行安位“与”“或”“异或”,但是不能执行安位“非”的运算(大概是为了与逻辑NOT进行区别的原因)。boolean的安位操作运算,与逻辑操作运算的结果是一样的,但是他们并不会有短路的效果。另外在移位的表达式中,我们不能使用boolean进行运算,这里我自己推测是和boolean类型的单比特处理的原因有关。
14、移位操作符只能作用于整数类型(基本类型的一种)。
15、>>:正数高位补0,负数高位补1,;>>>:无论正数负数,高位都补0。
16、如果对char、byte、short这种类型进行移位操作的话,在移位之前,编译器会先将他们变成int类型,并且得到的结果也是一个int类型的值。如果对long类型进行移位操作的话,那么结果是long类型。
17、char、byte、short、int这几个类型移位操作的时候,右边的操作数(表示具体我们要移动多少位)只有低5位才会被编译器使用,因为int最大是32位的操作数,这几个都会某人转换成int类型来进行移位操作,所以系统为了我们操作时候超过int类型最大的数值而做的处理。在long类型上面,右边的操作数只有低6位才会被使用,原因和上面是一样的!(这一点吐槽下《TIJ》中的翻译!!)
18、对于byte或者short这种进行移位运算的话,得到的可能不是正确的结果,因为他们会先被转换成int类型,再进行移位操作,然后再被截断,赋值给原来的类型,在这种情况下可能得到的结果是-1。下面是一段代码和注释,很关键的细节:
public calss URShift{ public static void main(String[] arg){ byte b = -1; System.out.println(Integer.toBinaryString(b)); b>>>=10;//这种情况下面b先转换成int类型进行移位,再截断成byte进行赋值 System.out.println(Integer.toBinaryString(b)); System.out.println(Integer.toBinaryString(b>>>10));//这种情况下,就直接是int类型进行操作显示 } }
20、编译器在必要的时候会自动的进行int类型到long类型的类型转换。如果我们要进行窄化转换的时候,编译器会强制我们进行显式的类型转换!
21、通常表达式中出现的最大的数据类型决定了表达式最终的结果的数据类型。如果将一个float和double类型进行运算,结果就是double,如果将一个int和一个long类型进行运算的话,那么结果将会是long类型!
22、对于char、byte、short这些类型的任何一个进行算术运算都会获得一个int类型的结果。数据提升的效果!