字符串问题?

问题描述

public class testNull {/** * @param args */public static void main(String[] args) {String a=null;String b="";String c=b+a; //String c=b+a;System.out.println(c);//输出都为null}}结果都为null,有人可以帮助解释一下吗?

解决方案

对String的+操作实际上是通过StringBuffer实现的,也就是append方法该方法会将将null转换为“null”字符串,所以得到的结果是c="null"
解决方案二:
String a=null; 'aconst_null 'astore_0String b=""; 'ldc "" 'astore_1String c=b+a; 'new Ljava/lang/StringBuilder; 'invoke_special Ljava/lang/StringBuilder.<init>()V 'aloat_1 'invoke_virtual Ljava/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder; 'aloat_0 'invoke_virtual Ljava/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder; 'invoke_virtual Ljava/lang/StringBuilder.toString()Ljava/lang/String; 'astore_2System.out.println(c); 'get_static Ljava/lang/System.out; 'aload_2 'invoke_virtual Ljava/io/PrintWriter.println(Ljava/lang/String;)V编译器在处理string的+运算时使用的是StringBuilder如上面的字节码,b和c的相加是通过两次调用stringbuilder.append方法实现,第一次调用时参数是"",此时stingbuilder的内容没有变化,第二次调用的参数为null,此时stringbuilder的内容为“null” ,然后调用toString方法并将结果赋值给c参考AbstractStringBuilder的append实现public AbstractStringBuilder append(String str) { //当参数为null时设置参数为"null"388 if (str == null) str = "null";389 int len = str.length();390 if (len == 0) return this;391 int newCount = count + len;392 if (newCount > value.length)393 expandCapacity(newCount);394 str.getChars(0, len, value, count);395 count = newCount;396 return this;397 }
解决方案三:
具体原因不是很明确,不过String b = "|";String a = null;Integer i = null;Object o = null;boolean s1 = true;boolean s2 = false;String c = a + b + i + b + o + b + null + b + s1 + b + s2;System.out.println(c);从上面代码可以看出 String 相加操作,对于正常的对象类型,采取的策略是“Java 语言提供对字符串串联符号("+")和其他对象到字符串的转换的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中所有类继承”而对于一下类型的数据,则转换为一种字符串意义的表达null -- "null "true -- "true "false -- "false " 希望有人能从VM角度解释一下 共同学习
解决方案四:
二楼说的是,一楼的还得回去复习
解决方案五:
输出一下 a == null 和 c == null,就看到不同了
解决方案六:
null是一个关键字,用来标识一个不确定的对象。因此可以将null赋给引用类型变量,但不可以将null赋给基本类型变量。String a=null; String b=""; String c=b+a; a 是String 类型 但是他是不确定的对象! 是 null b 是string 类型 确定的 字符串对象 分配了内存的!a+b =c c 也是不确定的对象! 所以是null

时间: 2024-10-31 05:15:36

字符串问题?的相关文章

Python检测字符串中是否包含某字符集合中的字符

  这篇文章主要介绍了Python检测字符串中是否包含某字符集合中的字符,需要的朋友可以参考下 目的 检测字符串中是否包含某字符集合中的字符 方法 最简洁的方法如下,清晰,通用,快速,适用于任何序列和容器 代码如下: def containAny(seq,aset): for c in seq: if c in aset: return True return False 第二种适用itertools模块来可以提高一点性能,本质上与前者是同种方法(不过此方法违背了Python的核心观点:简洁,清

在Python中处理字符串之isdecimal()方法的使用

  这篇文章主要介绍了在Python中处理字符串之isdecimal()方法的使用,是Python入门学习的基础知识,需要的朋友可以参考下 isdecimal()方法检查字符串是否仅由十进制字符组成.此方法只存在于unicode对象. 注意:要定义一个字符串为Unicode,只需前缀分配'u'左引号.以下是示例. 语法 以下是isdecimal()方法的语法: ? 1 str.isdecimal() 参数 NA 返回值 如果字符串中的所有字符为十进制此方法返回true,否则返回false. 例子

php查询相似度最高的字符串的方法

 这篇文章主要介绍了php查询相似度最高的字符串的方法,涉及php操作字符串及数组实现相似度算法的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php查询相似度最高的字符串的方法.分享给大家供大家参考.具体如下: 根据传入的字符串和数组,返回数组中相似度最高的字符串 1. PHP代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 function closest_word($input, $words) { $shortest

md5 16位二进制与32位字符串相互转换

 密码很多时候都会用 md5保存,并且很多时候都是16位二进制格式的md5,php 里面 md5($str, true) 可以很方便的获取.更多时候md5结果是一组32个字符组成的字符串,其实转换很简单   代码如下: <?php   $str = 'test'; $cm = md5($str); $bm = md5($str, true);   $cstr = implode(unpack('H*', $bm)); $bstr = pack('H*', $cm);     echo 'str:

PHP字符串的连接

 这篇文章主要介绍了PHP字符串的连接的简单实例,有需要的朋友可以参考一下 很多时候我们需要将几个字符串连接起来显示,在PHP中,字符串之间使用"点"来连接,也就是英文中的句号".",具体使用方式如下: 代码如下: <?php   //定义字符串   $str1 = "Hello World!";   $str2 = "Welcome to HutaoW's BLOG!";     //连接上面两个字符串 中间用空格分隔

ASP中一个字符串处理类(VBScript)

vbscript|字符串 这个类是用于处理字符串的,是老外写的,我把里面的功能和参数加了说明 使用方法: =============== test.asp================ <!--#include file="StringOperations.asp"--> <%dim strset str = New StringOperations test = str.toCharArray("check this out") respons

asp.net.想要实现一个文字字符串转换成MP3和wav格式的语音

问题描述 asp.net.想要实现一个文字字符串转换成MP3和wav格式的语音 2C 文字字符串转换成MP3和wav格式的语音文件并且存入数据库,请问如何实现.需要转换成音频文件后可以读出文字内容 解决方案 你需要一个与字符对应的音频库,就像电子琴.比如1对应声音多,2对应声音来,3对应声音咪--,还有长音,短音,4分,8分等等,当你输入一个字符串时,找到跟他对应的声音,就能实现准确的转换了.

c-关于C字符串数组格式化输出的一些小问题

问题描述 关于C字符串数组格式化输出的一些小问题 尝试写了一个输入输出文件和小程序,因为出问题的就只有这两行代码,所以没有把其他代码贴上来 最初代码是这样的 head[][5] char head[][5] = { "id", "name", "age", "grade" }; fprintf ( input_file, "%st%st%st%sn", head[0], head[1], head[2],

实用技巧:PHP截取中文字符串的问题

技巧|问题|中文|字符串 以下代码试用于GB2312编码,截取中文字符串是PHP中一个头疼的问题,解决方法是根据值是否大于等于128来判断是否是双字节字符,以避免出现乱码的情况.但中英文混合.特殊符号等问题总是存在,现在写一个比较全面的,仅供参考: 程序说明: 1. len 参数以中文字符为标准,1len等于2个英文字符,为了形式上好看些 2. 如果将magic参数设为false,则中文和英文同等看待,取绝对的字符数 3. 特别适用于用htmlspecialchars()进行过编码的字符串 4.

Sql Server实现自定义拆分字符串函数Split()

经常我们要用到批量操作时都会用到字符串的拆分,郁闷的是SQL Server中却没有自带Split函数,所以我们只能自己动手来解决一下.为了减少和数据库的通讯次数,我们都会利用这种方法来实现批量操作.当然有时我们会借助Execute这个方法来实现,利用这个方法有一个不好的地方就是她只认识以","分割的字符串,在传IDs批量操作的时候还是可以达到目的,但是经常我们要用到更复杂的操作时我们就需要自己动手来完成了...... 1.当我们需要传入很长的字符串是我们可以借助NText和Text类型