String s1="abc"+"def";String s2=new String(s1);s1与s2地址为何不同
时间: 2024-02-12 18:29:33 浏览: 25
这是因为在创建字符串s1时,Java编译器会将"abc"和"def"合并成一个新的字符串"abcdef"。而在创建字符串s2时,使用new关键字创建了一个新的字符串对象,并将s1中所引用的字符串对象的值复制到s2中。因此,s1和s2虽然包含相同的字符串内容,但它们引用的是不同的字符串对象,因此它们的地址不同。
相关问题
String s1 = "abc"; String s2 = "abc"; System.out.println(s1 == s2); String s3 = "abc" + s1 + "def"; String s4 = "abcabcdef"; System.out.println(s3 == s4); String s5 = s3.intern(); System.out.println(s4 == s5);
s1和s2的结果是true,因为它们都指向字符串常量池中的同一个字符串对象"abc"。
s3和s4的结果是false,因为s是通过字符串拼接生成的新的字符串对象,在堆内存中分配。而s4是直接指向字符串常量池中的对象"abcabcdef"。
s5的结果是true,因为调用s3.intern()方法后,会在字符串常量池中查找是否存在"abcabcdef"这个字符串对象。由于之前已经创建过,所以s5会指向它。所以s4和s5都指向了同一个字符串对象。
下列哪个异常和类型能在以下 try/catch块中被捕获?try { string s1("abc"); string s2("def"); s1.append(s2, 4, 3); cout << s1 << endl; } catch (exception &e) { cerr << "Exception: " << e.what() << endl; cerr << "Type: " << typeid(e).name() << endl; };
在该 try/catch 块中,可以捕获任何继承自 std::exception 的异常,包括 std::logic_error 和 std::runtime_error 等。因此,如果在 try 块中调用 s1.append(s2, 4, 3) 函数时发生异常,该异常会被捕获,并输出异常信息和类型信息。需要注意的是,如果抛出的异常不是 std::exception 的派生类,则无法被该 catch 块捕获。