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

本文深入探讨了Java中的字符串处理、类型转换、多线程同步及泛型使用的细节,并通过实验代码展示了实际应用中的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串:

  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。

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值