字符串的陷阱:
String java = new String("Hello") ; //创建了两个对象:1、Hello直接量对应字符串对象;2、new String()构造器返回的字符串对象
对于Java程序的字符直接量,JVM会用一个字符串池保存他们:当第一次使用时,JVM会把它放入字符串池进行缓存,一般情况下,字符串池对象不会被垃圾回收,当程序再次需要使用该字符串时,无需重新创建一个新的字符串,而是直接让引用变量指向字符串池中已有的字符串。
对于字符串连接表达式直接赋值,如果可以在编译时确定下来,JVM在编译时会计算该字符串变量的值,并让它指向字符串池中对应的字符串(如果表达式包含变量或者方法,则不能确定)。
String是个典型的不可变类,String被创建后,包含的字符序列就被固定下来,永远不会改变;通常我们拼接字符串底层是会创建一个新的字符串对象,然后让引用变量指向它。原理的字符串则不会被用到,也不会被垃圾回收,因为它一直存在于字符池中,这也是Java内存泄露的原因之一。
字符串底层实际用一个字符数组保存该字符串包含的字符序列,当字符串比较时(equal)判断底层字符数组是否全部相同。
表达式陷阱:
short a = 5 ;
a = a + 10 ; //运行编译错误
a += 10 ; //运行编译正常
原因:a+10会自动提升为int类型,不可以赋值给short类型;所以所有类似+=的运算,与普通的+并不等价,实际上都包含了隐式类型转换:a = (short)a + 10 。
结果集类型比变量类型大将会 强制转换,可能导致高位“截断”;如:a += 100000 ;不会等于100005;结果为-31067。 因为short只能接受-32768~32767之间的整数,上面的100005将会截断。
输入法导致的陷阱:
对应Java言语,需要包含大量的空格、Tab制表符,如果把输入法切换成为全角状态,则输入的空格会变成全角空格,导致编译出错(ERROR:非法字符)。
转义字符陷阱:
Java对待Unicode转义字符不会进行任何忽略,它会将Unicode转义字符直接替换成为对应字符,对Java程序带来一些潜在的陷阱。
泛型可能引起的错误:
泛型处理:1、当程序把一个原型的变量赋给一个带泛型信息的变量,总是可以通过编译,,只是会产生提示;2、当试图访问带泛型的集合元素时,编译器总是会把集合元素当成泛型类型处理,并不关系集合元素的实际类型;3、当程序试图访问带泛型声明的集合元素,JVM会遍历每个集合元素自动执行强制转换,如果集合元素实际类型和集合所带泛型不匹配,会产生ClassCastException异常。
当把一个具有泛型信息的对象赋给另一个没有泛型信息的变量时,所有尖括号之间的类型信息都将丢弃。
不能创建泛型数组。
正则表达式陷阱:
String w = "www.wcwc.com" ;
System.out.println( w.split(".") ) ; //不会输出任何东西
System.out.println( w.split("//.") ) ; //输出分割后的字符串数组
因为split使用正则表达式匹配,‘ . ’相当于匹配任何字符,所有实际匹配所有分割,需要进行转义处理
线程陷阱:
Java提供3中方式创建、启动多线程:
1、继承Thread创建线程类,重写run()方法作为线程主体;
2、实现Runnable接口创建线程类,重写run()方法作为线程主体;
3、实现Callable接口创建线程类,重写call()方法作为线程主体。
不要调用run方法,否则与普通方法无异,不会启动线程执行;要调用start方法才会启动新线程运行。