精华内容
下载资源
问答
  • 不知道能不能实现 我要定义一个webBrowser1.DocumentText的内容我需要在这段内容头尾添上""才能让系统识别这是一个字符串,但是我填写的内容里面有""就是有双引号这个符号,这样就会造成我在读取的时候出现错误,...
  • 在Java中,可以通过两种方式创建字符串:String x = ...1.双引号与构造函数可以通过使用两简单的示例来回答这问题。范例1:String a = "abcd";String b = "abcd";System.out.println(a == b); // TrueSystem.ou...

    a835a59ec4864c5709f2190b830103e1.png

    在Java中,可以通过两种方式创建字符串:

    String x = "abc";String y = new String("abc");

    使用双引号和使用构造函数有什么区别?

    1.双引号与构造函数

    可以通过使用两个简单的示例来回答这个问题。

    范例1:

    String a = "abcd";String b = "abcd";System.out.println(a == b); // TrueSystem.out.println(a.equals(b)); // True

    a==b之所以是true是因为a并且b在方法区域中引用了相同的字符串。内存引用是相同的。

    当多次创建同一字符串文字时,每个唯一的字符串值仅存储一个副本。这称为“ 字符串实习 ”。Java中的所有编译时常量字符串都将被自动插入。

    范例2:

    String c = new String("abcd");String d = new String("abcd");System.out.println(c == d); // FalseSystem.out.println(c.equals(d)); // True

    c==d之所以为false是因为c,它d引用堆中的两个不同的对象。不同的对象始终具有不同的内存引用。

    此图说明了以上两种情况:

    c1b92040ac5f61957fed0f1b9e285701.png

    2.运行时字符串实习

    即使使用构造函数构造了两个字符串,仍然可以在运行时进行字符串实习:

    String c = new String("abcd").intern();String d = new String("abcd").intern();System.out.println(c == d); // Now trueSystem.out.println(c.equals(d)); // True

    3.何时使用哪个

    因为文字“ abcd”已经是字符串类型,所以使用构造函数将创建一个多余的对象。因此,如果只需要创建一个字符串,则应使用双引号。

    如果确实需要在堆中创建新对象,则应使用构造函数。这是一个用例。

    最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。

    fbe03321912b51ebe169ec9ba57d980a.png

    beea13e51e8d9e694a7f92f441c9c1f4.png
    展开全文
  • 字符串常量池详解在深入学习字符串类之前, 我们先搞懂JVM是怎样处理新生字符串的....常量池是Java的项技术, 八种基础数据类型除了float和double都实现了常量池技术. 这项技术从字面上是很好理...

    字符串常量池详解

    在深入学习字符串类之前, 我们先搞懂JVM是怎样处理新生字符串的.

    当你知道字符串的初始化细节后, 再去写String s = "hello"或String s = new String("hello")等代码时, 就能做到心中有数.

    首先得搞懂字符串常量池的概念.

    常量池是Java的一项技术, 八种基础数据类型除了float和double都实现了常量池技术. 这项技术从字面上是很好理解的: 把经常用到的数据存放在某块内存中, 避免频繁的数据创建与销毁, 实现数据共享, 提高系统性能.

    字符串常量池是Java常量池技术的一种实现, 在近代的JDK版本中(1.7后), 字符串常量池被实现在Java堆内存中.

    下面通过三行代码让大家对字符串常量池建立初步认识:

    public static void main(String[] args) { String s1 = "hello"; String s2 = new String("hello"); System.out.println(s1 == s2); //false}

    我们先来看看第一行代码String s1 = "hello";干了什么.

    fd38753d361724d6517137e71b406107.png

    字符串常量池内存图

    对于这种直接通过双引号""声明字符串的方式, 虚拟机首先会到字符串常量池中查找该字符串是否已经存在. 如果存在会直接返回该引用, 如果不存在则会在堆内存中创建该字符串对象, 然后到字符串常量池中注册该字符串.

    在本案例中虚拟机首先会到字符串常量池中查找是否有存在"hello"字符串对应的引用. 发现没有后会在堆内存创建"hello"字符串对象(内存地址0x0001), 然后到字符串常量池中注册地址为0x0001的"hello"对象, 也就是添加指向0x0001的引用. 最后把字符串对象返回给s1.

    温馨提示: 图中的字符串常量池中的数据是虚构的, 由于字符串常量池底层是用HashTable实现的, 存储的是键值对, 为了方便大家理解, 示意图简化了字符串常量池对照表, 并采用了一些虚拟的数值.

    下面看String s2 = new String("hello");的示意图

    471b75233df256828e8e176039baa44c.png

    字符串常量池内存图

    当我们使用new关键字创建字符串对象的时候, JVM将不会查询字符串常量池, 它将会直接在堆内存中创建一个字符串对象, 并返回给所属变量.

    所以s1和s2指向的是两个完全不同的对象, 判断s1 == s2的时候会返回false.

    如果上面的知识理解起来没有问题的话, 下面看些难点的.

    public static void main(String[] args) { String s1 = new String("hello ") + new String("world"); s1.intern(); String s2 = "hello world"; System.out.println(s1 == s2); //true}

    第一行代码String s1 = new String("hello ") + new String("world");的执行过程是这样子的:

    1. 依次在堆内存中创建"hello "和"world"两个字符串对象

    2. 然后把它们拼接起来 (底层使用StringBuilder实现, 后面会带大家读反编译代码)

    3. 在拼接完成后会产生新的"hello world"对象, 这时变量s1指向新对象"hello world".

    执行完第一行代码后, 内存是这样子的:

    ba36af0d575281c675f089d8223f4abc.png

    字符串常量池内存图

    第二行代码s1.intern();

    String类的源码中有对intern()方法的详细介绍, 翻译过来的意思是: 当调用intern()方法时, 首先会去常量池中查找是否有该字符串对应的引用, 如果有就直接返回该字符串; 如果没有, 就会在常量池中注册该字符串的引用, 然后返回该字符串.

    由于第一行代码采用的是new的方式创建字符串, 所以在字符串常量池中没有保存"hello world"对应的引用, 虚拟机会在常量池中进行注册, 注册完后的内存示意图如下:

    1349c0c67416fce46355e4ae8362c515.png

    字符串常量池内存图

    第三行代码String s2 = "hello world";

    这种直接通过双引号""声明字符串背后的运行机制我们在第一个案例提到过, 这里正好复习一下.

    首先虚拟机会去检查字符串常量池, 发现有指向"hello world"的引用. 然后把该引用所指向的字符串直接返回给所属变量.

    执行完第三行代码后, 内存示意图如下:

    a466c71b3bfb3f2e2ff780e04debd192.png

    如图所示, s1和s2指向的是相同的对象, 所以当判断s1 == s2时返回true.

    最后我们对字符串常量池进行总结: 当用new关键字创建字符串对象时, 不会查询字符串常量池; 当用双引号直接声明字符串对象时, 虚拟机将会查询字符串常量池. 说白了就是: 字符串常量池提供了字符串的复用功能, 除非我们要显式创建新的字符串对象, 否则对同一个字符串虚拟机只会维护一份拷贝.

    配合反编译代码验证字符串初始化操作.

    相信看到这里, 再见到有关的面试题, 你已经无所畏惧了, 因为你已经懂得了背后原理.

    在结束之前我们不妨再做一道压轴题:

    public class Main { public static void main(String[] args) { String s1 = "hello "; String s2 = "world"; String s3 = s1 + s2; String s4 = "hello world"; System.out.println(s3 == s4); }}

    这道压轴题是经过精心设计的, 它不但照应上面所讲的字符串常量池知识, 也引出了后面的话题.

    如果看这篇文章是你第一次往底层探索字符串的经历, 那我估计你不能立即给出答案. 因为我第一次见这几行代码时也卡壳了.

    首先第一行和第二行是常规的字符串对象声明, 我们已经很熟悉了, 它们分别会在堆内存创建字符串对象, 并会在字符串常量池中进行注册.

    影响我们做出判断的是第三行代码String s3 = s1 + s2;, 我们不知道s1 + s2在创建完新字符串"hello world"后是否会在字符串常量池进行注册. 说白了就是我们不知道这行代码是以双引号""形式声明字符串, 还是用new关键字创建字符串.

    这时, 我们应该去读一读这段代码的反编译代码. 如果你没有读过反编译代码, 不妨借此机会入门.

    在命令行中输入javap -c 对应.class文件的绝对路径, 按回车后即可看到反编译文件的代码段.

    C:甥敳獲liuyj>javap -c C:甥敳獲liuyjIdeaProjectsTestargetclassesforTestMain.classCompiled from "Main.java"public class forTest.Main { public forTest.Main(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: ldc #2 // String hello 2: astore_1 3: ldc #3 // String world 5: astore_2 6: new #4 // class java/lang/StringBuilder 9: dup 10: invokespecial #5 // Method java/lang/StringBuilder."":()V 13: aload_1 14: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 17: aload_2 18: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 21: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 24: astore_3 25: ldc #8 // String hello world 27: astore 4 29: getstatic #9 // Field java/lang/System.out:Ljava/io/PrintStream; 32: aload_3 33: aload 4 35: if_acmpne 42 38: iconst_1 39: goto 43 42: iconst_0 43: invokevirtual #10 // Method java/io/PrintStream.println:(Z)V 46: return}

    首先调用构造器完成Main类的初始化

    0: ldc #2 // String hello

    从常量池中获取"hello "字符串并推送至栈顶, 此时拿到了"hello "的引用

    2: astore_1

    将栈顶的字符串引用存入第二个本地变量s1, 也就是s1已经指向了"hello "

    3: ldc #3 // String world

    5: astore_2

    重复开始的步骤, 此时变量s2指向"word"

    6: new #4 // class java/lang/StringBuilder

    刺激的东西来了: 这时创建了一个StringBuilder, 并把其引用值压到栈顶

    9: dup

    复制栈顶的值, 并继续压入栈定, 也就意味着栈从上到下有两份StringBuilder的引用, 将来要操作两次StringBuilder.

    10: invokespecial #5 // Method java/lang/StringBuilder."":()V

    调用StringBuilder的一些初始化方法, 静态方法或父类方法, 完成初始化.

    13: aload_1

    把第二个本地变量也就是s1压入栈顶, 现在栈顶从上往下数两个数据依次是:s1变量和StringBuilder的引用

    14: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

    调用StringBuilder的append方法, 栈顶的两个数据在这里调用方法时就用上了.

    接下来又调用了一次append方法(之前StringBuilder的引用拷贝两份就用途在此)

    完成后, StringBuilder中已经拼接好了"hello world

    展开全文
  • 注意最后一行程序中既有单引号又有双引号,你觉得它是如何工作的? 原因很简单。 原因 程序输出是这样的: 'I had this thing.' 'That you could type up right.' "But it didn't sing." 'So I said goodnight...

    问题

    在《笨方法学python》书中的习题9 打印,打印,打印 中,有下面问题

    1. 注意最后一行程序中既有单引号又有双引号,你觉得它是如何工作的?

    原因很简单。

    原因

    程序输出是这样的:

    'I had this thing.' 'That you could type up right.' "But it didn't sing." 'So I said goodnight.'
    

    可以看到第三个字符串是双引号,其他都是单引号。是因为该字符串里面已经有单引号( didn't )了,所在python在外面给它用上了双引号。

    如果用单引号包含它,就成了'But it didn't sing.'。python会认为'But it didn'是个字符串,Python并不知道如何处理该行余下的内容。

    如图:

    注意最后一行程序中既有单引号又有双引号.....

    使用单引号的另外一种选择是,使用反斜线\对字符串中的引号进行转义,这样Python就会明白中间的单引号是字符串的一部分,而不是字符串的结束标记(同样对双引号也可以使用相同的方式进行转义):

    注意最后一行程序中既有单引号又有双引号.....

    总结

    对于 %r 输出时自动添加引号,我认为默认输出添加单引号,如果字符里出现单引号,则输出时添加双引号。


    参考:
    《笨方法学Python》习题8 - 简书
    笨办法学Python(八)

    展开全文
  • 先说结论:想显示单引号,外层就用双引号,想显示双引号,外层就用...可以看到,它把这个我本来用作转义的双引号当成一个输入流的结束了!于是我又试了一下用双引号作为外层的引号,最后成功输出: 于是我又想到,双引

    先说结论:想显示单引号,外层就用双引号,想显示双引号,外层就用单引号。

    今天遇到了一个问题,在配置一个文件时我想把单引号用到echo命令中使其成为结果,但是显示如下:
    在这里插入图片描述
    它以为我的单引号是上一个字符的结尾,并默认缺少一个单引号。所以后面一直在等待一个单引号的输入。但是我就想输入单引号,我试了一下反斜杠,然后发现并没有什么用,所以我又试了一下两个单引号,但是结果如下:
    在这里插入图片描述
    可以看到,它把这个我本来用作转义的双引号当成一个输入流的结束了!于是我又试了一下用双引号作为外层的引号,最后成功输出:

    在这里插入图片描述
    于是我又想到,双引号的情况会怎么样:
    在这里插入图片描述
    果然,我们用单引号夹着双引号试试:
    在这里插入图片描述
    成功,问题解决。

    展开全文
  • 文章目录引用单引号'双引号"反斜线\反引号` 引用 在第五章中讲到shell中的引用,shell能识别到4种不同的引用字符...shell碰到第一个’,在遇到用于封闭的’之前,shell会忽略单引号对中引用的所有特殊字符,即不再解...
  • python 字符串的单引号和双引号 区分

    千次阅读 2019-03-06 22:07:23
    python中的字符串表示既可以用单引号,也可以用双引号,只是用单引号时...str = 'hello,my husband\'' 字符串最后一个字符如果也是单引号,则需加一个转义字符\ 做区分。 str= 'hello my husband\'' 输出为: ...
  •  反斜杠还有一种作用:shell中,当反斜杠用于一行的最后一个字符时,shell把行尾的反斜杠最为续行,这种结构在输入长命令是经常使用 2.单引号(') 单引号(')表示:关闭在两个单引号之间所有字符的特殊含义
  • 但是有一个问题一直解决不通,就是无论是用英文输入法还是用中文输入法,双引号总是不符合要求,eclipse中给出的错误是: 最后用了shift+双引号这个键位才得以解决,这是我在以前其他语言中没有见过的,双引号的...
  • 昨天解析一个带链接的JSON字符串的时候,用JSON.parse处理,总是提示错误,报错"Uncaught SyntaxError: Unexpected token j in JSON at position",查找各种问题,最后终于找到了解决方法,分享出来供大家参考。...
  • 在解决上一个问题(Unable to load dynamic library)之后,再运行发现出现如下问题: 这里第一反应是将php.ini文件打开查看是否引入pdo_mysql.dll包: 发现没有问题。 最后发现问题其实出现在单双引号的使用上面:...
  • 我正在尝试将一个表达式组合在一起,该表达式将使用未被单引号或双引号括起的所有空格分割示例字符串。 我的最后一次尝试看起来像这样:"will be"并且工作不太好。 在报价之前,它正在拆分空间。输入示例:This is ...
  • 解决方法是使用DictReader时如何在csv文件中查找最后一行。除文件中生成的json具有反斜杠(\)和双引号外,此方法工作正常。即它转义字符串。例如:{“测试名称”:“基本Tcp IPerf测试”,“ \”状态\””:“通过”...
  • 然后把这些分割后的每一项再按 glob 模式展开,最后把这些值,再用一个空格重新连接起来,并打印出来。 如果碰巧$a变量的字符串中,有连续两个空格符号,或者有制表符,那么echo $a就与程序员的思路出现了不一...
  • 中文双引号的问题

    2006-11-13 13:06:00
    这两天学着做Delphi,突然发现在Edit里输入的中文双引号编程条条竖的黑线,在DBGrid里显示的也是条条竖的黑线,晕拉,问了好几个人都不知道是怎么回事,最后,来到csdn,还是这里的高手多啊,下子就解决了。...
  •  网上的种解决方法是将正文的格式字体中的西方字体也改成中文,这样会导致需要使用英文引号的时候也无法使用。  这里无意中发现了折衷解决方法,供大家参考。就是改变上述我那种打字习惯,变为先将需要加注...
  • 小心php单引号与双引号的陷阱

    千次阅读 2011-06-11 09:58:00
    原文地址:http://www.fangyuqiang.com/archives/879今天碰到一个比较奇怪的问题,想用php的explode函数分割一个用换行符隔开的字符串,但是发现总是不奏效,代码如下:explode(‘/n’,trim($_POST[datatable]));...
  • 要做一个加密解密功能,xml文件中双引号之中的用base64进行加密,现在想要实现读取xml文件,然后读取其中的双引号,调用已经找好的解密方法,如何将其解密之后的放入xml的string中的相对应的位置呢?base64加密最后...
  • 商城购物车的一个方法(代码见最后一段),response 添加cookie 这行会报错:java.lang.IllegalArgumentException:... 是ASCII 编码,表示一个双引号;JSON 是正确的格式;换了7.0.85 版本的tomcat 之后就可以正常运行...
  • 1.带一个星号(*)参数的函数传入的参数存储为一个元组(tuple) 2.带两个星号(*)参数的函数传入的参数则存储为一个字典(dict),并且再调用是采取a=1,b=2,c=3的形式 3.传入的参数个数不定,所以当与普通参数一...
  • 记录一个vue项目打包时的大坑,因为需要在index.html里加入一些自定义的东西,结果打包后相关属性都没有双引号最后各种百度谷歌终于解决了,哈哈(我用的vue-cli4) vue-cli4配置和低于4的配置有些不同,4只用一个...
  • 写完一个系统测试都没问题,突然有人反应新增了数据查看的时候查看不了,赶紧看一下,程序未报错,最后逐步定位发现是数据种包含了换行符,spring mvc使用json渲染前端页面,其中使用了换行符,所以传到前端的时候...
  • excel如何在双引号里面引用变量

    千次阅读 2015-06-15 18:45:44
    1 说明   注意&的用法,"copy"输入copy字符串;...要注意的是标点符号“和”的输入不能用英文状态下的"来代替,否则会出错,就出在"\",因为它会将前后多个"的最前一个与最后一个之间看作一个长字符串,而\则
  • 原来是数据库数据的问题,可能是早前数据库数据编辑的时候,在数据库里面给内容里面的字符加上了两引号,导致程序代码运行时报xml错误,可能是引号加入xml的拼接了,以后要注意这问题!!
  • 但在我写一个JSP分页时候,我这里是照着网上一个分页教程敲的代码,是不加任何单引号或者双引号,可以正常使用。 //当前页数 var currentPage = ${result.currentPage}; //一共多少数据 var totalPage = ${...
  • 括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。 ②命令替换。等同于`cmd`,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将.....
  • 招商的过程是非常复杂的,对业务员来讲也是大考验,特别是到了最后的成交环节。招商会的开展就是为了成功签单,所以,成交环节也成了整个招商会的重中之重。之前所有的努力都是为了签单的这一刻,只有把我好重点,...
  • 选取的最后一个字段与from之间有逗号 SQL语句中有表字段是oracle关键字 语句之间缺少逗号等分隔符 查询语句中写了where却缺少必要条件字段定义 。。。。。 今天遇到问题不是上面的情况,导致的原因是“Language...
  • <ul><li>最后一个错误出现在/source/modules/terminal/index.js第418-422行,如下所示:</li></ul> <pre><code> return (this.isWin ? this.isPowershell ? `cd "${path}";${cmd};echo ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 889
精华内容 355
关键字:

双引号最后一个