程序员基本功05表达式中的陷阱

你尽管去做,其他的交给天意:读书笔记读书笔记

1、Java字符串的特点

当程序使用字符串、基本类型包装类实例是,尽量使用字符串直接量、基本类型值的直接量,避免通过new String()、new Integer()形式来创建字符串、基本类型包装类实例。对于Java程序中的字符串直接量,JVM会使用一个字符串池来保护它们,当程序再次使用该字符串时,无需创建一个新的字符串。JVM在编译时就可以确定字符串的值可以让该字符串指向字符串池中对应的字符串;如果程序中使用了变量或调用看方法,那就只能等到运行时才能确定字符串的值,也就无法在编译时确定字符串变量,从而无法使用JVM字符串池。如果字符串连接运算中所有变量执行了“宏替换”,那么JVM可以在编译时就确定字符串表达式的值。

2、String、StringBuilder和StringBuffer

当一个string对象创建完成后,该string类包含的字符序列就被固定下来了,以后永远不能变。因此如果程序需要一个字符序列会发生改变的字符串,考虑使用stringBuilder或StringBuffer。StringBuilder与StringBuffer的唯一区别是,StringBuffer是线程安全的,但效率会降低。在没有多线程的情况下,首先使用StringBuilder。  

如果程序比较的是俩个字符串是否相同,用(==)就行了【比较俩个字符串引用变量是否指向同一个字符串对象】;但如果要判断俩个字符串所包含的字符序列是否相同,则应该用String重写过的equals方法进行比较。

3、表达式类型自动提升的陷阱

Java是一门强类型语言,强类型语言的俩个基本特征:所有变量不许声明,然后才能使用,声明变量时必须指定该变量的数据类型;一旦某个变量的数据类型确定下来了,那这个变量将永远只能接受该类型的值。

当一个算术表达式中包含多个基本类型变量,整个算术表达式的数据类型将自动提升:byte、short和char将自动提升为int——》long——》float——》double。 

4、复合赋值运算符隐含的类型转换

复合赋值运算包含一个隐式类型转换:a+=5等价于a=(a的类型)(a+5),其于a=a+5不一样。

复合运算有:+=、-=、*=、%=、<<=、>>=、>>>=、&=、

如果把+=当成字符串连接符使用,则+=运算符左边的变量只能是String类型,不能是String的父类类型,如(object或CharSequence)。

5、输入法导致的陷阱

基本上,如果在编译时提示“非法字符串:\xxxxxx”的错误提示,可断定程序中国包含“全角字符”,逐个删除就行

6、必须使用合法的注释字符

\u后面的4个字符必须是0-F。

7、慎用字符的Unicode转义形式

\u000a是换行符,慎用

8、泛型中原始类型变量的赋值

当程序把一个原始类型的变量赋给一个带泛型信息的变量时,总是可以编译----只是会提示一些警告信息;如果只是简单的输出每个集合元素,并不涉及集合元素类型,程序不会出现异常 ;否则,程序要么编译异常,要么运行异常。

当程序试图访问带泛型声明的集合的元素集合时,编译器总是把集合元素当成泛型类型处理----它并不关心集合元素实际类型

当程序试图访问带泛型声明的集合的集合元素时,JVM会遍历每个集合元素自动只从强制转型,如果集合元素的实际类型与集合所带的泛型信息不匹配,运行时将引发ClassCastException。

9、原始类型带来的擦除

当把一个具有泛型信息的对象赋给另一个没有泛型信息的变量时,所有尖括号之间的类型信息都将被丢弃。

10、Java不支持泛型数组

11、正则表达式中(.)匹配任意字符

split(string regex)、replaceAll(string regex,String replacement)、replaceFirst(String regex,String replacment)

“\\.”代表转义,“\\\\”标识双斜杆

12、不要调用线程对象的run方法

3种方法创建、启动多线程:

继承Thread类来创建线程类、重写run()方法作为线程执行体;

实现Runnable接口来创建线程类,重写run()方法作为线程执行体

实现Callable接口来创建线程类,重写call()方法作为线程执行体。

第一种方式效果最差:线程继承了Thread类,无法继承其他父类;因为每条线程都是一个Thread子类实例,因此多个线程之间共享数据比较麻烦。

13、静态同步方法的同步监视器是类

Java提供synchronized关键字用于修饰方法,使用synchronized修饰的方法被称为同步方法。当然,还可以修饰普通代码块,被修饰的代码块称为同步代码块。java规定,任何线程进入同步方法、同步代码块之前,必须先获取同步方法、同步代码块对应的同步监视器。

14、多线程执行环境的线程安全问题

不考虑多线程环境的情况下,很多类代码都是正确的,但一旦将它们放在多线程环境下,这个类就变得很脆弱,这种类称为线程不安全,在多线程环境下,使用线程不安全的类是危险的。

使用synchronized关键字修饰方法,通过同步方法可以得到线程安全类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值