- 浏览: 115079 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lilei9963:
...
weblogic修改密码 -
timefinger:
不错哦,和楼主一到学习。
Linux的find命令 -
Sailer164:
不错,谢谢
jmock
理解"abc"与new String("abc")的区别,所涉及的知识点如下:
1.引用变量与对象的区别
String s = new String("abc");此语句中的s仅仅只是一个引用变量,它不是对象。
2.java中所有的字符串都是一个String的对象,即"abc"就是一个String对象。
3.字符串对象是怎么创建的?
由于String对象使用的比较频繁,java为了节省内存空间跟运行效率,在编译区间对字符串常量进行了优化,就是把所有的字符串常量放到了常量池,常量池的好处是该池中的所有相同的字符串常量被合并,并只占一个空间。我知道,对两个引用变量使用==可以判断它们的值(引用)是否相等,即可以判断它们是否指向同一对象:
public class String1 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
if(s1 == s2)
System.out.println("1");
else
System.out.println("2");
}
}
输出的结果:1 表明两个字符串常量实际上保存为一个对象,即上面的代码实际上只创建了一个String对象
现在看String s = new String("abc");语句,这里"abc"就是constant pool中的一个对象,而在运行的时候执行new,将constant中的对象copy一份到heap(堆)中,并把heap中的这个对象的引用赋给s,所以这条语句就创建了2个String对象
现在看下面程序:
public class String2 {
public static void main(String[] args) {
String s1 = new String("abc");
String s2 = new String("abc");
if(s1 == s2)
System.out.println("1");
else
System.out.println("2");
}
}
输出的结果:2
那么现在上面的代码创建了几个String 对象呢? (三个,constant pool 一个,heap中两个)
再来看看字符串+和字符串转换的问题,涉及的知识点:
1.字符串运算符(+,+=,java中唯一重载的两个运算符,java不支持运算符重载):如果一个操作数/表达式是String类型,则另一个操作数在运行时要先转换成String对象,并两者串接。看一程序段:
String s = new String("abc");
s = 1+2+s+3+4;
请问一共创建了多少String对象?
如果涉及基本数据类型,则会先转换成包装器类,然后调用toString()方法,我们知道几个包装器类都改写了从Object祖宗类继承的toString()方法(如果是null,则转换为"null"),关于+是串接还是加法,由操作数决定,所以很显然最后结果s="3abc34"。
那按照我上面的说话,语句似乎就应该生成5个String对象,即:
1+2=3,then 3->Integer(3)->"3"in constant
"3"+s(in heap)="3abc"(in heap)
"3abc"+3,first 3->Integer(3)->"3"in constant then "3abc3"
同样"3abc3"+4 then "3abc34"
但这个结果我不知道是不是正确,希望哪位高人指点下!
根据上面所述,应该是7个
String s="abc"; //1个,在constant pool中
String s1=new String("abc"); 两个,一个在heap,一个在constant pool
String s2=new String("a"+"b"); 四个,三个在constant pool,一个在heap
1.引用变量与对象的区别
String s = new String("abc");此语句中的s仅仅只是一个引用变量,它不是对象。
2.java中所有的字符串都是一个String的对象,即"abc"就是一个String对象。
3.字符串对象是怎么创建的?
由于String对象使用的比较频繁,java为了节省内存空间跟运行效率,在编译区间对字符串常量进行了优化,就是把所有的字符串常量放到了常量池,常量池的好处是该池中的所有相同的字符串常量被合并,并只占一个空间。我知道,对两个引用变量使用==可以判断它们的值(引用)是否相等,即可以判断它们是否指向同一对象:
public class String1 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
if(s1 == s2)
System.out.println("1");
else
System.out.println("2");
}
}
输出的结果:1 表明两个字符串常量实际上保存为一个对象,即上面的代码实际上只创建了一个String对象
现在看String s = new String("abc");语句,这里"abc"就是constant pool中的一个对象,而在运行的时候执行new,将constant中的对象copy一份到heap(堆)中,并把heap中的这个对象的引用赋给s,所以这条语句就创建了2个String对象
现在看下面程序:
public class String2 {
public static void main(String[] args) {
String s1 = new String("abc");
String s2 = new String("abc");
if(s1 == s2)
System.out.println("1");
else
System.out.println("2");
}
}
输出的结果:2
那么现在上面的代码创建了几个String 对象呢? (三个,constant pool 一个,heap中两个)
再来看看字符串+和字符串转换的问题,涉及的知识点:
1.字符串运算符(+,+=,java中唯一重载的两个运算符,java不支持运算符重载):如果一个操作数/表达式是String类型,则另一个操作数在运行时要先转换成String对象,并两者串接。看一程序段:
String s = new String("abc");
s = 1+2+s+3+4;
请问一共创建了多少String对象?
如果涉及基本数据类型,则会先转换成包装器类,然后调用toString()方法,我们知道几个包装器类都改写了从Object祖宗类继承的toString()方法(如果是null,则转换为"null"),关于+是串接还是加法,由操作数决定,所以很显然最后结果s="3abc34"。
那按照我上面的说话,语句似乎就应该生成5个String对象,即:
1+2=3,then 3->Integer(3)->"3"in constant
"3"+s(in heap)="3abc"(in heap)
"3abc"+3,first 3->Integer(3)->"3"in constant then "3abc3"
同样"3abc3"+4 then "3abc34"
但这个结果我不知道是不是正确,希望哪位高人指点下!
根据上面所述,应该是7个
String s="abc"; //1个,在constant pool中
String s1=new String("abc"); 两个,一个在heap,一个在constant pool
String s2=new String("a"+"b"); 四个,三个在constant pool,一个在heap
发表评论
-
java 通过反射获取泛型的类型
2014-07-09 10:52 622jdk1.5开始支持泛型,所以我们有时需要把泛型里定义的对象的 ... -
Java生产压缩包的方法
2013-12-02 17:17 627commons-compress-1.5.jar //将by ... -
具有公有地静态final数组域
2013-12-02 17:13 1980public static final String[] CO ... -
Java创建目录
2013-08-03 10:25 779创建目录 private void createMultiDi ... -
字节数组处理
2013-07-23 10:21 761/** * 字节数组转为字符串 * @param fi ... -
Java引用POI实现Word转Html方法
2013-06-25 16:37 11371.下载POI工具并引用 2.读取整个doc文档,获得该文档的 ... -
读取DOC的图片
2013-06-25 16:30 937/** * 读取DOC图片 * @param docP ... -
读取DOC的表
2013-06-25 10:29 484/** * 读取doc的表格数据 * @param d ... -
iText产生PDF文件
2013-06-24 13:53 942package com.test.common.util; ... -
itext itextAsian
2013-06-24 10:22 2061一.准备工作 首先需要加载 itext-1.1 ... -
生成DOC和PDF文件
2013-06-24 10:18 960/** * 仅适合读取doc文 ... -
计算跨度为90天的开始时间和结束时间
2013-05-20 16:57 837public static void main(String[ ... -
Random
2013-03-15 10:09 687返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 in ... -
JSONObject学习
2012-08-07 15:50 1550一、JAR包简介 要使程序可以运行必须引入JSON-l ... -
Djunit
2012-06-25 16:21 5442使用Djunit来mock class Eas ... -
Java URLConnection 总结
2012-06-14 22:25 739针对JDK中的URLConnection连接Servlet的问 ... -
JAVA面试题
2012-05-15 16:56 7901. 在Java中,负责对字节代码解释执行的是(B) A. 应 ... -
HttpSession
2012-04-05 15:35 1570java web服务器通过实现httpsession来保存客户 ... -
JAVA上传文件
2012-03-26 16:10 1276ServletInputStream in = request ... -
JAVA下载文件
2012-03-22 10:49 1042JAVA下载文件: String formatsStr = & ...
相关推荐
这是因为`String`在Java中被实现为一个特殊的类,存储在一个连续的字符数组中,这个特性对于理解它的内部工作原理以及如何有效地使用它至关重要。下面将详细探讨`String`类的数据结构、常用方法以及适用于初学者的...
根据提供的信息,我们可以总结出这份Java基础String类选择题练习题主要聚焦于String及StringBuffer类的使用。尽管具体的题目内容未给出,但从所展示的信息中可以推断出该练习题集涵盖了以下几方面的知识点: ### 一...
在Java编程中,String对象和Byte...总之,Java中的String与Byte类型的转换是编程中不可或缺的部分,尤其在网络编程中,理解这两种类型之间的转换方式及其在网络数据交换中的作用,对于编写高效、可靠的程序至关重要。
Java中的`String`类是编程中最常用的类之一,它在Java的`java.lang`包中...对于初学者来说,理解这些基本操作和原理是掌握Java字符串处理的关键。通过深入学习和实践,你可以更好地利用`String`类来处理各种文本数据。
在Java编程语言中,字符串(String)是一个非常基础且重要的数据类型。它被广泛用于存储文本信息,而关于字符串创建的理解,以及"equals()"方法和"=="运算符的区别,是每个Java开发者都应深入掌握的知识点。 首先,让...
### Java String对象的经典问题 #### 一、String 类与对象机制概述 在Java中,`String`类是一个非常重要的类,它提供...通过以上分析可以看出,深入理解`String`类和对象机制对于编写高效、可靠的Java程序至关重要。
在Java编程语言中,...总之,理解和掌握Java中String与各种进制字符之间的转换对于日常编程至关重要。通过熟练运用上述方法,可以轻松处理与进制相关的任务,无论是处理用户输入、解析文件内容还是与其他系统交互。
在Java编程语言中,String类型扮演着至关重要的角色。...在实际开发中,理解和熟练运用这些知识点,能够有效地编写出高效、安全的Java代码。同时,对于字符串的操作,还需要注意线程安全问题,尤其是在多线程环境中。
Java中的String类是一个重要的数据类型,用于存储和操作字符串数据。String类的特点是不可变性,也就是说,一旦String对象被创建,其值就无法改变。这一特性对于Java内存管理有着重要影响,因为String对象会存储在...
理解并熟练使用`String`类的方法对于Java开发者来说至关重要。通过实践,你可以更好地掌握字符串操作,从而编写出更加高效和优雅的代码。记得在处理字符串时考虑到其不可变性,并根据需要选择合适的方法来完成任务。
标题和描述均强调了在Java中处理`String`对象时可能遇到的陷阱,尤其是在理解和使用`String`的处理机制上。文章由天津工业大学软件工程专业的翁龙辉撰写,旨在深入剖析`String`在Java中的独特行为及其潜在的陷阱。...
深入了解Java中的String类是至关重要的,因为String在Java编程中占据着极其重要的位置。下面将对给定的信息进行深入分析: ### 1. String 类是 final 的,不可被继承 在Java中,`String` 类被声明为 `final` 类型...
Java中的String、Vector和Scanner是三个非常基础且重要的概念,对于初学者来说,理解它们的用法和原理是学习Java编程的关键步骤。 首先,我们来深入理解`String`类。在Java中,`String`是一个不可变的字符序列,这...
### Java中String、十六进制String与byte[]之间的相互转换 在Java开发中,字符串(String)、十六进制表示的字符串以及字节数组(byte[])之间的转换是非常常见的需求,尤其是在处理网络通信、文件读写等场景下。...
以上就是`String`类的一些常见方法,理解并熟练使用它们对于提升Java编程效率至关重要。在实际开发中,开发者通常会结合这些方法来处理字符串,实现各种文本操作。通过阅读和分析`TestString.java`文件,我们可以...
在Java编程中,字符串(String)是非常常见且重要的数据类型。本文主要讨论了如何正确判断Java中的String对象是否为null、空值("")以及它们的地址是否相等。在处理字符串时,了解这些概念对于避免程序出错至关重要。...
总之,`JAVA_String`是Java编程中不可或缺的部分,理解和熟练运用`String`类的方法能帮助我们更好地处理文本数据,提高代码质量和效率。在实际开发中,我们需要根据需求选择合适的方式创建和操作`String`对象,同时...
理解并熟练掌握`String`类的构造函数和各种操作方法,对于任何Java程序员来说都是必不可少的技能。通过本文的介绍,希望能帮助读者加深对`String`类的理解,并在实际编程中更加灵活地运用这一强大的工具。
"深入理解 Java String#intern() 内存模型" Java String#intern() 内存模型是 Java 语言中一个重要的概念,.string#intern() 方法是 Java 字符串常量池中一个重要的组件。字符串常量池是一个固定大小的 HashMap,桶...
### JAVA中String与byte[]的关系解析 在Java编程语言中,`String`对象与`byte[]`数组之间的转换是常见的操作之一。理解这两者之间的关系对于处理文本数据、网络通信及文件读写等任务至关重要。 #### 一、String与...