日期:2014-05-20  浏览次数:20708 次

越深入java 就觉得java做得越烂(1.5,1.6的cache设计解决不了根本问题) 问题四 [Java][J2SE / 基础类]
在前面三贴中,我提到过
1 Object 要用8byte指针内存
  see (http://topic.csdn.net/u/20081202/14/e93bd51a-a222-4e00-a7a5-5c6f07e7ed52.html)

2 Long a = 2l; 
Long b = 2l; 
//结果为ture 
System.out.println(a == b); 
Long c = 128l; 
Long d = 128l; 
//结果为false 
System.out.println(c == d);
  see (http://topic.csdn.net/u/20081119/12/b3c447ef-6665-4225-8d36-60e211663bb3.html)

3 JVM会把系统里的字符串常量,缓存到JVM中(在java中如果你定义N多个字符变量,值是一样的,实际在JVM中只有一份)

上面3个问题合起来可以说明一个问题:
java对基础数据的cache封装方案是不正确的,应当只能算是曲线救国,解决不了根本问题。
因原很简单:java应当cache 字符,而不是这符串String,
最好的选择是:cache utf-16le(java用的内部字符编码),而java确不是这样做的。
导致的问题:a)符串String 常量是无法确定的,如果在一个系统中使用过多的常量,会让内存涨破。
  b)不能在for等语句中使用String,这样容易让内存out,系统玩完,(往往刚学的新手不知道)。
  c)逼得大家选择Stringbuffer类来操作可变String,很不方便。

问题核心提示:java 不cache utf-16le的愿因 是代价比cache String要高。为什么要高呢? 请详细了解 三个问题就可以回答。


------解决方案--------------------
bd
------解决方案--------------------
关注中……
------解决方案--------------------
不咋懂,学习……
------解决方案--------------------

------解决方案--------------------
挨个看看......
------解决方案--------------------
不懂,看看。
------解决方案--------------------
搞java也三年了
觉得java最大的弱点是
在控制底层硬件上面太弱了
我也迷惘是不是自己走错方向了
------解决方案--------------------
mark
------解决方案--------------------
从来就不觉得Java做得不烂
软件慢,JRE各种版本冲突,语法e心
------解决方案--------------------
为lz的执着顶一下
------解决方案--------------------
看到各位达人的回帖。。。
是不是JAVA有天生的弊病?

------解决方案--------------------
觉得java最大的弱点是 
在控制底层硬件上面太弱了 

------解决方案--------------------
这一次不太同意楼主的看法

a)符串String 常量是无法确定的,如果在一个系统中使用过多的常量,会让内存涨破。 
字符串常量是硬编码到程序里的,目前再大的系统,编译之后生成的class最多几十M了不起了,估计其中的字符串常量也不会超过10%左右,这对一台服务器来说算不了什么。


b)不能在for等语句中使用String,这样容易让内存out,系统玩完,(往往刚学的新手不知道)。 
c)逼得大家选择Stringbuffer类来操作可变String,很不方便。 
我认为这两点都还好,现在的dot net在字符串操处理方式上和java也是类似的

------解决方案--------------------
关注ing
------解决方案--------------------
up
------解决方案--------------------
ding

------解决方案--------------------
每天进步一点点
------解决方案--------------------
友情up
------解决方案--------------------
友情up
------解决方案--------------------
String作为基础的类,弄成final也是没办法的事情,一是出于效率,二是出于安全性。

b)不能在for等语句中使用String,这样容易让内存out,系统玩完,(往往刚学的新手不知道)。
c)逼得大家选择Stringbuffer类来操作可变String,很不方便。
循环里面用String也是可以的,JAVA的GCJVM会自己调,但有必要的话也可以在程序里手动调GC回收内存。JAVA底层控制弱这没办法,毕竟隔了层JVM,上JNI调C吧。
感觉LZ看问题实在是很偏颇啊,JAVA本身的优势在于稳定性(靠JVM),简单易学(没有指针这些容易让初学者绕晕脑袋的东西)和丰富的资源(开源)。事实证明,JAVA是成功的,1.)JVM实现了跨平台的同时也保证了系统的安全性,你代码漏洞再大也顶多把JVM弄崩溃,OS还是好好的,为此,付出一点性能代价是可以接受的。2.)简单易学意味着能快速的培养大批coder,意味着使用JAVA的公司能用相对便宜的价格招到开发人员,这意味着开发成本降低。