疯狂java05--表达式中的陷阱

本文深入探讨了Java编程中常见的陷阱,包括字符串处理、表达式类型、泛型使用等方面的问题及解决方案。

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

5.1关于字符串的陷阱

1)JVM对字符串的处理

java对于字符串以及包装类,允许以直接量的方式来创建java对象。

对于这些直接量,jvm会使用一个字符串池来保存它们。字符串池中字符串对象不会被垃圾回收。

如果不是直接量,只要可以在编译时确定下来,结果也一样。

字符串的拼接,如果各部分都是直接量,那么在编译时就可以确定,所以jvm在编译时就计算出值,然后直接放入字符串池中,因此只创建了一个对象。

2)不可变的字符串

String类型,字符串拼接后引用指向新的字符串,原来的字符串失去引用,但是不会被回收,继续存在于字符串池中。这也就是java内存泄漏的原因之一。

StringBuffer线程安全,StringBuilder线程不安全。String没有线程安全和不安全两个版本,因为不可变类总是线程安全的。

3)字符串比较

==,equals(),compareTo()返回0则相等,即字符序列相同。

5.2表达式类型的陷阱

强类型语言的两个基本特征:所有变量必须先声明,然后才能使用;一旦某个变量的数据类型确定下来,那这个变量将永远只能接受该类型的数据。

1)表达式类型的自动提升

*所有byte型,short型和char型将被提升到int型

*整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型(7个基本类型里double最高)

2)复合赋值运算符的陷阱

如:a=a+5和a+=5其实并不等价

实际上 a+=5等价于a=(a的类型)(a+5)。这就是复合赋值运算符中包含的隐式类型转换。

如果结果值的类型比该变量的类型要大,复合赋值运算符将会执行一次强制类型转换,这有可能导致高位截断,从而导致实际数据丢失的情形。

5.3输入法导致的陷阱(全角字符)

5.4注释的字符必须合法

java程序并没有完全忽略注释部分的内容。编译器会检测到一个非法字符:\u后面的四个字符必须是0-F字符。

5.5转义字符的陷阱

java提供了三种方式来表示字符:直接使用单引号;使用转义字符如'\n';使用Unicode转义字符如'\u0062';

1)慎用字符的unicode转义形式

举例:syso("abc\u000a".length())表面上将输出4,实际上编译报错:未结束的字符串字面值。

原因是java对Unicode转义字符不会进行任何特殊的处理,它只是简单地将Unicode转义字符替换成相应的字符。

对于Unicode而言,它相当于一个换行符,所以实际将会输出3。

2)终止行注释的转义字符

5.6泛型可能引起的错误

1)原始类型变量的赋值

*当程序把一个原始类型的变量赋给一个带泛型信息的变量时,总是可以通过编译,只是提示一些警告信息

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

*当程序视图访问带泛型声明的集合的集合元素时,jvm会遍历每个集合元素执行强制转型,如果不匹配,运行时将引发ClassCastExceptiion异常

2)原始类型带来的擦除

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

3)创建泛型数组的陷阱

java虽然支持泛型,但是java不能创建泛型数组。

5.7正则表达式的陷阱

String提供的split(String regex)方法需要的参数是正则表达式

正则表达式中的点号(.)可以匹配任意字符,此时必须对点号进行转义(\\.)

String类支持正则表达式的方法:matches(String regex):判断该字符串是否匹配指定正则表达式

replaceAll(String regex,String replacement):将字符串中所有匹配指定正则表达式的子串替换成replace后返回

类似还有replaceFirst(String regex,String replacement),split(String regex)。*replace(...)不支持正则表达式。

 

 

 

 

 

 

 

 

CH341A编程器是一款广泛应用的通用编程设备,尤其在电子工程和嵌入式系统开发领域中,它被用来烧录各种类型的微控制器、存储器和其他IC芯片。这款编程器的最新版本为1.3,它的一个显著特点是增加了对25Q256等32M芯片的支持。 25Q256是一种串行EEPROM(电可擦可编程只读存储器)芯片,通常用于存储程序代码、配置数据或其他非易失性信息。32M在这里指的是存储容量,即该芯片可以存储32兆位(Mbit)的数据,换算成字节数就是4MB。这种大容量的存储器在许多嵌入式系统中都有应用,例如汽车电子、工业控制、消费电子设备等。 CH341A编程器的1.3版更新,意味着它可以与更多的芯片型号兼容,特别是针对32M容量的芯片进行了优化,提高了编程效率和稳定性。26系列芯片通常指的是Microchip公司的25系列SPI(串行外围接口)EEPROM产品线,这些芯片广泛应用于各种需要小体积、低功耗和非易失性存储的应用场景。 全功能版的CH341A编程器不仅支持25Q256,还支持其他大容量芯片,这意味着它具有广泛的兼容性,能够满足不同项目的需求。这包括但不限于微控制器、EPROM、EEPROM、闪存、逻辑门电路等多种类型芯片的编程。 使用CH341A编程器进行编程操作时,首先需要将设备通过USB连接到计算机,然后安装相应的驱动程序和编程软件。在本例中,压缩包中的"CH341A_1.30"很可能是编程软件的安装程序。安装后,用户可以通过软件界面选择需要编程的芯片类型,加载待烧录的固件或数据,然后执行编程操作。编程过程中需要注意的是,确保正确设置芯片的电压、时钟频率等参数,以防止损坏芯片。 CH341A编程器1.3版是面向电子爱好者和专业工程师的一款实用工具,其强大的兼容性和易用性使其在众多编程器中脱颖而出。对于需要处理25Q256等32M芯片的项目,或者26系列芯片的编程工作,CH341A编程器是理想的选择。通过持续的软件更新和升级,它保持了与现代电子技术同步,确保用户能方便地对各种芯片进行编程和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值