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

首先我们来认识一下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. 3D动态人脸识别技术分析——世纪晟人脸识别实现三维人脸建模

    - 目录 - 国内3D动态人脸识别现状概况 - 新形势下人脸识别技术发展潜力 - 基于深度学习的3D动态人脸识别技术分析 1. 非线性数据建模方法 2. 基于3D变形模型的人脸建模 - 案例结合——世 ...

  2. 2.hbase原理(未完待续)

    hbase简介相关概念hmsterhregionserver表regionhstorememstorestorefilehfileblockcacheWALminorcompactmajorcompa ...

  3. codeforces 319B Psychos in a Line(模拟)

    There are n psychos standing in a line. Each psycho is assigned a unique integer from 1 to n. At eac ...

  4. 微信小程序如何获取openid

    微信小程序如何获取openid wx.login({ success: res => { // 发送 res.code 到后台换取 openId, sessionKey, unionId // ...

  5. 硬件PCB Layout布局布线Checklist检查表(通用版)

    按部位分类 技术规范内容 1 PCB布线与布局 PCB布线与布局隔离准则:强弱电流隔离.大小电压隔离,高低频率隔离.输入输出隔离.数字模拟隔离.输入输出隔离,分界标准为相差一个数量级.隔离方法包括:空 ...

  6. Java学习个人备忘录之关键字static

    被static标记的东西会放在内存中被共享的,对象用到时,就会来取的. class Person { String name; //成员变量,实例变量 static String country = ...

  7. php中array_map和array_walk的使用对比

    一.array_map() 1.array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组,若函数作用后无返回值,则对应的新值数组中为空. 2.回调 ...

  8. 如何将PDF的背景色设置为保护眼睛的苹果绿色

      福昕阅读器请戳这里.   Adobe Acrobat请戳这里.

  9. 性能分析Linux服务器CPU利用率(转)

    1.  指标范围 1.1  User mode CPU utilization+ System mode CPU utilization 合理值:60-85%,如果在一个多用户系统中us+sy时间超过 ...

  10. PHP连接Redis操作函数

    phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系 很有用;以下是redis官方提供的命令使用技巧: 下载地址如下: https://github.com/ow ...