对于JAVA中String的一个总结
今天跟同学讨论一个问题,关于String的内存存放问题,问题如下
String s = "abc";
String t = new String("abc");
其中,s t 都是存放在堆栈里的作为对象引用,我的问题是,后面的对象信息,存在哪里?如果采用new来初始化t,那么"abc"肯定是存放在堆里面的,请问s所对应的"abc"是存放在堆栈中还是堆中。。。
请牛人给个指点
-----------------------------------------------------------------------------------
String问题解决之道:
首先对于这个首字母大写的类型,很多人第一感觉是它应该是个复杂类型,但是事实上是这样吗?下面将从几个方面来分析。
首先是String的创建
String s = "abc";
这个表达式是比较经典的String类型实例的声明方式,其中s是指向"abc"的引用,"abc"是其对象内容,我们在这里姑且叫它为对象(在JAVA中基本类型不属于对象,但是有相应的包装类来实现它们的对象功能),s和"abc"都是存放于堆栈中。
这里需要强调一点,在JAVA的内存分配机制中,共有两中存储区域:堆栈和堆。其中堆栈存放程序过程,以及对象引用以及基本类型,以及这个古怪的对象String。
在堆栈中,JAVA为了能够让程序员轻松的操作字符串,设立了一个字符串容器--缓冲池。如上例中,当我们声明s变量的时候,共分为以下几步,首先是由JVM到缓冲池中查找"abc",缓冲池是在每个线程初始化的时候初始的。如果找到了,那么将已存在的"abc"交给s,如果没有找到,那么将"abc"存放入缓冲池中,并将它的地址付给s,这样就完成了整个付值操作。
这是最简单的一个例子,在这里面,我们可能会有一个问题:
String s = "abc";
String t = "abc";
System.out.println(s==t);
输出结果是什么?结果是true,这是根据上面的讨论,我们可以较为轻松的得到这个答案,那么请看下面这个例子。
String s = new String("abc");
String t = new String("abc");
System.out.println(s==t);
输出结果为false;可以看出,这就是String的恶心之处,它张的既像包装器,又像基本类型。。。好吧,我们暂且不去讨论它的归属问题,毕竟SUN的大牛为了广大程序员着想而设计的。在上例中,我们可以看到,s,t都是通过new的方式创建的,在这里,s,t是存放于堆栈中,他们是指向对象的引用,而两个对象呢,他们都是存放于堆中,作为new出来的正统对象,他们只能呆在堆中。
虽然都是String,虽然他们的内容完全相同,但是由于初始化方式不同,他们也相差甚远。
简单的问题说完
相关文档:
一:准备 www.savarese.org download
1. rocksaw-1.0.0-src.tar.gz
2. vserv-tcpip-0.9.2-src.tar.gz
二:编译源文件得到jar包 使用Ant
1. build vserv-tcpip-0.9.2-src
在vserv-tcpip-0.9.2目录下面建一个tests目录,然后在cmd窗口下进入 ......
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 将汉字转化为全拼
*/
public class CnToSpell {
private static Map<String, Integer> spellMap = null;
// 存放生僻字和其拼音的Map
private static Map<Characte ......
一、面向对象的特征有哪些方面
1.抽象:
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2 ......
package protest;
import java.sql.*;
/**
create proc proc_select
@lname varchar(20),
@address varchar(20) output
as
&n ......