了解下JAVA的关于Java栈与堆的思索
最后就是我对java的几点希望:首先是IDE工具,有人说java已经很好了,有jbuilder,eclipse,net网页编程Beans等等,但是我认为如果java想超越.net网页编程,那么他首先要解决的就是IDE工具的整合。1.栈(stack)与堆(heap)都是Java用来在Ram中寄存数据的中央。与C++分歧,Java主动办理栈和堆,程序员不克不及间接地设置栈或堆。
2.栈的上风是,存取速率比堆要快,仅次于间接位于CPU中的存放器。但弱点是,存在栈中的数据巨细与保存期必需是断定的,缺少天真性。别的,栈数据能够共享,详见第3点。堆的上风是能够静态地分派内存巨细,保存期也不用事前告知编译器,Java的渣滓搜集器会主动收走这些不再利用的数据。但弱点是,因为要在运转时静态分派内存,存取速率较慢。
3.Java中的数据范例有两种。
一种是基础范例(primitivetypes),共有8种,即int,short,long,byte,float,double,boolean,char(注重,并没有string的基础范例)。这类范例的界说是经由过程诸如inta=3;longb=255L;的情势来界说的,称为主动变量。值得注重的是,主动变量存的是字面值,不是类的实例,即不是类的援用,这里并没有类的存在。如inta=3;这里的a是一个指向int范例的援用,指向3这个字面值。这些字面值的数据,因为巨细可知,保存期可知(这些字面值流动界说在某个程序块内里,程序块加入后,字段值就消散了),出于寻求速率的缘故原由,就存在于栈中。
别的,栈有一个很主要的特别性,就是存在栈中的数据能够共享。假定我们同时界说:
inta=3;
intb=3;
编译器先处置inta=3;起首它会在栈中创立一个变量为a的援用,然后查找有无字面值为3的地点,没找到,就启示一个寄存3这个字面值的地点,然后将a指向3的地点。接着处置intb=3;在创立完b的援用变量后,因为在栈中已有3这个字面值,便将b间接指向3的地点。如许,就呈现了a与b同时均指向3的情形。
出格注重的是,这类字面值的援用与类对象的援用分歧。假定两个类对象的援用同时指向一个对象,假如一个对象援用变量修正了这个对象的外部形态,那末另外一个对象援用变量也马上反应出这个变更。相反,经由过程字面值的援用来修正其值,不会招致另外一个指向此字面值的援用的值也随着改动的情形。如上例,我们界说完a与b的值后,再令a=4;那末,b不会即是4,仍是即是3。在编译器外部,碰到a=4;时,它就会从头搜刮栈中是不是有4的字面值,假如没有,从头启示地点寄存4的值;假如已有了,则间接将a指向这个地点。因而a值的改动不会影响到b的值。
另外一种是包装类数据,如Integer,String,Double等将响应的基础数据范例包装起来的类。这些类数据全体存在于堆中,Java用new()语句来显现地告知编译器,在运转时才依据必要静态创立,因而对照天真,但弱点是要占用更多的工夫。4.String是一个特别的包装类数据。便可以用Stringstr=newString("abc");的情势来创立,也能够用Stringstr="abc";的情势来创立(作为对照,在JDK5.0之前,你从未见过Integeri=3;的表达式,由于类与字面值是不克不及通用的,除String。而在JDK5.0中,这类表达式是能够的!由于编译器在背景举行Integeri=newInteger(3)的转换)。前者是标准的类的创立历程,即在Java中,统统都是对象,而对象是类的实例,全体经由过程new()的情势来创立。Java中的有些类,如DateFormat类,能够经由过程该类的getInstance()办法来前往一个新创立的类,仿佛违背了此准绳。实在否则。该类使用了单例形式来前往类的实例,只不外这个实例是在该类外部经由过程new()来创立的,而getInstance()向内部埋没了此细节。那为何在Stringstr="abc";中,并没有经由过程new()来创立实例,是否是违背了上述准绳?实在没有。
5.关于Stringstr="abc"的外部事情。Java外部将此语句转化为以下几个步骤:
(1)先界说一个名为str的对String类的对象援用变量:Stringstr;
(2)在栈中查找有无寄存值为"abc"的地点,假如没有,则启示一个寄存字面值为"abc"的地点,接着创立一个新的String类的对象o,并将o的字符串值指向这个地点,并且在栈中这个地点中间记下这个援用的对象o。假如已有了值为"abc"的地点,则查找对象o,并前往o的地点。
(3)将str指向对象o的地点。
值得注重的是,一样平常String类中字符串值都是间接存值的。但像Stringstr="abc";这类场所下,其字符串值倒是保留了一个指向存在栈中数据的援用!
为了更好地申明这个成绩,我们能够经由过程以下的几个代码举行考证。
Stringstr1="abc";
Stringstr2="abc";
System.out.println(str1==str2);//true
注重,我们这里其实不用str1.equals(str2);的体例,由于这将对照两个字符串的值是不是相称。==号,依据JDK的申明,只要在两个援用都指向了统一个对象时才前往真值。而我们在这里要看的是,str1与str2是不是都指向了统一个对象。
了局申明,JVM创立了两个援用str1和str2,但只创立了一个对象,并且两个援用都指向了这个对象。
我们再来更进一步,将以上代码改成:
Stringstr1="abc";
Stringstr2="abc";
str1="bcd";
System.out.println(str1+","+str2);//bcd,abc
System.out.println(str1==str2);//false
<p>
由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景,于是改造了Oak, 有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想) 一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。 是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言 是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言 设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧 是一种将安全性(Security)列为第一优先考虑的语言 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。 J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。 其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。 你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。 至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。 是一种突破用户端机器环境和CPU 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 Java是一种计算机编程语言,拥有跨平台、面向对java
页:
[1]
2