String类的2种赋值分析

1、字符串常量池

2、String name = new String("你好");

3、String name = "你好";

分析对象在内存中的结构:

常量池--用来存储字符串

你好--是常量;name--是变量

每当new一个对象时,在堆中会生成一个对象,栈中的指针指向堆中。你好是堆内存中存储的值,会将“你好”这个字符串到字符串常量池中去检查,看“字符串常量池”中是否有“你好”这个常量--若没有,就会将“你好”这个字符串存至“字符串常量池”中。

String s1 = new String("你好");

String s2 = "你好";  //最多创建一个字符串对象,有可能不用创建对象

综上,s1在new字符串时,首先在堆中创建对象--“你好”,接着,会将“你好”拿到字符串常量池中再存一遍。(字符串常量池是在堆内存中的)

面试常问:

String s1 = new String("你好");创建几个对象?

回答是:2个 -- 1个是在堆内存中;另一个是在常量池中。

1、在堆中创建的new  2、将“你好”存在字符串常量池中--为了下一次用相同值时,会从常量池中找。

2、简写方式有个好处--会直接让s2到常量池中找,看是否有相同的值,有,直接指向;没有,会在常量池中创建一个“你好”,再让s2指向“你好”。

时间: 2024-10-11 06:27:03

String类的2种赋值分析的相关文章

C++面试中string类的一种正确写法

C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源.具体来说: 能像 int 类型那样定义变量,并且支持赋值.复制. 能用作函数的参数类型及返回类型. 能用作标准库容器的元素类型,即 vector/list/deque 的 value_type.(用作 std::map 的 key_type 是更进一步的要求,本文从略). 换言之,你的 String 能让以下代码编译运行通过,并且没有内存方面的错误. vo

Java面试准备之String类专项突破+源码分析

String的源码中有很多Arrays的方法使用,建议先参阅Arrays的类库 基本介绍: String是一个比较特殊的类,有很多种建立的方法. 如果使用传统的构造方法比如 String s = new String("字符串");这时的对象会在堆上分配,这时候比较两个字符串地址就不相等,而用""双引号包起来的内容会在常量池中做停留,这时如果有两个内容一样的地址就一样了. 因此,使用==来比较字符串是不靠谱的. String类还实现了三个接口:Serializabl

C++ 中string类的三种模拟实现方式

1.原始版本(拷贝构造和赋值运算符重载时,需要重新开辟空间) #include <iostream> #include <string> using namespace std; class String { friend ostream& operator<<(ostream& os, const String& S); public: String(char* str = "") :_str(new char[strlen

string类的两种实现方法及string的一些成员函数的实现

string的第一种实现方法: #include<iostream> using namespace std; class String { public:      String(char *str="")//构造函数       :_str(new char[strlen(str)+1])      {           strcpy(_str, str);      }      String(const String& str)//拷贝构造函数,实现深拷贝

《java入门》第一季之类(String类字符串一旦被赋值就没法改变)

毫无疑问,String类是java里面最重要的类之一.因此它有很多方法需要了解和掌握. 字符串一旦被赋值,值就不能发生改变: package cn.itcast_02; /* * 字符串的特点:一旦被赋值,就不能改变. */ public class StringDemo { public static void main(String[] args) { String s = "hello";//hello是在字符串常量池中待着的.赋值hello后就没法在改变了. s += &quo

Javascript定义类的三种方法分析

一.构造函数法 function User() { this.name = "张三"; } 生成实例的时候,使用new关键字. var user1 = new User(); alert(user1.name); // 张三 类的属性和方法,还可以定义在构造函数的prototype对象之上. User.prototype.sing = function(){ alert("only you!"); } 缺点:比较复杂,用到了this和prototype,不易编写和阅

088、Java中String类之对象直接赋值

01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public static void main(String args[]) { String str = "曾经沧海难为水,除却巫山不是云"; // 直接赋值 System.out.println(str); // 输出字符串数据 } } 02.效果如下: 知识有价,如果您认为这篇文章有价值,认同作

String类的几种常用的方法

1.int length():获取字符串的长度 2.char charAt(int index):获取指定的索引处的字符串 3.int indexOf(String str):获取str在字符串对象中第一次出现的索引 4.String substring(int start):从start开始截取字符串 5.String substring(int start,int end):从start开始截取字符,到end结束截取字符 6.char[ ] toCharArray():把字符串转换为字符数组

关于String的两种赋值方式

String的两种赋值是不同的,String str1=“hello”,指向堆内存中的"hello",而String str2=new String("hello"),因为new开辟的新的堆内存,所以二者地址不同,在用==时,显示的是false. 例一: String str1=“Hello”; String str2=“Hello”; String str3=“Hello”; 这时候三者都是指向同一堆内存地址,因为如果对象池中已经有了相同的字符串声明时,就不会再重