在四海学的时候,可能需要我们经过沉淀才会去想一些事情,有的时候不知道为什么这样或者那样的时候,从今天看是,胖先生打算给大家开辟一个课程,就是我的读书笔记。

首先我们来认识一下String字符串

一般对象都是通过new关键字生成的,但是String还有第二种生成方式,也就是我们最经常使用的直接的声明方式,比如 String str= "shxt"【建议写法等号两端空格】,即是通过直接量"shxt"进行赋值的。对于String对象[String不是基本数据类型]来说,这种方式是极力推荐,但不建议使用new String("不推荐")的方式赋值,为什么呢?胖先生来给你分析一下原因:

public class   myTest{

public static void  main(String[] args){

String str1 = "胖先生";

String str2 = "胖先生";

String str3 = new String("胖先生");

String str4 = str3.intern();

//两个直接量是否相等

boolean b1 = (str1==str2);

//直接量和对象是否相等

boolean b2 = (str1==str3);

//经过intern处理后的对象与直接量是否相等

boolean b3 = (str1==str4);

}

}

注意上面的代码,我们使用"=="判断的是两个对象的引用地址是否相同,也就是判断是否为同一个对象,打印的结果是true,false,true 。前两答案我们还是好理解,两个直接量是同一个对象(经过intern处理后的String对象与直接量是同一个对象),但是通过new生成的对象却与之不相等,

原因何在?

原因是Java为了避免在一个系统大量使用String对象(为什么会大量产生?因为String类型是我们最经常使用的),于是就设计了一个字符串池(也叫字符串常量池),在字符串池中所容纳的都是String字符串对象,它的创建机制就是这样的:创建一个字符串的时候,首先检查字符串池中是否有字面值相等的字符串,如果有,则不再创建,直接返回字符串池中该对象的引用,若没有创建之,然后放到字符串池中,并返回新建对象的引用

那么为什么使用new String("胖先生")就不相等呢?因为直接声明一个String对象是不检查字符串池的,也不会把对象放到字符串池中,那当然使用"=="false

那么为什么使用intern方法处理后就又相等了呢?因为intern会检查当前的对象在字符串池中是否有字面量相同的引用对象,如果有则返回字符串池中的对象,如果没有则放到字符串池中,并返回当前对象

---------------------------------

对象方法字符串池中会不会产生线程安全问题?好问题吧,我想也是,但是我猜各位四海的学生从来不曾考虑过,因为这些不需要我们考虑,Java已经帮我们考虑好了,String类是一个不可变对象,这个不可变含有两层意思:一个是String类是final类,不可继承,不可能产生一个String的子类;二是在String类提供的左右方法中,如果有String返回值,就会新建一个String对象,不对原对象进行修改,这也就保证了对象是不可变的。

那么,放到字符串池中,是不是需要考虑垃圾回收问题呢?不用考虑了,虽然Java的每个对象都保存在堆内存中,但是字符串池非常特殊,它的编译期已经决定了其存在JVM【虚拟机】的常量池,垃圾回收器是不会对它进行回收的。

-----------------

综上所述:我们发现Java在字符串的创建方面确实提供了非常好的安全机制,利用字符串池不仅可以提高效率,同时减少了内存空间的占用。

开发中使用直接量赋值方式[推荐]

除非确有必要才新建一个String的对象

如果想学习Java学习,请联系QQ: 83604162

第01篇 为什么推荐使用String直接赋值的更多相关文章

  1. Autofac全面解析系列(版本:3.5) – [使用篇(推荐篇):2.解析获取]

    前言 Autofac是一套高效的依赖注入框架. Autofac官方网站:http://autofac.org/ Autofac在Github上的开源项目:https://github.com/auto ...

  2. [改善Java代码]推荐使用String直接量赋值

    建议52:推荐使用String直接量赋值 一.建议 String对象的生成方式有两种: 1.通过new关键字生成,String str3 = new String(“中国”); 2.直接声明,如:St ...

  3. C风格字符串和C++ string 对象赋值操作的性能比较

    <<C++ Primer>> 第四版 Exercise Section 4.3.1 部分Exercise 4.2.9 习题如下: 在自己本机执行如下程序,记录程序执行时间: # ...

  4. string的赋值

    string的赋值 string s1="123456"; 一:     只能在刚开始定义的时候用: (1)     从后往前赋值     string s2(s1,3);     ...

  5. String直接赋值与使用new String的区别

    在研究String直接赋值与new String的区别之前我们需要先了解java中的字符串常量池的概念 字符串常量池 String类是我们平常项目中使用频率非常高的一种对象类型,jvm为了提升性能和减 ...

  6. Autofac全面解析系列(版本:3.5) – [使用篇(推荐篇):1.类型注册]

    前言 Autofac Autofac是一套高效的依赖注入框架. Autofac官方网站:http://autofac.org/ Autofac在Github上的开源项目:https://github. ...

  7. Java总结篇系列:Java String

    String作为Java中最常用的引用类型,相对来说基本上都比较熟悉,无论在平时的编码过程中还是在笔试面试中,String都很受到青睐,然而,在使用String过程中,又有较多需要注意的细节之处. 1 ...

  8. 【jframe】Java Web应用程序框架 - 第01篇:Get Started

    jframe是什么? jframe是一个基于MIT协议开源的java web应用程序框架,汇聚了我们团队之于java web应用程序的核心架构思想以及大量最佳实践,并且持续在实际项目中不断完善优化. ...

  9. 【jframe】Java架构师之路 - 第01篇:Get Started

    jframe是什么? jframe是一个基于MIT协议开源的java web应用程序框架,汇聚了我们团队之于java web应用程序的核心架构思想以及大量最佳实践,并且持续在实际项目中不断完善优化. ...

随机推荐

  1. WCF:REST + Basic authentification + IIS

    近期一个项目中用到Restful WCF提供服务,但是需要验证机制,网上搜刮了一些,都是太复杂.FQ找到了一篇不错的文章分享一下. 原地址连接:http://vgolovchenko.wordpres ...

  2. vscode开发智能合约

    开发工具 EOS 开发终极神器-vscode (你绝对找不到的干货) lome · 2018年04月19日 · 最后由 18636292520 回复于 2018年09月15日 · 15672 次阅读 ...

  3. 如何让thinkpad X1C 用U盘 安装上专业版win10

    1 BIOS内置了文件 会导致win10 iso默认装家庭版 2 给iso 的resouse 目录中增加文件ei.cfg 3 内容如下 [EditionID]Professional[Channel] ...

  4. [leetcode-666-Path Sum IV]

    If the depth of a tree is smaller than 5, then this tree can be represented by a list of three-digit ...

  5. 关于GenericJDBCException的问题

    在spring和hibernate整合的初步阶段,还没有编辑hibernate.cfg.xml这个文件,只有一个beans.xml文件.此时遇到了一个bug. Exception in thread ...

  6. lintcode-178-图是否是树

    178-图是否是树 给出 n 个节点,标号分别从 0 到 n - 1 并且给出一个 无向 边的列表 (给出每条边的两个顶点), 写一个函数去判断这张`无向`图是否是一棵树 注意事项 你可以假设我们不会 ...

  7. LintCode-68.二叉树的后序遍历

    二叉树的后序遍历 给出一棵二叉树,返回其节点值的后序遍历. 样例 给出一棵二叉树 {1,#,2,3}, 返回 [3,2,1] 挑战 你能使用非递归实现么? 标签 递归 二叉树 二叉树遍历 code / ...

  8. iOS-addSubView时给UIView添加效果

    CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"]; ...

  9. Coredump及调试

    1.查看是否打开了coredump lybxin@Inspiron:~/MyRes/miscellany/test/01_coredump$ulimit -c  #这里可以看到ulimit限制core ...

  10. <T extends Comparable<? super T>>

    在看Collections源代码中,看到如下代码: public static <T extends Comparable<? super T>> void sort(List ...