Java基础复习笔记03我们不会注意的陷阱

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java基础复习笔记03我们不太注意的陷阱

刘岩

Email:suhuanzheng7784877@

1.虚拟机对字符串的处理

虚拟机是将字符串直接量(不用new声明的)对象放到一个对象池中去缓存的,第一次使用的时候会将其放入池中,如果下次有其他变量访问一摸一样的直接量的话直接从对象池中去取该直接量,而不是又再生成一个对象。一般该池中的对象都不会被垃圾回收器回收。

str1和str2指向了该对象池的对象位置。

2.编译时能确定的值

实际上str3和str4在内存池中都是指向了"suhuanzhen123"这个字符串对象,所以输出时true。因为str4在编译期间就能确定值是suhuanzhen123,所以JVM不会再创建新的对象。直接从对象池中去取。

3.在编译期间不能确定的值

如果字符串的拼接包含了函数、变量等等编译时不确定因素,那么此时就不能指向对象

4.在编译时就能确定值的字符串变量创建值

实际上仅仅创建了一个对象——suhuanzhen123,缓存到对象池。

5.StringBuilder和StringBuffer的区别

一般在单线程的系统环境下优先使用StringBuilder,因为它是非线程安全的。而在多线程的环境下,比如Web系统,优先使用StringBuffer,因为它当中绝大部分方法都使用了synchronized进行修饰,保证了多线程环境下的线程安全问题。

6.字符串之间的比较

用一个线程池的常量对象和一个变量、函数返回值比较直接使用==其实就可以了比如:

输出的是true;

应该用

7.

上图程序实际上就是类型自动提升发生了错误,num本身是int型,而num = num+33.567;

表达式中使用了double类型的数值,那么此表达式会自动向最高级别的基本类型转型,但是呢num自身是int,会提示不能向上转换的编译错误。如果程序这么写

就不会报错了。

赋值运算中基本数据转型的级别从高到低排序是String->double->float->long->int->chart、short->byte。

如果运算中含有字符串变量,那么二话不说,此表达式所有的运算最后的返回值就是一

所以最高级别还是String。

8.符合运算符中的隐式类型转换

在符合运算符中实际上存在着一个隐藏的类型转换

也就是说符合运算符自身还隐式地包含了一个强制转型的动作。这样做有时候会失去精

-3826

9.

第一个循环输出无任何问题,第二个循环报出转型异常。换几话说,集合本身可以存储不同类型元素的对象的,只不过自从JDK1.5之后出现了泛型,才使我们很多人觉得集合变量仅仅能存一种类型的对象元素。泛型是为了在编译时更好的排除类型转换带来的繁琐检查。而在大多数应用中确实集合中就是同类型的元素。而泛型配合上加强的新循环,它会强制进行单一类型的转型操作。所以第二个循环的的结果就是

在mynew.getId()这一句中实际上编译器这时候仅仅将它识别为Number了,直接当做Integer使用会报错,除非强制转型方可当做Integer来使用。这里就相当于将泛型信息擦除了,程序只有到了真正运行时环境下才能把其当做Integer来用,编译期间他不认识其实质面目。Java擦除泛型信息是将该对象所有的泛型信息全部擦除掉,不仅仅是那

执行MyTT my2 = myTT;实际上是擦除了泛型的所有信息,就连之前定义的public List findRows()也被无辜的擦除了泛型信息。编译时只能认识findRows方法返回的是List而不是List

直接用String[] array = str.split(".");不起作用,因为”.”代表可以匹配任意字符,必须转义。

11.什么样的对象存在线程安全问题

当我们刚学Java的时候不会考虑多线程的问题,在自己的IDE环境下运行成功了就行了,不会考虑并发使用此程序的时候会出现什么情况。等做程序员一段时间后发现自己编写的程序确实存在,多线程安全问题。之后走火入魔似地给自己写的方法加上synchronized。其实我们有时候没搞懂什么情况下会出现线程安全的问题。如果我们开发的是单机版的C/S应用系统,客户的计算机就是软件产品的服务器,那么会不会有并发现象呢?只要不是恶意恶搞你的软件,一般一个客户就对应着一个服务,这个时候不存在并发访问的问题,所以一般情况下不会考虑多线程的问题。如果在基于B/S的Web 系统中,可能服务器是一台机器,世界各地的客户都来访问你开发的系统,为这些世界各地的客户提供服务,这个时候可能会出现线程安全的问题。为什么说可能,而不是一定呢?如果你的所有的类和类之间的调用都是通过new一个新的对象为之服务(极端情况下还真有),那么new实际上是在服务器内存中新开辟一块内存空间承载对象,那么这种极端情况是不存在线程安全问题的,只要您的服务器内存极大——1TB内存,每日客户量在2万人左右,估计运行1个月应该差不多没什么问题。不过考虑成本,一般没这样高级的服务器让这种极端的程序运行吧。那么最多的就是类之间的调用不是永远的new一个新的出来,而是为了节省资源,使用对象缓存池或者干脆整个应用软件调用比较频繁的类就使用一个单例对象就得了,每次使用这个对象都是原来已有的,不必在内存新建一个,这样垃圾回收器的工作量也不会那么大。而恰恰是这个时候,这个复用的

对象就会出现线程安全的问题。所以在开发Web系统的时候大家一定要小心自己编写的类给别人调用的时候是否存在线程安全的问题。

Thread-0从numIhread=1下次访问的时候一下子变成了numIhread=8,谁干的?这都是Thread-1影响的。

运行后效果片断如下

相关文档
最新文档