精华内容
下载资源
问答
  • Java中字符串的存储方式   Java中的字符串只能位于内存中的两个区域:常量池和Java堆。常量池维护了一个StringTable,它是一个hashtable,以字符串hashcode作为键,字符串引用作为值;Java堆中存储的就是普通的...

    Java中字符串的存储方式


      Java中的字符串只能位于内存中的两个区域:常量池和Java堆。常量池维护了一个StringTable,它是一个hashtable,以字符串hashcode作为键,字符串引用作为值;Java堆中存储的就是普通的字符串对象。那么如何判断字符串到底位于哪一个区域呢?有以下几种情形。

    情形一

    String s = "123";
    

    虚拟机在处理字面量"123"时,首先在本地栈中创建字符串"123",随后对其调用本地方法intern()。intern方法的作用是检查StringTable中是否存在这个字符串,如果有则返回对其的引用;如果没有,则将该字符串存入常量池中,并将其引用添加至StringTable中。 这里值得注意的是,如果该字符串已经存储于Java堆中,那么intern方法将不会再将其拷贝至常量池中,而是直接将其引用添加至StringTable中。

    情形二

    String s=new String("123");
    

    与上面的直接定义不同,该语句会执行2个操作

    1. 将字面量"123"放入常量池中,将其引用添加至StringTable中(即情形一的操作)
    2. 在Java堆中创建一个字符串对象,里面的值与常量池中的"123"一致,返回引用
    3. 所以,该语句会创建2个对象,一个在堆中一个在常量池中,而引用指向的是堆中的对象

    情形三

    String s=new String("1")+new String("23");
    

    这种情况底层等价于以下代码

    StringBuilder stringBuilder=new StringBuilder();
    stringBuilder.append("1").append("23");
    String s=stringBuilder.toString();
    

    这种情况与情形二最大的区别就是它不会在常量池中创建"123"对象,而只是创建一个堆中对象,将引用返回

    介绍完了理论,接下来我们看具体场景

    思考一下,下面的场景分别会输出什么结果?

    场景一

    String s1 = "123";
    String s2 = s1.intern();
    System.out.println(s1 == s2);
    
    String s1 = new String("123");
    String s2 = s1.intern();
    System.out.println(s1 == s2);
    

    答案分别是:true,false

    1. intern()方法在上面具体介绍过,主要是去StringTable中寻找是否存在调用字符串的引用(即确认该字符串是否已在常量池中),如果有则返回,没有则将当前字符串存入常量池中。
    2. 当执行s1.intern()时,会去StringTable中寻找是否存在"123"的引用,而无论是情形一还是情形二,常量池中都会存在"123",因此上面的s2和下面的s2存放的都是常量池中"123"的引用。但根据情形一,上面的s1存储的是常量池中"123"的引用;而根据情形二,下面的s1存储的是堆中字符串对象的引用。因此,返回的分别是true,false。

    场景二

    String h = new String("hw");
    String h2 = h.intern();
    String h1 = "hw";
    
    System.out.println(h == h1);
    System.out.println(h2 == h1);
    System.out.println(h2 == h);
    
    String s = new String("1") + new String("1");
    String s2 = s.intern();
    String s1 = "11";
    
    System.out.println(s == s1);
    System.out.println(s2 == s1);
    System.out.println(s2 == s);
    

    答案分别是false,true,false 和 true,true,true

    1. 上面的情况
      1. h存放的是堆中字符串对象的引用(情形二)
      2. h2存放的是常量池中字符串对象的引用
      3. h1存放的也是常量池中字符串对象的引用
    2. 下面的情况
      1. 根据情形三,s存放的是堆中字符串对象的引用,但此时常量池中并没有"11"的字符串对象
      2. intern()方法发现常量池中不存在对象,所以将调用字符串的引用(s2)存入StringTable中
      3. 因此s,s1,s2得到的都是同一个引用

    场景三

    String s = new String("1") + new String("1");
    String s2 = s.intern();
    String s1 = "11";
    
    System.out.println(s == s1);
    System.out.println(s2 == s1);
    System.out.println(s2 == s);
    
    String s = new String("1") + new String("1");
    String s1 = "11";
    String s2 = s.intern();
    
    System.out.println(s == s1);
    System.out.println(s2 == s1);
    System.out.println(s2 == s);
    

    答案分别是true,true,true 和 false,true,false

    1. 上面的情况:和场景二中的一样
    2. 下面的情况
      1. 根据情形三,s存放的是堆中字符串对象的引用,但此时常量池中并没有"11"的字符串对象
      2. 定义s1时因为常量池中没有对象,所以在常量池中创建"11"对象,往StringTable中添加引用并返回
      3. 因此根据intern()方法的特性,s2拿到的是s1的引用

    参考的文章:

    1. https://juejin.im/post/5c25983cf265da61715e66cb
    2. https://www.zhihu.com/question/267818864/answer/329226635中海纳的回答
    展开全文
  • Java字符串的存储方式

    千次阅读 2018-12-28 05:24:51
    Java堆中存储的就是普通字符对象。 那么如何判断字符到底位于哪一个区域呢? 以下几种情形。 情形一 String s="123"; 复制代码  虚拟机在处理字面量"123"时,首先在本地栈中创建字符"1...

      Java中的字符串只能位于内存中的两个区域:常量池和Java堆。常量池维护了一个StringTable,它是一个hashtable,以字符串hashcode作为键,字符串引用作为值;Java堆中存储的就是普通的字符串对象。 那么如何判断字符串到底位于哪一个区域呢? 有以下几种情形。

    情形一

    String s="123";
    复制代码

      虚拟机在处理字面量"123"时,首先在本地栈中创建字符串"123",随后对其调用本地方法intern()。intern方法检查StringTable中是否存在这个字符串,如果有则返回对其的引用;如果没有,则将该字符串存入常量池中,并将其引用添加至StringTable中。 这里值得注意的是,如果该字符串已经存储于Java堆中,那么intern方法将不会再将其拷贝至常量池中,而是直接将其引用添加至StringTable中。

    情形二

    String s=new String("123");
    复制代码

      "123"按照情形一处理,返回对常量池中字符串常量"123"的引用。随后在Java堆中创建字符串对象,其内容与常量池中的"123"一致。

    情形三

    String s1=new String("123");
    String s2=s1.intern();
    复制代码

      第一行按照情形二处理。经过情形二,将产生一个对象和一个常量。而s2将引用常量池中的字面量"123"。为了验证这一说法,进行如下实验:

    String s1 = "123";
    String s2 = s1.intern();
    System.out.println(s1 == s2); // true
    复制代码
    String s1 = new String("123");
    String s2 = s1.intern();
    System.out.println(s1 == s2); // false
    复制代码

      实验结果证明了我们的说法。

    情形四:

    String s=new String("1")+new String("23");
    复制代码

      上述情况等价于以下代码:

    StringBuilder stringBuilder=new StringBuilder();
    stringBuilder.append("1").append("23");
    String s=stringBuilder.toString();
    复制代码

      由于编译器的优化,将字符串拼接转换为StringBuilder操作。最后在Java堆中创建字符串对象。   最后看两个例子:

    例子一:

    String h = new String("12") + new String("3");
    String h1 = new String("1") + new String("23");
    String h3 = h.intern();
    String h4 = h1.intern();
    String h2 = "123";
    
    System.out.println(h == h1); // false
    System.out.println(h3 == h4); // true
    System.out.println(h == h3);  // true
    System.out.println(h3 == h2); // true
    复制代码

    例子二:

    String h = new String("12") + new String("3");
    String h1 = new String("1") + new String("23");
    String h2 = "123";
    String h3 = h.intern();
    String h4 = h1.intern();
    System.out.println(h == h1); // false
    System.out.println(h3 == h4); // true
    System.out.println(h == h3); // false
    System.out.println(h3 == h2); // true
    复制代码

      来源:java两个字符串对象相加和字符串字面量比较? - 海纳的回答 - 知乎 www.zhihu.com/question/26…

    转载于:https://juejin.im/post/5c25983cf265da61715e66cb

    展开全文
  • c语言中字符串的存储方式

    千次阅读 2019-05-20 11:11:42
    所以c语言使用两种方式存储字符。char*和char[], char*a="123456";右面123456是字符常量,所谓常量就是这个值是保存在内存中字符常量区。每个字符后面都系统预设结束符"\0", char a[ ]="123456...

    c语言中没有字符串类型,而c++中有字符串类型string。所以c语言使用两种方式来存储字符串。char*和char[],

    char*a="123456";右面的123456是字符串常量,所谓常量就是这个值是保存在内存中的字符串常量区。每个字符串后面都有系统预设的结束符"\0",

    char a[ ]="123456";//这个是将字符串保存在数组里。这个是数组初始化。相当于a[0]=1,a[1]=2;.......这个时候123456不是常量,而是一个个的存储在数组中的元素。如果这一句是在函数中,那么123456是存储在栈上的函数中的数组当中。

    而char a[10];a="123456";这种方法不可取,因为a是地址,是一个常量

    展开全文
  • http://blog.csdn.net/zhonghuan1992钟桓2014年8月31日浅谈python字符串存储形式记录一下自己今天发现疑问而且给出自己现有知识有的回答。长话短说,用过python人对于 == 和 is 应该不陌生,可是这里我还是介绍...

    http://blog.csdn.net/zhonghuan1992

    钟桓

    2014年8月31日

    浅谈python字符串存储形式

    记录一下自己今的天发现疑问而且给出自己现有知识有的回答。

    长话短说,用过python的人对于 == 和 is 应该不陌生,可是这里我还是介绍一下。

    ==是用来推断两个东西是否相等,比方:

    a = 10。

    b = 10;

    print(a == b);

    输出是true;

    再看一个样例:

    a = [1,2,3];

    b = [1,2,3];

    c = [1,2,4];

    print(a==b);

    print(a==c);

    输出各自是 true 和 false 。

    再来看 is 。是用来推断同一性而不是同样性。

    来看以下的样例:

    x = [1,2,3];

    y = [1,2,3];

    print(x is y);

    输出是 false;

    而仅仅有:

    x = [1,2];

    y = x;

    print(x is y);

    输出是true;

    从上面的样例中能够看出 == 和 is 两个的差别之处。

    如今疑问来了,我们把对照的东西换成是字符串的话,结果是否会出乎你意料。看以下的样例:

    x = “huan”;

    y = x;

    print(x == y);

    print(x is y);

    我想大家可以猜出输出什么。

    输出是:true

    true

    如今看以下的样例:

    x = “huan”;

    y = “huan”;

    print(x == y);

    print(x is y);

    大家猜,结果是什么?

    输出是:true

    true

    享元模式是为了降低存储空间而做的一种优化手段。经过上面的探讨,我们知道字符串内容同样的两个字符串。事实上指向的是同一个对象,这个正是享元模式所做的,所以个人推測其内部的实现机制就是根据这个模式。

    那么为什么能够使用这个模式呢?学过python的同学应该了解,字符串在python中属于不变的类型,和元组(tuple)一样,由于这个原因。字符串是能够採用享元模式的。

    这是我眼下的理解,假设各位有其他见解,请留下你的见解我们讨论一下。

    展开全文
  • 字符串的三种存储方式

    千次阅读 多人点赞 2020-05-25 22:50:08
    工科生一枚,热衷于底层技术开发,强烈好奇心,感兴趣内容包括单片机,嵌入式Linux,Uboot等,欢迎学习交流! 爱好跑步(减肥~~),打篮球(菜鸡一枚~~),睡觉。 欢迎加入嵌入式与Linux学习交流群,群号...
  • 由于C语言是最基础的语言,所以对于C语言中字符串的使用,两种方法 1.定义指针,给其一个指向,完成对字符串的引用。这里需要注意野指针的存在,要给指针一个指向,或者让其指向NULL,指针需要配合字符数组一起...
  • C++string类型字符串的存储方式

    千次阅读 2013-06-05 13:04:30
    不知道你们没有看过string类型变量的成员数据,在string变量中好像真正存储字符串的是一个叫_Ptr的指针,它指向string所存储的字符串首地址。当string变量被定义时,如果未初始化,_Ptr就是一个指向NULL的指针,...
  • 转自http://blog.csdn.net/yangdelong/archive/2010/04/03/5447362.aspx<br />文章来源 http://blog.csdn.net/shiwei0124/archive/2009/11/26/4877546.aspx<br />字符串的存储方式以及静态存储区域、栈、堆 在...
  • 转自http://blog.csdn.net/yangdelong/archive/2010/04/03/5447362.aspx<br />文章来源 http://blog.csdn.net/shiwei0124/archive/2009/11/26/4877546.aspx<br />字符串的存储方式以及静态存储区域、栈、堆 在...
  • 对串口数据的存储很多大拿都自己的方式方法。个人总结如下几种: 1、开辟一个较大的数组对数据进行保存。有时会结合定时器进行数据的“分帧”/“分包” 2、使用链表的方式进行数据存储。每个字节做成一个节...
  • 他们的存储方式有什么不同; 用 vc6 打印地址发现地址的偏差还是蛮大的,说明他们在进程空间的位置不同。 malloc 出来的应该是在堆中无法否认,char p[] 应该是函数栈中,那 char *p = "hello"; 是存储在哪里...
  • 串的存储方式有三种:定长顺序存储表示、堆分配存储表示、块链存储表示。 本文主要讲解串的定长顺序存储表示及其操作的实现 相关定义及准备 #include<iostream> using namespace std; #define TRUE 1 #...
  • 内存中五大区域: 1)栈:是专门用来存储局部变量,所有局部变量都是声明在栈区域中 2)堆:允许程序员手动从堆申请指定字节数空间来使用 3)BSS段:是用来存储未初始化全局变量...字符数据在C语言中
  • 【3】2 串的存储结构

    2020-08-02 20:21:40
    1. 串的顺序存储 串是一种特殊的线性表,只不过线性表中的元素是 ElemType ,但在串中为 char 类型! 静态数组实现 ==> 内存空间由系统自动回收。 而动态数组实现 ==> 由于malloc 申请的内存在系统的堆...
  • 关于字符串的存储和输出问题 作者:张老师,华清远见嵌入式学院讲师。 关于字符串的存储和输出问题: 在C语言里并没有字符串类型。所以的字符串都当做一个一个的字符来处理,正是因为没有字符串数据类型,所以我们...
  • C#串口上位机界面。SQL存储串口数据,没有作图操作,但是数据显示VS2010编写,我现在用VS2013。其他存储方式移步我其他资源,或许你需要
  • 点击蓝字 关注我们定点数和浮点数本文中所提到的都是基于intel x86Cpu,开发环境是基于windows 10 + vs2019。本片博客需要读者自己明白十进制、十六进制、二进制之间的...计算机中对数据的存储两种形式,一种是...
  • 系列文章参考资料为《大话数据结构》,源码为个人私有,未经允许不得转载 ... 串的顺序存储结构是用一组地址连续的存储单元来存储串中的字符序列...但是串的顺序存储方式其实是问题的,因为字符串的操作,比如两串的连.
  • C语言中字符常量的存储方式有两种:字符指针和字符数组中。 就我目前所能理解到的程度,这两种方式的区别如下: 字符指针: char *m = “February”; 可以写成: char *m; m = “February”; 字符数组: ...
  • 串->串的表示和实现

    2019-05-01 18:26:00
    在数据结构中,串的存储方式有三种:定长顺序存储表示、堆分配存储表示和块链存储表示: 定长顺序存储表示: 以一组地址连续的存储单元存放字符序列,按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区...
  • 参考:http://lumingfeng.xyz 想在windows下使用熟悉一下redis,首先在它github上下载压缩包:https://github.com/dmajkic/redis 下载到本地之后解压缩打开,里面32位和64位2个文件夹,我是64位系统,所以把...
  • 【JAVA】字符串的创建与存储机制

    千次阅读 2018-09-02 13:51:52
    字符串的创建与存储机制 在我们的编程中,常常会使用到String,那么理解String的创建与存储机制十分重要。 字符串两种创建方式,分别是 (1)String s1="abc"; s1指向的是String常量池中的字符串 (2)...
  • 都是在程序中用于存储不同类型数据使用,在程序运行时它每部分内容都要先加载到内存中再被使用。那么对象类型数据在内存中是如何分配呢?先来了解一下内存结构。逻辑上内存大体被分为四段,分别为栈空间段、...
  • HTML5几种存储方式

    2020-12-24 21:56:16
    HTML5几种存储方式 html5在引入webStorage之前,主要用cookies. web storage html5webstorage 分两种:LocalStorage 和SessionStorage,两者差别主要在生命周期不同。 LocalStorage LocalStorage用于持久化...
  • 2.5 创建字符串的方式

    2020-04-10 21:28:48
    创建字符串的方式归纳起来两类: 使用""引号创建字符串; 使用new关键字创建字符串; 总结如下: 单独使用""引号创建的字符串都是常量,编译期就已经确定存储到String Pool中; 使用new String...
  • 目前我们存储账号密码,一般存在 偏好设置表里,如果明文存储,安全上又很大隐患,所以今天给大家推荐一种更安全密码存储方式。不知道大家是否注意过,当我们使用百度系列产品时,比如说:我登录上了百度糯米...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,343
精华内容 1,337
关键字:

串的存储方式有