`
renyanwei
  • 浏览: 70892 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

清晰了解String操作

阅读更多

为了清晰了解String的操作,我们来看一段再经典不过的程序

class StringTest 

{
	public static void main(String[] args) 

	{

		String s=new String("abc");

		String s1="abc";

		String s2=new String("abc");

		System.out.println(s==s1);

		System.out.println(s1==s2);

		System.out.println(s==s2);

	}

}



大伙儿都知道内存中有两块儿存储区域,分别是栈和堆,加上JAVA字符串是由字符串池管理的,所以,我们的内存可以这样划分:



程序开始前所有区域都是空的,现在我们执行第一条语句

 

String s=new String("abc");

 JAVA执行流程是这样的。首先判断字符串池里有没有值为"abc"的对象,由于这行语句实在程序第一句,字符串池是空的,所以,它会现在字符串池里构造一个值为"abc"的对象,然后执行new语句后,再把“abc”拷贝到堆里面,关于一个new String构造方法解释

API 写道
换句话说,新创建的字符串是该参数字符串的副本

 然后s再指向这个对象,如图:

所以说,执行完这一行代码后生成了两个对象,一个是在字符串池里,一个是在堆里

然后看第二句:

String s1="abc";

 执行到这一句时又产生了几个对象?答案是一个也没产生!执行是这样的,当程序看到"abc"后,会先到字符串池里找看有没有"abc",由于执行完第一行语句后字符串池里已经有"abc"了就不再创建,注意这里并没有new的操作,而是直接常量赋值,所以s1会直接指向这个"abc"而不会在堆里产生新的对象,如图


程序接着往下走

String s2=new String("abc");

 这次又产生了几个对象,一个!

程序还是会现在字符串池里找"abc",发现有,就不再字符串池里产生新的对象了,接着执行new操作,记着,在JAVA中,只要出现new操作,一定会有新的对象产生,不管这个对象是否存在多少次,所以它又会在堆里生成一个内容为"abc"的对象,如图

 

好了,只剩下比较了,注意这里是用的是==,在JAVA中,==永远是比较两个引用是否指向同一个对象的,看到上图,答案不用再揭晓了吧

本人初学,可能表达能力不是很好,多以就多画了几个图来表示,呵呵 大牛看了不要见效哈,有什么错误尽管指出,小弟感激不尽,困了,先睡了

38
13
分享到:
评论
70 楼 LD_21 2011-01-02  

69 楼 zhaoyta 2008-12-02  
lovefish 写道

terryang 写道
实在是抱歉,把标题看成了Spring。不错,挺清晰的!  呵呵 我也是

我也看成spring了
68 楼 carlos 2008-11-24  
忽悠人的?

想表达什么?


67 楼 rabbitbug 2008-11-24  
全都是false的
即便是池里没有"abc"
但既然用了new String("abc");
与s2="abc"也是指向不同的
66 楼 renyanwei 2008-11-21  
kcruci 写道

javaoldboy 写道晕了,难道没有人把这段代码跑一遍?         String s=new String("abc");           String s1="abc";           String s2=new String("abc");           System.out.println(s==s1);           System.out.println(s1==s2);           System.out.println(s==s2); 输出结果都是false!所以实际上还是三个对象!同意

javaoldboy 写道

晕了,难道没有人把这段代码跑一遍?
         String s=new String("abc");  
        String s1="abc";  
        String s2=new String("abc");  
        System.out.println(s==s1);  
        System.out.println(s1==s2);  
        System.out.println(s==s2);

输出结果都是false!
所以实际上还是三个对象!


哭了,大哥们  咱们观点一样你嗷嗷叫的干啥啊
65 楼 javaoldboy 2008-11-21  
晕了,难道没有人把这段代码跑一遍?
         String s=new String("abc");  
        String s1="abc";  
        String s2=new String("abc");  
        System.out.println(s==s1);  
        System.out.println(s1==s2);  
        System.out.println(s==s2);

输出结果都是false!
所以实际上还是三个对象!
64 楼 daoyongyu 2008-11-21  
赞一下,楼主写的很清晰。
63 楼 logictic 2008-11-19  
我看了,我更清楚了
62 楼 Suxinf 2008-11-19  
基础牢固啊
61 楼 jesse_zzj 2008-11-18  
LZ用图像把String详细的操作描述了 很名目
60 楼 kph2005 2008-10-27  
讲得很好,清晰易懂.
59 楼 星光闪烁 2008-10-25  
分析的很好,这种拗口的String操作确实要用图来说明才说的清楚
58 楼 snsnx 2008-10-25  
如果是讨论字符串,肯定离不开==和equals()方法,s.equals(s1)能够相等,是因为String重写了Object的equals()方法,
    public boolean equals(Object anObject) {
	if (this == anObject) {
	    return true;
	}
	if (anObject instanceof String) {
	    String anotherString = (String)anObject;
	    int n = count;
	    if (n == anotherString.count) {
		char v1[] = value;
		char v2[] = anotherString.value;
		int i = offset;
		int j = anotherString.offset;
		while (n-- != 0) {
		    if (v1[i++] != v2[j++])
			return false;
		}
		return true;
	    }
	}
	return false;
    }
这是String的equals()方法,而
    public boolean equals(Object obj) {
	return (this == obj);
    }
这是Object的equals方法,比较String的时候,equals()方法不仅在两个对象相同时返回true,而且在对象不相同,但内容相同时也会返回true。
57 楼 alhbdk 2008-10-24  
抱歉,犯了个低级错误,忘记了优先级,我说怎么结果这么奇怪。
56 楼 renyanwei 2008-10-24  
alhbdk 写道

但是把程序改成这样,楼主怎么解释呢?
public class Main {

/**
* @param args
*/
public static void main(String[] args) {

String s  = new String("abc");
String s1 = "abc";
String s4 = "abc";
String s2 = new String("abc");

String s3 = s;



System.out.println("1 s == s1 :"+s == s1);
System.out.println("2 s1 == s2 :  "+s1 == s2);
System.out.println("3 s == s2 :  "+s == s2);
System.out.println("4 s == s3 : "+s == s3);
System.out.println("5 s4 == s1 : "+s4 == s1);
System.out.println("6 s1 == abc : "+s1 == "abc");



}

}


这位哥们儿,首先哈,撇还这道题我们看一个问题,你这个程序有没有毛病,你用了一连串的输出一句
System.out.println("1 s == s1 :"+s == s1);

大哥,编程语言是先进行+运算的哈, 你这么加来加去再比较如果相等我就真要晕死了
你不妨把输出语句变一下先执行比较再连接看看
System.out.println("1 s == s1 :"+(s == s1));
55 楼 alhbdk 2008-10-24  
但是把程序改成这样,楼主怎么解释呢?
public class Main {

/**
* @param args
*/
public static void main(String[] args) {

String s  = new String("abc");
String s1 = "abc";
String s4 = "abc";
String s2 = new String("abc");

String s3 = s;



System.out.println("1 s == s1 :"+s == s1);
System.out.println("2 s1 == s2 :  "+s1 == s2);
System.out.println("3 s == s2 :  "+s == s2);
System.out.println("4 s == s3 : "+s == s3);
System.out.println("5 s4 == s1 : "+s4 == s1);
System.out.println("6 s1 == abc : "+s1 == "abc");



}

}


54 楼 夜行者 2008-10-24  
不错啊,赞一个
53 楼 waterli 2008-10-24  
很不错,谢谢。
52 楼 shaoyx 2008-10-24  
lovefish 写道

terryang 写道实在是抱歉,把标题看成了Spring。不错,挺清晰的!  呵呵 我也是

我也是哎 ^_^
51 楼 lovefish 2008-10-23  
terryang 写道

实在是抱歉,把标题看成了Spring。不错,挺清晰的!

  呵呵 我也是

相关推荐

    std string extention.rar_STL_std string_string 文本、_string stl_s

    在C++标准库(STL, Standard Template Library)中,`std::string`是处理文本数据的基本工具,它提供了一种方便且高效的字符串操作方式。然而,标准库中的`std::string`虽然强大,但并不涵盖所有可能的需求。在这种...

    String index out of 4解决方法

    在深入探讨解决方案之前,首先需要了解为什么会发生这种异常。`StringIndexOutOfBoundsException`异常是由以下几种情况触发的: 1. **索引越界**:当你尝试访问一个字符串中的某个索引时,该索引超出了字符串的实际...

    深入了解java中的String-字符串(csdn)————程序.pdf

    了解String类的特性、创建方式以及常用的API方法对于编写高效的Java代码至关重要。 1. String的特性: - 不可变性:这意味着一旦创建了一个String对象,就不能修改它的内容。对String的任何操作(如添加、删除或...

    StringBoot整合Mybatis案例源码

    Mybatis的主要优点在于它的映射文件,它将SQL与Java代码分离,提供了清晰的数据库操作接口。 整合Spring Boot与Mybatis的过程主要包括以下几个步骤: 1. **添加依赖**:在`pom.xml`文件中,我们需要引入Spring ...

    String类函数用法总结2.docx

    在C++编程语言中,`std::string`是一个非常重要的类...了解并熟练使用这些函数和运算符,能够帮助开发者写出更加清晰和高效的代码。在实际编程中,正确地使用这些方法可以避免内存管理问题,提高程序的可读性和维护性。

    Spring+String+hibenate

    3. **Hibernate**:Hibernate是一个强大的对象关系映射(ORM)工具,它简化了数据库操作,使得开发者可以使用Java对象来处理数据库事务,而无需编写大量的SQL语句。Hibernate通过XML配置文件或注解方式定义对象与...

    第 04 节_GEE 的数据类型 (String, Number).pdf

    虽然在GEE中不常显式进行cast操作,但编写清晰、规范的代码是非常重要的,尤其是在变量赋值时应明确数据格式,以减少潜在的错误。 为了保证代码的规范性和可读性,推荐在编写脚本时使用GEE提供的函数来明确数据类型...

    Redis中最常用的String数据结构.docx

    通过对Redis中SDS数据结构的深入分析,我们可以清晰地了解到它相对于传统C字符串的优势所在。无论是快速获取长度、确保二进制安全性,还是预防缓冲区溢出、减少内存重分配,SDS都为Redis带来了显著的性能提升。在...

    Java string不可变原理实例解析

    在面试中,了解并能够解释Java中的String为什么是不可变的,是展示对Java内存模型和多线程概念理解的很好方式。阅读《Effective Java》等书籍可以帮助深入理解这一设计决策背后的思考。同时,熟悉字符串操作的最佳...

    前端项目-string_score.zip

    在使用这个"string_score"项目前,开发者需要了解Node.js的基本操作,理解如何安装npm包,并熟悉JavaScript编程。在具体应用时,可以通过阅读项目文档,理解评分算法的工作原理,然后根据需求调用相应的API,结合...

    Bulldog,为了简化对sharedpreferences的读写,不要再编写这样的代码prefs.edit().putstring(“somekey”,“somestring”).apply().zip

    2. **读取操作**:Bulldog提供了直观的方法来读取不同类型的值,如`getString(String key, String defaultValue)`、`getInt(String key, int defaultValue)`等。 3. **写入操作**:同样,写入操作也变得非常简单,...

    string-to-ASCII.rar_LabView ASCII

    7. **用户界面设计**:在LabVIEW的前面板上,可能会有清晰的标签和指示器,以便用户理解程序的功能和操作方式。这包括输入字段、按钮、指示灯和标签等。 8. **事件结构**:如果程序响应用户的某些交互,如点击按钮...

    c++ String去除头尾空格的方法

    首先,我们要了解`std::string`对象的一些关键方法。`find_first_not_of`和`find_last_not_of`是两个非常有用的方法,它们分别用于查找字符串中第一个不匹配指定字符集的字符位置和最后一个不匹配指定字符集的字符...

    C#操作ini文件的类库

    类库应提供`CreateSection(string section)`, `DeleteSection(string section)`以及`RenameSection(string oldName, string newName)`方法,以支持对节的操作。 5. **遍历ini文件**:为了方便地遍历ini文件的所有节...

    C#操作INI配置文件的方法

    这样可以使得代码结构清晰,便于其他开发者理解和使用。 总结,C#操作INI配置文件涉及的主要知识点包括: 1. 使用System.IO类库中的StreamReader和StreamWriter进行文本文件读写。 2. 了解INI文件的基本结构和语法...

    jdk中String类设计成final的原由

    - **字符串池**:Java中的`String`类广泛用于存储和操作文本。为了提高性能,Java引入了字符串池(String Pool),它是一个内存区域,存放所有字面量字符串(直接量,如`"hello"`)和通过`new String()`构造的共享...

    C# 中操作API,清晰PDF

    public static extern int MessageBox(int hWnd, string text, string caption, int buttons); ``` - `hWnd`: 父窗口的句柄。 - `text`: 消息文本。 - `caption`: 对话框标题。 - `buttons`: 按钮组合。 ##### ...

    The-string-of-characters-to-replace.zip_字符 替换

    标题 "The-string-of-characters-to-replace.zip_字符 替换" 暗示这是一个关于在字符串中进行字符替换操作的程序,可能是用于文本处理或数据转换任务。这个程序采用了混合编程的方式,结合了汇编语言和C语言,表明它...

    Laravel开发-laravel-string-blade-compiler

    在Laravel框架中,Blade模板引擎是其核心特性之一,它为开发者提供了一种简洁、清晰的语法来创建视图。"Laravel开发-laravel-string-blade-compiler"的主题着重于从字符串动态呈现Blade模板,这在某些场景下非常实用...

    C++文件操作工具类

    这样的设计模式使得文件操作的代码逻辑清晰,易于理解和测试。 总之,“C++文件操作工具类”是一个为了提高开发效率和代码质量而创建的实用工具,它将底层的文件操作接口进行了封装,使得在C++项目中处理文件变得...

Global site tag (gtag.js) - Google Analytics