《突破程序员基本功16课》——表达式、流程控制陷阱
JAVA 常见的阿Java对象建立5种方法
new 构造器
反序列化,从IO流恢复对象
反射 Class对象的newInstance()方法
使用clone()方法
包装类、String 使用直接量创建对象
字符串
在编译前就能确定的字符串直接量(整个的、拼接的),都会在字符串池中共用一个值。
但程序运行时才能确定的连接表达式(有变量、调用方法),则会各自不同。
例外:所有变量都可以执行“宏替换”,那么在计算时就能确定字符串的值。(会对s1、和len执行“宏替换”)
代码2,会造成String对象“Hello”不被引用但会一直在字符串池中,不会被回收,造成内存泄漏。
表达式类型的陷阱
强类型语言:所有变量必须声明类型,类型不可更改,只可放该类型数据。
变量自动提升等级
a += 5; a = a+5;
上边两个表达式不等价。
a += 5;等价于 a = (a的类型) a + 5; 即复合运算符包含隐式类型转换。即容易造成高位截断。
报错“非法字符:\XXX”的错误提示时,多半是输入法全角的问题
注释报错:
注释中的内容被识别为Unicode的话,容易报错。
split()方法分割字符串
注意:split()方法的参数是正则表达式,正则表达式的"."可匹配任意字符。想要达到分割的目的,需使用转义字符"\\."
支持正则表达式的String()方法
1、matches(String regex)
通知此字符串是否匹配给定的正则表达式。
2、replaceAll(String regex, String replacement)
使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的每个子字符串。
3、replaceFirst(String regex, String replacement)
使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的第一个子字符串。
4、split(String regex, int limit)
根据匹配给定的正则表达式来拆分此字符串。
split(String regex)
根据给定的正则表达式的匹配来拆分此字符串。
多线程的陷阱
三种方式启动多线程
继承Thread类的方法效果最差
-
不能继承其他类
-
多个线程是多个Thread的子类,共享数据较麻烦
-
要用start()方法启动线程
Runnable、Callable接口实现,本质上看是一样的。只是call()方法可以声明抛出异常和返回值。
线程进入同步块、方法时,必须先获得其同步监视器。
同步代码块,程序显式地指定同步监视器;
同步非静态方法,this——即调用该方法的对象;
静态同步方法,该类本身;
if-else 陷阱
else的隐藏条件:不满足else之前的条件。
即——if(age > 40 && age <= 20)