`

解析Java中的String对象的数据类型

 
阅读更多
       首先String不属于8种基本数据类型,String是一个对象,因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性
 
1. 首先String不属于8种基本数据类型,String是一个对象。

因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。

2. new String()和new String("")都是申明一个新的空字符串,是空串不是null;

3. String str="kvill";

String str=new String ("kvill");的区别:
在这里,我们不谈堆,也不谈栈,只先简单引入常量池这个简单的概念。
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的。class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。

看例1: 
String s0="kvill"; 
String s1="kvill"; 
String s2="kv" + "ill"; 
System.out.println( s0==s1 ); 
System.out.println( s0==s2 ); 
 
结果为:
true
true
首先,我们要知结果为道Java会确保一个字符串常量只有一个拷贝。
因为例子中的s0和s1中的"kvill"都是字符串常量,它们在编译期就被确定了,所以s0==s1为true;而"kv"和"ill"也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中"kvill"的一个引用。
所以我们得出s0==s1==s2;
用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。
看例2: 
String s0="kvill"; 
String s1=new String("kvill"); 
String s2="kv" + new String("ill"); 
System.out.println( s0==s1 ); 
System.out.println( s0==s2 ); 
System.out.println( s1==s2 ); 
结果为:
false
false
false
例2中s0还是常量池中"kvill"的应用,s1因为无法在编译期确定,所以是运行时创建的新对象"kvill"的引用,s2因为有后半部分 newString("ill")所以也无法在编译期确定,所以也是一个新创建对象"kvill"的应用;明白了这些也就知道为何得出此结果了。

4. String.intern():

再补充介绍一点:存在于。class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用;看例3就清楚了
例3: 
String s0= "kvill"; 
String s1=new String("kvill"); 
String s2=new String("kvill"); 
System.out.println( s0==s1 ); 
System.out.println( "**********" ); 
s1.intern(); 
s2=s2.intern(); //把常量池中"kvill"的引用赋给s2 
System.out.println( s0==s1); 
System.out.println( s0==s1.intern() ); 
System.out.println( s0==s2 ); 
结果为:
false
**********
false //虽然执行了s1.intern(),但它的返回值没有赋给s1
true //说明s1.intern()返回的是常量池中"kvill"的引用
true
最后我再破除一个错误的理解:
有人说,"使用String.intern()方法则可以将一个String类的保存到一个全局String表中,如果具有相同值的 Unicode字符串已经在这个表中,那么该方法返回表中已有字符串的地址,如果在表中没有相同值的字符串,则将自己的地址注册到表中"如果我把他说的这个全局的String表理解为常量池的话,他的最后一句话,"如果在表中没有相同值的字符串,则将自己的地址注册到表中"是错的:
看例4: 
String s1=new String("kvill"); 
String s2=s1.intern(); 
System.out.println( s1==s1.intern() ); 
System.out.println( s1+" "+s2 ); 
System.out.println( s2==s1.intern() ); 
 

结果为:
false
kvill kvill
true
在这个类中我们没有声名一个"kvill"常量,所以常量池中一开始是没有"kvill"的,当我们调用s1.intern()后就在常量池中新添加了一个"kvill"常量,原来的不在常量池中的"kvill"仍然存在,也就不是"将自己的地址注册到常量池中"了。
s1==s1.intern()为false说明原来的"kvill"仍然存在;
s2现在为常量池中"kvill"的地址,所以有s2==s1.intern()为true.

5. 关于equals()和==:

这个对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true;而==是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。

6. 关于String是不可变的

这一说又要说很多,大家只要知道String的实例一旦生成就不会再改变了,比如说:String str="kv"+"ill"+" "+"ans";
就是有4个字符串常量,首先"kv"和"ill"生成了"kvill"存在内存中,然后"kvill"又和" " 生成 "kvill "存在内存中,最后又和生成了"kvill ans";并把这个字符串的地址赋给了str,就是因为String的"不可变"产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的。
分享到:
评论

相关推荐

    解析Java中的String对象的数据类型 字符串

    解析Java中的String对象的数据类型字符串 Java中的String对象是一种特殊的数据类型,它不同于基本数据类型,也不同于其他对象。String对象的默认值是null,但它又是一种特殊的对象,有其它对象没有的一些特性。 ...

    java 解析Excel 并判断解析的数据类型__Eclipse工程

    本项目名为"java 解析Excel 并判断解析的数据类型__Eclipse工程",显然是一个使用Java语言在Eclipse环境下实现的程序,其主要功能是读取Excel文件并识别其中各单元格的数据类型。 首先,我们需要了解Java中用于解析...

    java中Object对象String对象的解析.pdf

    "Java 中 Object 对象和 String 对象的解析" Java 中的 Object 对象和 String 对象是两个非常重要的概念。在 Java 中,每个对象都继承自 Object 对象,这意味着每个对象都拥有 Object 对象的方法和属性。String ...

    Java中的String对象数据类型全面解析

    Java中的`String`对象是一种非常特殊的数据类型,虽然它不属于八种基本数据类型(byte, short, int, long, char, float, double, boolean),但它却在编程中扮演着重要角色。`String`是一个对象,这意味着它在内存中...

    java中的String类常用方法解析(一)

    在Java编程语言中,`String`类是使用最频繁的类之一,它代表不可变的字符序列。本文将深入解析`String`类的一些常用方法,帮助开发者更好地理解和使用这个核心类。 1. **构造方法** - `String()`:创建一个空字符...

    Java String与Byte类型转换

    Byte类型是Java的八种基本数据类型之一,用于存储8位二进制值,范围是-128到127。 1. **String转Byte**: - **字面量转换**: 直接使用`getBytes()`方法将字符串转化为字节数组。例如,`byte[] bytes = "Hello"....

    JAVA 解析JSON格式数据

    在实际开发中,可能会遇到JSON格式不正确或者映射到Java对象时类型不匹配的问题。这时,我们需要捕获并处理异常,例如`JsonParseException`、`JsonMappingException`等。 总结,Java解析JSON主要依靠第三方库,如...

    java解析cobol数据

    1. **COBOL到Java的数据类型映射**:COBOL的数值类型(如COMP-3,PACKED-DECIMAL)和字符类型(如PIC X)需要映射到Java的相应数据类型。例如,COMP-3对应Java的byte数组,而PIC X则对应Java的String。 2. **Java...

    java 解析由String类型拼接的XML文件方法

    Java 解析由 String 类型拼接的 XML 文件方法是一种常用的数据解析方式。在实际开发中,我们经常需要解析 XML 文件来获取其中的数据。今天,我们将分享一篇 java 解析由 String 类型拼接的 XML 文件方法,希望对大家...

    java FASTJSON 解析复杂JSON实例源码

    - `JSONObject.parseObject(String jsonString, Class<T> clazz)`:将JSON字符串解析为Java对象,其中`T`是你想要的类类型。 - `JSONArray.parseArray(String jsonString, Class<T> clazz)`:将JSON字符串解析为...

    xstream轻松解析xml到java对象

    然而,处理XML数据时,解析和转换为可操作的对象是一个常见挑战。这时,XStream库就派上了用场。XStream是一个Java库,它能将Java对象序列化为XML,同时也能将XML反序列化为Java对象,极大地简化了XML处理过程。 ...

    string 对象 与json互转

    与此相关的,`String`对象是Java编程语言中的基础类型,用于存储和处理文本数据。在实际开发中,我们经常需要在`String`对象与JSON对象之间进行转换,以满足不同的需求。本文将深入探讨`String`与JSON的互转方法,并...

    String StringBuffer和StringBuilder区别之源码解析

    在Java中,字符串是我们经常使用的数据类型,而String、StringBuffer和StringBuilder是Java中三种常用的字符串类。在这篇文章中,我们将从源码角度对String、StringBuffer和StringBuilder进行深入分析,了解它们之间...

    Java 字符串和基本数据类型之间的转换

    在Java编程语言中,字符串(String)和基本数据类型之间的转换是常见的操作,特别是在处理用户输入、格式化输出或解析数据时。以下将详细介绍如何在Java中进行这些转换。 1. **字符串转基本数据类型** - **整型(int...

    Java Poi 解析EXCEL数据

    在Java世界中,Poi是解析和操作这些文件的首选工具,尤其在数据导入导出、自动化测试、数据分析等领域应用广泛。 Excel文件通常以.XLS或.XLSX格式存在,其中.XLS是早期版本的二进制格式,而.XLSX则是基于Open XML...

    JAVA中string数据类型转换详解

    以下是对Java中String与七种主要数据类型转换的详细解释: 1. **String转long**: 使用`Long.parseLong()`方法可以将一个表示数字的String转换为long类型。例如: ```java String c = "123456"; long n = Long....

    jquery转换java对象

    在上述代码中,`ObjectMapper`的`readValue()`方法接收一个JSON字符串和目标类型,然后返回对应的Java对象。如果`User`类的属性与JSON对象的键相匹配,那么数据就会被正确地映射到对象上。 博客中提到的`json2.js`...

    (Java)json和String互转必备Jar包

    总的来说,这个"(Java)json和String互转必备Jar包"为Java开发者提供了一个便捷的工具,使他们能够在项目中方便地处理JSON数据,无论是从网络获取,还是在本地存储和处理。掌握好这些库的使用,对于提升开发效率和...

    java解析json数据

    Java中解析JSON数据主要依赖于一些库,如org.json库(包含JSONObject和JSONArray类)。 在Java中,解析JSON数据的步骤通常分为以下几个部分: 1. **导入相关库**:首先,你需要在项目中引入JSON库。如果是使用...

Global site tag (gtag.js) - Google Analytics