首页 > 其他分享 >String字符串经典问题

String字符串经典问题

时间:2023-09-29 11:31:53浏览次数:28  
标签:java String str2 str1 经典 字符串 new

public class Example{
    String str = new String("good");
    char[ ] ch = { 'a' , 'b' , 'c' };
    public static void main(String args[]){
        Example ex = new Example();
        ex.change(ex.str,ex.ch);
        System.out.print(ex.str + " and ");
        System.out.print(ex.ch);
    }
    public void change(String str,char ch[ ]){
        str = "test ok";
        ch[0] = 'g';
    }
}

上面代码的输出结果是什么?

输出结果为

good and gbc

简单总结一下:直接赋值而不是使用new关键字给字符串初始化,在编译时就将String对象放进字符串常量池中;使用new关键字初始化字符串时,是在堆栈区存放变量名和内容;字符串的拼接操作在程序运行时,才在堆中创建对象。一般,可以认为使用"=="比较的是引用,equals比较的是内容。对于上面的题,看完下面的几个例子,你就会有所感悟:String str = new String("good");是在编译时在堆栈中创建对象和分配内容,而在传参的时候,传递的是地址,把外面的str引用地址复制了一份给方法内的str而不是里面的内容。

看例子:;

例子A:

String str1 = "java";
 String str2 = "java";
 System.out.print(str1==str2);

大部分人也许认为会输出false,因为==比较的是引用,equals比较的是内容。可以在自己的机子上运行一 下,结果是true!原因很简单,String对象被放进常量池里了,再次出现“java”字符串的时候,JVM很兴奋地把str2的引用也指向了 “java”对象,它认为自己节省了内存开销。不难理解吧 呵呵

例子B:

String str1 = new String("java");
 String str2 = new String("java");
 System.out.print(str1==str2);

看过上例的都学聪明了,这次肯定会输出true!很不幸,JVM并没有这么做,结果是false。原因很简单,例子A中那种直接赋值(而没有通过new关键字实例化的字符串变量)声明的方式确实是在 String常量池创建“java”对象,但是一旦看到new关键字,JVM会在堆中为String分配空间。两者声明方式貌合神离,这也是我把“如何创 建字符串对象”放到后面来讲的原因。大家要沉住气,还有一个例子。

例子C:

String str1 = "java";            //直接赋值而不是使用new关键字给字符串初始化,在编译时就将String对象放进字符串常量池中
 String str2 = "blog"; //直接赋值而不是使用new关键字给字符串初始化,在编译时就将String对象放进字符串常量池中
 String s = str1+str2;            //字符串的拼接操作在程序运行时,才在堆中创建对象,
 System.out.print(s=="javablog");

再看这个例子,很多同志不敢妄言是true还是false了吧。爱玩脑筋急转弯的人会说是false吧……恭喜你,你会抢答了!把那个“吧”字去掉你就完 全正确。原因很简单,JVM确实会对型如String str1 = "java"; 的String对象放在字符串常量池里,但是它是在编译时刻那么做的,而String s = str1+str2; 是在运行时刻才能知道(我们当然一眼就看穿了,可是Java必须在运行时才知道的,人脑和电脑的结构不同),也就是说str1+str2是在堆里创建的, s引用当然不可能指向字符串常量池里的对象。没崩溃的人继续看例子D。

例子D:

String s1 = "java";
 String s2 = new String("java");
 System.out.print(s1.intern()==s2.intern());

intern()是什么东东?反正结果是true。如果没用过这个方法,而且训练有素的程序员会去看JDK文档了。简单点说就是用intern()方法就可以用“==”比较字符串的内容了。在我看到intern()方法到底有什么用之前,我认为它太多余了。其实我写的这一条也很多余,intern()方法 还存在诸多的问题,如效率、实现上的不统一……

例子E:

String str1 = "java";
 String str2 = new String("java");
 System.out.print(str1.equals(str2));

无论在常量池还是堆中的对象,用equals()方法比较的就是内容,就这么简单!

标签:java,String,str2,str1,经典,字符串,new
From: https://blog.51cto.com/AmbitionGarden/7649241

相关文章

  • JS判断字符串是否全为空
    1、使用trim()方法trim()方法会去除首尾空格,并返回一个处理后的新值<template><divclass="box">content</div></template><scriptsetup>import{ref,reactive,toRefs,watch,computed,defineProps,}from'vue';import{useStore}......
  • 数据结构---字符串
    数据结构---字符串串的定义串是由零个或多个字符顺序排列组成的有限序列空串长度为零的串空白串由一个或多个空格组成的串字符串匹配问题朴素模式匹配模式匹配的查找过程(Find):给定两个字符串变量S和P,其中目标S有n个字符,模式P有m个字符,m<=n。从S的给定位置(通常为S的第......
  • 字符串排序算法+快速排序
    #include<stdio.h>#include<stdlib.h>#include<memory>#include<vector>#include<string>usingnamespacestd;voidswap(int*a,int*b){inttemp=*a;*a=*b;*b=temp;}voidquicksort(int*arr,intsta......
  • python中实现按照固定位数拆分字符串
     001、[root@pc1test2]#lstest.py[root@pc1test2]#cattest.py##测试程序#!/usr/bin/envpython3#-*-coding:utf-8-*-importrestr1="abcdefghijklmn"print(str1)list1=re.findall(".{3}",str1)##按照每3位生成列表print(&qu......
  • Python 中的字符串基础与应用
    在Python中,字符串可以用单引号或双引号括起来。'hello'与"hello"是相同的。您可以使用print()函数显示字符串文字:示例:print("Hello")print('Hello')将字符串分配给变量是通过变量名后跟等号和字符串完成的:示例a="Hello"print(a)多行字符串您可以使用三个引号将多......
  • 2023 ICPC 网络赛2 L Super-palindrome 字符串 border KMP dp
    传送门给出一个\(5000\)长的字符串判断有多少个连续子串是超级回文的。这里超级回文的定义是将字符串分成\(2k\)段每段按照回文对应相等。设\(f_{l,r}\)表示区间\(l,r\)是否是符合要求的。引入\(border\)的定义:最长的前缀和后缀匹配长度。容易想到我们如果暴力枚举每个区间来......
  • 随想录Day8|344. 反转字符串、541. 反转字符串Ⅱ、LCR 122. 路径加密、151. 反转字符
    随想录Day8|344.反转字符串、541.反转字符串Ⅱ、LCR122.路径加密、151.反转字符串里的单词、LCR182.动态口令 题目越来越长了…… 344.反转字符串文章&视频讲解编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数......
  • string_list_map_date_dart
    title:DartString、List、Map、Date常用方法小结tags:[Flutter,Dart,常用方法小结]categories:常用方法keywords:常用方法小结,string,list,map,date,dartdescription:dart常用方法小结hot:truedate:2020-08-1315:08:00{%noteinfono-icon%}  今日心情......
  • string_array_object_date_php
    title:PHPString、Array、Object、Date常用方法小结tags:[PHP,常用方法小结]categories:常用方法keywords:常用方法小结,string,array,object,date,phpdescription:php常用方法小结Others:truedate:2020-07-2209:08:00{%noteprimaryno-icon%}  大自然的......
  • ASP.NET截取字符串函数
    #region截取指定字数字符串///<summary>///格式化字符串,取字符串前strLength位,其他的用...代替.///计算字符串长度。汉字两个字节,字母一个字节///</summary>///<paramname="str">字符串</param>///<paramname=......