Java 字符数组迷惑区-解惑

一直不太清楚Java 里面在申明字符数组的两种方式的应用场景,今天突然小弟顿悟,和大家分享。不对的地方和不足的地方还请大家多多指出。

第一种是:char[] ta = new char[1024];
第二种是: char[] te = {'a','a','b'};

深入解析这两者在运行时候JVM  他是怎么看的:首先当JVM  运行到char[] ta = new char[1024],我们都知道java里面的new 运算符是为该对象申请并分配内存的。那里这里有些童鞋可能会有疑问,字符数组怎么是一个对象呢?还记的有本Java  书上说过,这是遇到的第一个java 对象类型的应用,就是数组。当JVM  读到这么一段代码时,他就懂了,需要分分配一个1024个字符空间大小,并归ta所有(其实就是指ta持有这块内存区域的一个标识,在Java里面叫哈希吗。默认情况下是调用toString()得到,查看Object  中的toString()方法就可以揭开平时为什么我们打印一个java对象,默认是这么一个德性,我们可以对这个输出德性进行改造,但很遗憾不是本篇文章的重点,就不在细说了)。好了JVM读到这里,在内存中的基本模型如下图所示:

从这里可以看到,仅仅只是分配了内存空间,而这块空间什么东西也没有放。

而当执行到 char[] te = {'a','b','c'},时,这个时候就和上面有那么点不一样了,这个时候JVM的处理多了一步,不仅仅需要分配内存,而且还要讲 a b c 这个三个字符存在这块内存区,最后将这块内存的标识交给te 掌管。jvm 执行完这句代码后的内存变化如下图所示:

说到这里,两种情况的应用场景就渐渐的付出水面了。第一种情况仅仅只是先申请内存,后存值,而第二种情况是内存申请好了后立马初始化该值。

因此第一种情况更多是在 需要事先开辟缓冲区的情况下使用的,比如说读取文件,读物网络IO流等等。而第二种情况是当我们预先知道这个字符数组存什么值时就可以选用第二种方案。

【完毕】

 

posted on 2015-10-07 12:43  java华冰  阅读(219)  评论(0编辑  收藏  举报

导航