疯狂java笔记:表达式中的陷阱

来源:互联网 发布:mysql workbench使用 编辑:程序博客网 时间:2024/05/16 05:04

字符串:

  1. 当使用字符串对象时,如果该对象是创建出来的,则在堆中生成一个String对象。如果是直接量,即是使用双引定义的形式,则编译时会将这个字符串内容放到一个字符串池之中。缓存起来供以后多次使用。
  2. 字符串对象String的内容在其创建出来后就不能改变了。
  3. 在编译期间可以确定字符串对象String的值才能使用字符串常量池缓存。
  4. 字符串比较两种形式:调用equals方法和==,区别是前者比较字符内容,后者比较引用是否相同。equals实现是逐个比较各个字符是否相同。还有compareTo(String obj)方法是从左向右比较各个字符,返回值0即说明两者相等。

String实验代码:

 

类型自动提升:

  1. 一个算术表达式含有多种数据类型,该表达式中所有的数据类型都会提升到它们之中数据等级最高(所占字节数最大,表达范围最大)的那种类型,最后的运算结果是它们之中等级最高的那个类型。
  2. 复合赋值运算符经过编译器处理后其实实现了类型的强制转换,即E1 op= E2,相当于E1 = (E1 DateType) E1 op E2
  3. 将高级的数据类型强制转换为低级数据类型,会产生对原数据的高位截断,即是舍弃高位字节,保留低位字节数据。
  4. 小数默认为double类型,除非在小数后加上类型标识符,如1.5f。

类型自动提升实验代码:

 

源码编写错误:

  1. 全角空格
  2. 注释中包含unicode转义符/u
  3. 用unicode转义符表示关键字,不会产生错误,个人觉得是不是可以用来做源码混淆器呢?

泛型错误:

  1. 可以将原始类型变量赋值给一个带泛型信息的变量,前提是类型保持兼容,例如可以讲List变量赋值到List<Integer>变量中去,因为他们的类型都是List。
  2. 当程序访问带泛型信息的集合时,总是不关系集合里面的数据类型,访问时执行强制数据类型转换为泛型信息对应的变量。如果不能转换,就会爆出ClassCastException.
  3. 原始类型的擦除,是指将带泛型信息的变量赋值给一个原始类型,则该变量的类型会转变为泛型类型的上限类型(父类型?)。
  4. 不允许创建泛型数组,比较隐蔽的错误时一个内部类使用到了外部类的泛型信息,而在外部类方法中创建了内部类数组,会导致编译器提示创建泛型数组错误。

多线程陷阱:

  1. 启动一个线程要调用start方法,而不是调用run方法。
  2. 静态同步方法的默认的同步监视器是整个类Class对象。
  3. 多线程之间要共同读写一个公共的数据,要对这些操作进行同步处理,如关键字synchronized。

静态初始化块启动新进程执行初始化:

注意:静态初始块启动多线程对静态字段进行赋值不是初始化赋值,仅是一次简单的赋值。