null的伟大与可怕 之 String字符串 1

2024-02-19 20:08

本文主要是介绍null的伟大与可怕 之 String字符串 1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

null的伟大与可怕 之 String字符串

null的伟大与可怕 之 String字符串 1
http://blog.csdn.net/sunrainamazing/article/details/71591334
null的伟大与可怕 之 String字符串方法2
http://blog.csdn.net/sunrainamazing/article/details/71593030
null的伟大与可怕 之 Optional操作 3
http://blog.csdn.net/sunrainamazing/article/details/71596437

基本类型会被自动初始化为
byte short int long –> 0
float double –>0.0
boolean –> false
char –> ” 转换成int 为 0 空字符
引用类型则统一为 null ,但是对象引用会被初始化为 null。
当尝试调用null对象的方法,就会抛出空指针异常。
但是 通常,print 一个 null 对象而不会抛出异常,且输出的值为 null。
那么为什么可以输出一个 null 对象不会抛出异常且值为null?
是不是null对象的值就是null呢?

package sun.rain.amazing.strnull;/*** Created by sunRainAmazing on SUN_RAIN_AMAZING* @author sunRainAmazing*/import sun.rain.amazing.bean.User;
import org.junit.Test;public class StringNull {/*** 测试String 类型的 null对象*/@Testpublic void testStringNull(){String str = null;System.out.println(str);}/*没有抛出异常,而是打印了null。显然问题的线索在于print函数的源码中。我们找到print的源码:public void print(String s) {if (s == null) {s = "null";}write(s);}看到源码才发现原来就只是加了一句判断而已,简单而又粗暴,仅赋值为 null。
*//*** 测试非String 类型的 null对象*/@Testpublic void testNoStringNull1(){Object obj = null;System.out.println(obj);}/**我们再去看看print的源码:public void print(Object obj) {write(String.valueOf(obj));}有点不一样的了,看来秘密藏在valueOf里面。public static String valueOf(Object obj) {return (obj == null) ? "null" : obj.toString();}看到这里,我们终于发现了打印 null 对象不会抛出异常的秘密。print方法对 String 对象和非 String 对象分开进行处理。【String 对象】:直接判断是否为null,如果为 null给null对象赋值为"null"。【非 String 对象】:通过调用String.valueOf方法,如果是 null 对象,就返回"null",否则调用对象的toString方法。通过上面的处理,可以保证打印 null 对象不会出错。*//*===================================null 对象与字符串拼接会得到什么结果?String s = null;s = s + " is not null ";System.out.print(s);===================================编译器对字符串相加会进行优化,首先实例化一个StringBuilder,然后把相加的字符串按顺序append,最后调用toString返回一个String对象。String s = "a" + "b";//等价于StringBuilder sb = new StringBuilder();sb.append("a");sb.append("b");String s = sb.toString();再回到我们的问题,现在知道秘密在StringBuilder.append函数的源码中。//针对 String 对象public AbstractStringBuilder append(String str) {if (str == null)return appendNull();int len = str.length();ensureCapacityInternal(count + len);str.getChars(0, len, value, count);count += len;return this;}//针对非 String 对象public AbstractStringBuilder append(Object obj) {return append(String.valueOf(obj));}//针对 null对象private AbstractStringBuilder appendNull() {int c = count;ensureCapacityInternal(c + 4);final char[] value = this.value;value[c++] = 'n';value[c++] = 'u';value[c++] = 'l';value[c++] = 'l';count = c;return this;}现在我们恍然大悟,append函数如果判断对象为 null,就会调用appendNull,填充"null"。*/@Testpublic void testAppend(){StringBuffer sBuffer = new StringBuffer("ad");sBuffer.append("D_");sBuffer.append(new User());System.out.println(sBuffer.toString());//sun.rain.amazing.bean.User@7aec35a}}

这篇关于null的伟大与可怕 之 String字符串 1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/725816

相关文章

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

C#从XmlDocument提取完整字符串的方法

《C#从XmlDocument提取完整字符串的方法》文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,... 方法1:通过XMLDocument的OuterXml属性,见XmlDocument类该方法获得的xm

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添