表达式陷阱

字符串的陷阱:
    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方法才会启动新线程运行。 






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值