首页 > 试题广场 >

不考虑反射,String类型变量所指向内存空间中的内容是不能

[单选题]

不考虑反射,String类型变量所指向内存空间中的内容是不能被改变的 ( )



  • 正确
  • 错误
玩文字游戏呢!指向的内容在常量池中不可以变,但是可以改变string的指向
发表于 2017-06-05 19:53:20 回复(11)
String类不可变,指的是String对象内容不可变,因为'String对象存在常量池中,而String的引用是可以可变,可以为String引用赋予新的对象字符串。
发表于 2017-07-13 17:31:15 回复(2)
String 类的源码实现是 final 修饰的 char 数组,因此其在字符串常量池中的内容是不可变的。
但是 String 类型的变量的指向是可以改变的,比如池子中有两个字符串内容:"ABC" 和 "abc",定义一个 String 变量 str,既可以指向"ABC",也可以改变为指向"abc"。
发表于 2018-02-24 14:53:38 回复(3)
这个题蛮2的
发表于 2017-05-23 19:46:47 回复(3)
String类是不可改变的,实质String对象内容不可变,String对象存在于常量池中,而String引用是可以改变的,可以赋予新的对象字符串
发表于 2017-07-18 19:25:14 回复(0)
指向的内容不可改变,但是指向哪个内容是可以变的,为String赋新的值可以理解为其实就是指向新的内容,原内容就舍弃了
发表于 2017-05-22 21:40:46 回复(1)
首先说一下 String 类型的两种初始化方法
  1. String s = "yyx";
  2. String t = new String("zm");
    第一种方法的初始化过程:首先在常量池中看有没有现成的 "yyx" 字符串常量,如果有,返回其在常量池中的地址给 s;若没有,则在常量池中创建一个 "yyx" 字符串常量,然后返回地址给 s。

    第二种方法的初始化过程:在堆中创建一个对象空间,里面维护了一个 value 属性,value 在源码中的定义如下:
    private final byte[] value;
    value 指向了常量池中的字符串常量,即如果常量池中有 "zm",则用 value 指向它;若无,则创建再指向它。

    所以第一种方式是通过 String 对象引用直接指向字符串常量,第二种是通过 String 对象引用指向堆内存空间,然后 value 指向字符串常量。

    我们再来看问题:String 类型变量所指向的内存空间中的内容:
    如果是第一种,则指向的是常量池中的字符串常量,当然不可以改变;
    如果是第二种,则指向堆内存,堆内存中的 value 是 final 类型的,所以也是不可改变(这里不可改变的是 value 的值,也就是 value 所保存的地址值)

    欢迎各位交流讨论。。。

发表于 2023-02-23 09:22:05 回复(1)
//字符串对象的比较
String str = "name";
String s = "name";
System.out.println(s == str);// true
String s1 = new String("name");
String s2 = new String("name");
System.out.println(s1 == s2);//false
System.out.println(s1 == str);//false
//看下图
String s3 = str;    // 指向name
str = "Jason";    // 改变对象的引用
System.out.println(s3 == str);//false
System.out.println(s3);    // name

图片说明

发表于 2022-03-31 09:03:47 回复(0)
//字符串对象的比较
String str = "name";
String s = "name";
System.out.println(s == str);// true
String s1 = new String("name");
String s2 = new String("name");
System.out.println(s1 == s2);//false
System.out.println(s1 == str);//false
String s3 = str;    // 指向name
str = "Jason";    // 改变对象的引用
System.out.println(s3 == str);//false
System.out.println(s3);    // name
发表于 2019-09-11 14:18:04 回复(0)
出题人 never mind the scandal and liber
发表于 2019-07-17 16:26:27 回复(1)
重要的事说三遍。内容,内容,内容
发表于 2018-08-14 22:13:07 回复(0)
String类的指向是不可变的,但是内容可以变。好比我是一个String变量a,你是一个字符串内容"hello"。我现在指向着你,但是我是可以指向别人的,是可以更改的,但你的内容“hello”是不可以改的。就这么简单
发表于 2021-12-01 08:46:07 回复(1)
String类是不可变的,对于String的任何改变,都是返回一个新的String对象
发表于 2021-03-31 13:52:40 回复(0)
如果是成员变量,那么他就是不可变的,因为是被final修饰的,如果是对象,那么对象的引用是不可以指向另一个对象,但对象内容可以改变
发表于 2023-04-16 12:50:56 回复(0)
指向的内容在常量池中不可以变,但是可以改变string的指向string类源码是被final修饰的char数组,所以内容不可变 但指向可变
发表于 2022-10-03 21:24:37 回复(0)
String直接字符串常量形式创建存在于常量池中,用new创建则不会进入常量池,需要intern手动入池,通过构造方法创建的字符串包含了两个字符串对象,一个是字符串常量,一个是new出来的,最终会被jvm回收掉一个。那么此题存在常量池中的就是不通过构造方法创建的,字符串内容无法改变,只能换一个指向新的常量。
发表于 2022-01-29 16:14:04 回复(0)
话说不用反射应该不能变吧  string也没提供value[]的set方法
发表于 2022-01-21 16:30:39 回复(0)
string类源码是被final修饰的char数组,所以内容不可变 但指向可变
发表于 2021-06-06 08:03:33 回复(0)
不考虑反射,String被final修饰,不能改变
发表于 2021-05-26 08:00:42 回复(0)