`

1、字符串

 
阅读更多
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(s==s2);
		System.out.println(s1==s2);
	}

  执行上面代码第一行的时候会生成两个对象,当用new的方式来创建字符串时,系统会先在String pool里查找有没有“abc"这个字符串,发现没有,然后就在String pool中创建一个"abc"这样的字符串,再将这个字符串复制到内存的堆中,在栈中创建一个叫s的指针并指向堆中 的复制过来的"abc",所以第一个语句会生成两个对象一个是String pool中的,一个是堆中的,且两个内容都是"abc"

      执行到第二句的时候,系统一样会先去查找String pool中是否存在"abc",因为第一句后string pool中已经有这样的字符串,所以发现有,然后再将栈中的s1指针指向String pool 中的"abc",这句语句没有产生任何对象。

      执行到第三句的时候,系统也会先去查找String pool中是否存在"abc",发现有,且因为是new一个字符串,所以将string pool中的字符串复制到堆中,再将s2指和堆中 的这个内容为"abc"的对象,这时加上第一个语句,堆中共有两个对象,且内容都为"abc"。

      在java中==比较的是两个对象的地址,或者是 说看两个对象的引用是否指向同一个对象,所以综上所述,上面程序执行的结果全部是false

 

API对String的构造方法的解释:

String
public String(String original)初始化一个新创建的 String 对象,表示一个与该参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的一个副本。由于 String 是不可变的,不必使用该构造方法,除非需要 original 的显式副本。 

参数:
original - 一个 String。
 

再看下面的程序:

public static void main(String[] args) {
		String s=new String("abc");
		String s1 = "abc";
		String s2=new String("abc");
		
		System.out.println(s==s.intern());
		System.out.println(s1==s1.intern());
		System.out.println(s.intern()==s2.intern());
	}

 API中intern()方法的解释:

intern
public String intern()返回字符串对象的规范化表示形式。 
一个初始时为空的字符串池,它由类 String 私有地维护。 

当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。 

它遵循对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。 

所有字面值字符串和字符串赋值常量表达式都是内部的。字符串字面值在《Java Language Specification》的 §3.10.5 中已定义。 


返回:
一个字符串,内容与此字符串相同,但它保证来自字符串池中。

 

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

    s.intern()按API的说法,它首先会去string pool中查找是否存在与s值相同的字符串,也即是"abc",发现有,就返回这个string pool中的字符串,也即是返回string pool中的字符串的地址,即s1(因为s1才是指向string pool中"abc"值的指针)所以这个语句为false

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

    同理,这个语句返回的为true

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

   这个语句也返回true

 

 

再看下面的程序:

public static void main(String[] args) {
		String hello = "hello";
		String hel="hel";
		String lo = "lo";
		
		System.out.println(hello=="hel"+"lo");
		System.out.println(hello=="hel"+lo);
	}

 如果连接符加号左右两边都是字符串常量,系统会将两个字符串拼接起来,再到string pool中找,如果有则不创建新的字符串,直接返回该字符串,如果没有才在string pool中创建,所以第一个语句返回的应该是true

如果连接符加号左右两边有不是字符串常量的时候,也即是存在字符串变量的时候,系统不再会在string pool中查找字符串了,它会直接在堆中创建一个它们拼接起来的字符串对象,所以第二个输出为false,因为它们是两个不同的对象,一个是指向string pool中的,另一个是指向堆中的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    rf.rar_RF 字符串截取_Rf字符串比较_rf字符串切割

    1. RF字符串截取: 正则表达式提供了灵活的字符串截取方式。通过定义匹配模式,可以精确地提取出字符串中符合特定规则的部分。例如,如果你有一个URL字符串`http://www.pudn.com/downloads123/ebooks/xxx.zip`,你...

    请用指针数组的方法将字符串排序

    在IT领域,特别是编程技术中,使用指针数组对字符串进行排序是一个常见且实用的技巧。根据提供的代码示例,我们可以深入探讨这一知识点,包括其原理、实现过程以及实际应用。 ### 使用指针数组对字符串排序的原理 ...

    VB拆分字符串,分隔字符串

    在VB(Visual Basic)编程中,处理字符串是常见的任务之一,其中包括将一个长字符串拆分成多个子字符串。这个过程通常称为“字符串拆分”或“分隔字符串”。在这个主题中,我们将深入探讨VB中如何实现这一操作,以及...

    [字符串]字符串提取(获取两个字符串中间的字符串)

    1. **IndexOf**:此方法用于查找指定字符串在当前字符串中的第一次出现位置。返回值是子字符串的起始索引,如果未找到则返回-1。 2. **Substring**:根据提供的起始索引和长度,截取字符串的一部分。 例如,假设...

    C#字符串删除指定字符串|字符串删除子字符串

    在C#编程语言中,处理字符串是常见的任务之一,其中包括删除字符串中的特定部分或子字符串。本篇文章将详细探讨如何在C#中实现这一功能,包括多种方法和实用技巧。 首先,C#提供了多种内置方法来操作字符串,比如`...

    10.1-1 字符串.flv

    10.1-1 字符串.flv

    labview字符串拆分到数组 支持中文1

    1. 函数选择:在LabVIEW的函数选板中,找到“字符串”>>“操作”>>“分割”类别,选择“字符串到数组”函数。 2. 分隔符设置:此函数需要两个输入,一个是待拆分的字符串,另一个是作为分隔符的字符串或字符。如果...

    C语言字符串转换为Python字符串的方法

    C语言字符串转换为Python字符串的方法 C语言字符串转换为Python字符串是指将C语言中的字符串数据转换为Python中的字符串对象,以便在Python环境中使用。下面详细介绍了C语言字符串转换为Python字符串的方法。 使用...

    LabVIEW的字符串显示控件

    字符串显示控件用来显示字符串,如图1所示。在程序框图中,字符串显示控件提供输入接线端。 在程序框图中,将字符串输入控件接线端与字符串显示控件接线端连接起来,运行程序,就可实现基本的字符串输入和显示功能...

    函数:字符串s1中删除串s2里包含的所有字符(c语言)

    “C语言字符串操作:删除串s2里包含的所有字符” 在C语言中,字符串操作是非常重要的一部分,本篇文章将介绍如何编写一个函数,删除字符串s1中包含的所有字符,这些字符也出现在字符串s2中。 在这个函数中,我们...

    字符串分割的字符串数量 SQL

    -- 初始化子字符串数量为1,因为即使没有分隔符,也至少有一个完整的字符串 WHILE @Location <> 0 -- 如果未找到分隔符,则@Location的值为0 BEGIN SET @Start = @Location + 1; -- 更新查找分隔符的起始位置 ...

    统计字符串中子字符串出现的次数,并返回

    该方法返回子字符串首次出现的索引,如果未找到则返回-1。我们可以通过递归或者循环来计算所有出现的位置。 以下是一个简单的C#函数示例,用于统计子字符串出现的次数: ```csharp public int CountSubstring...

    字符串处理函数

    strstr 函数可以搜索字符串中某个字符串,strstr 找出 str2 字符串在 str1 字符串中第一次出现的位置(不包括 str2 的串结束符)。 strrev 函数可以将字符串中的所有字符颠倒次序排列,strrev 将字符串中的所有字符...

    LabVIEW删除字符串中空格

    1. **字符串函数面板**: 在LabVIEW中,所有的字符串函数都位于函数面板的“字符串”类别下。你可以通过菜单栏的“函数”->“字符串”来访问它。这里包含了大量的字符串处理函数,例如“删除字符”、“替换字符串”...

    字符串相似度算法 字符串相似度算法 字符串相似度算法

    字符串相似度算法 字符串相似度算法是一种衡量两个字符串之间相似度的方法,广泛应用于自然语言处理、数据挖掘、机器学习等领域。在本文中,我们将讨论一种常用的字符串相似度算法:Levenshtein Distance。 什么是...

    将字符串str1 拷贝到str2中

    本篇文章将详细探讨如何通过指针的方式将一个字符串`str1`完整地拷贝到另一个字符串`str2`中。 #### 二、代码解析 首先,我们来看一下示例代码的关键部分: ```c #include void main(void) { char str1[10] = ...

    字符串最后一个单词的长度

    计算字符串最后一个单词的长度,单词以空格隔开。 输入 一行字符串,长度小于128。 输出 整数N,最后一个单词的长度。 样例输入 hello world

    字符串比较1

    1. **字符串比较的基本步骤**: - 从两个字符串的第一个字符开始比较。 - 如果当前字符相同,就继续比较下一个字符。 - 如果当前字符不同,返回它们的ASCII码差值。如果第一个字符串的字符ASCII值大于第二个字符...

    TIA博途-字符转换为字符串以及截取字符串有效字符的具体方法示例.docx

    在处理通信数据时,我们经常需要对字符和字符串进行操作,例如将字符转换为字符串,或者从字符串中截取有效字符。以下将详细介绍在TIA博途中如何实现这些操作。 首先,字符转换为字符串的过程通常涉及到ASCII码。...

    字符串重新排序

    本话题主要关注的是如何对1-9位的数字字符串进行重新排序以形成新的字符串,同时确保新字符串满足特定条件。我们将围绕这个主题展开,深入探讨相关的编程知识和技术。 首先,我们需要理解题目中的“1-9位字符串”。...

Global site tag (gtag.js) - Google Analytics