java中String s = new String("abc")创建了几个对象

一、java中String s = new String("abc")创建了几个对象

答案是两个,现在我们具体的说一下:
String s = new String("abc");
首先我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变量。
所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,在编译阶段,会把字符串文字放在文字池中,文字池的一个好处就是可以把相同的字符串合并,占用一个空间,我们可以用==判断一下两个引用变量是否指向了一个地址即一个对象

public class Demo02 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s1 ="abc";
        String s2 = "abc" ;
        if( s1 == s2 ) System.out.println("s1,s2 refer to the same object");
        else System.out.println("trouble");
    }
}

 输出结果为:s1,s2 refer to the same object

可以看出指向了一个对象,即文字池中保存了一个对象。

二、

String s = new String("abc")实际上是"abc"本身就是文字池中的一个对象,在运行 new String()时,把文字池即pool中的字符串"abc"复制到堆中,并把这个对象的应用交给s,所以创建了两个String对象,一个在pool 中,一个在堆中。下面看这个程序,创建了几个对象。

public class Demo03 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s1 = new String("abc") ;
        String s2 = new String("abc") ;
        if( s1 == s2 ){ //不会执行的语句}
       System.out.println("在堆中创建了一个对象");

    }
        else{
        System.out.println("在堆中创建了两个对象");    
        }
        }
}

 输出结果为:在堆中创建了两个对象
可知在堆中创建了两个对象,但是在文字池中有一个对象,所以共创建了三个对象。

三、再看下一个例子

public class Demo04 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s = new String("abc");
        s = "cba";
        System.out.println(s); 
    }

}

输出结果为:
String s = new String("abc")并不是给s赋值,而是把字符串"abc"的引用交给s持有,现在把s指向字符串"cba","cba"的引用地址把"abc"的引用地址覆盖,所以输出结果为cba

四、

String str=new String("abc");   紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢?

相信大家对这道题并不陌生,答案也是众所周知的,2个。

接下来我们就从这道题展开,一起回顾一下与创建String对象相关的一些JAVA知识。  

我们可以把上面这行代码分成String str、=、"abc"和new String()四部分来看待。String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;=是对变量str进行初始化,将某个对象的引用(或者叫句柄)赋值给它,显然也没有创建对象;现在只剩下new String("abc")了。那么,new String("abc")为什么又能被看成"abc"和new String()呢?

我们来看一下被我们调用了的String的构造器: 

public String(String original) {  //other code ...  }   大家都知道,我们常用的创建一个类的实例(对象)的方法有以下两种:

一、使用new创建对象。 

二、调用Class类的newInstance方法,利用反射机制创建对象。

我们正是使用new调用了String类的上面那个构造器方法创建了一个对象,并将它的引用赋值给了str变量。同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是"abc"。由此我们又要引入另外一种创建String对象的方式的讨论——引号内包含文本。

这种方式是String特有的,并且它与new的方式存在很大区别。 

String str="abc";  

毫无疑问,这行代码创建了一个String对象。 

String a="abc";  String b="abc";   那这里呢?

答案还是一个。 

String a="ab"+"cd";   再看看这里呢?

答案是三个。

说到这里,我们就需要引入对字符串池相关知识的回顾了。  

在JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。由于String类是final的,它的值一经创建就不可改变,因此我们不用担心String对象共享而带来程序的混乱。字符串池由String类维护,我们可以调用intern()方法来访问字符串池。  

我们再回头看看String a="abc";,这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。因此,我们不难理解前面三个例子中头两个例子为什么是这个答案了。

只有使用引号包含文本的方式创建的String对象之间使用“+”连接产生的新对象才会被加入字符串池中。对于所有包含new方式新建对象(包括null)的“+”连接表达式,它所产生的新对象都不会被加入字符串池中,对此我们不再赘述。因此我们提倡大家用引号包含文本的方式来创建String对象以提高效率,实际上这也是我们在编程中常采用的。

  • 17
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 在Java,可以使用Integer类的静态方法parseInt()来将十六进制字符串转换为对应的整数,然后使用Character类的静态方法toString()将整数转换为对应的字符。另外,可以使用StringBuilder类来拼接字符串。 首先,需要将十六进制字符串转换为十进制整数。例如,将字符串"616263"转换为整数可以使用如下代码: ``` int decVal = Integer.parseInt("616263", 16); ``` 然后,使用整数对应的字符创建字符串。例如,可以使用如下代码将整数decVal转换为字符: ``` String strVal = Character.toString((char) decVal); ``` 如果要将多个十六进制字符串转换为字符串,可以使用StringBuilder类来拼接字符串。例如,将字符串"616263646566"转换为"abcdefgh"可以使用如下代码: ``` String hexStr = "616263646566"; StringBuilder sb = new StringBuilder(); for (int i = 0; i < hexStr.length(); i += 2) { String hexPair = hexStr.substring(i, i + 2); int decVal = Integer.parseInt(hexPair, 16); sb.append(Character.toString((char) decVal)); } String strVal = sb.toString(); ``` 以上代码将每两个字符作为一个十六进制字符串,将其转换为对应的字符,并使用StringBuilder类进行拼接,最后得到字符串"abcdefgh"。 ### 回答2: 在Java,将十六进制转换为字符串有几种方法。下面我会介绍其的两种常用方法。 第一种方法是使用`Integer.parseInt()`和`Integer.toHexString()`函数。可以先将十六进制字符串转换为整数,然后使用整数转换为字符串。具体步骤如下: ```java String hexString = "616263"; // 十六进制字符串 int intValue = Integer.parseInt(hexString, 16); // 将十六进制字符串转换为整数 String stringValue = Integer.toString(intValue); // 将整数转换为字符串 System.out.println(stringValue); // 输出字符串 "616263" ``` 第二种方法是使用`Hex.decodeHex()`函数和`new String()`构造函数。先将十六进制字符串解码为字节数组,然后使用字节数组创建字符串。具体步骤如下: ```java import org.apache.commons.codec.binary.Hex; // 需要导入Apache Commons Codec库 String hexString = "616263"; // 十六进制字符串 byte[] byteArray = Hex.decodeHex(hexString); // 将十六进制字符串解码为字节数组 String stringValue = new String(byteArray); // 根据字节数组创建字符串 System.out.println(stringValue); // 输出字符串 "abc" ``` 以上是两种常用的将十六进制字符串转换为字符串的方法。你可以根据具体的需求选择适合自己的方法。 ### 回答3: 在 Java ,我们可以使用一些方法将十六进制数据转换为字符串。 首先,我们需要确保要转换的十六进制数据是一个有效的字符串。我们可以使用`String`类的构造函数来创建一个新的字符串对象,该对象接收一个字节数组作为参数,并使用指定的字符集将该数组解码为字符串。例如: ```java byte[] hexBytes = {0x68, 0x65, 0x6c, 0x6c, 0x6f}; // 十六进制数据 String hexString = new String(hexBytes, StandardCharsets.UTF_8); System.out.println(hexString); // 输出 "hello" ``` 这里,我们将十六进制字节数组 `{0x68, 0x65, 0x6c, 0x6c, 0x6f}` 使用 UTF-8 字符集解码为字符串 "hello"。 另外,如果十六进制数据包含大量字节,则可以使用`StringBuilder`类来构建字符串对象,以提高性能。例如: ```java byte[] hexBytes = {0x68, 0x65, 0x6c, 0x6c, 0x6f}; // 十六进制数据 StringBuilder hexStringBuilder = new StringBuilder(); for (byte b : hexBytes) { hexStringBuilder.append(String.format("%02x", b)); } String hexString = hexStringBuilder.toString(); System.out.println(hexString); // 输出 "68656c6c6f" ``` 在这个例子,我们使用`StringBuilder`类来逐个追加每个字节的十六进制表示到字符串,最后调用`toString()`方法将`StringBuilder`对象转换为一个字符串。 这些方法可以使我们在 Java 将十六进制数据转换为字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值