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

首先我们来认识一下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. ubuntu 18.04 LTS server系统安装失败问题解决

    准备自己搭一个服务器,USB引导盘的方式安装ubutun系统. 中途遇到两个问题,导致耗时比较久,记录如下. 问题一: installing system阶段卡主 具体描述: 配置镜像源地址以后,进入 ...

  2. 352[LeetCode] Data Stream as Disjoint Intervals

    Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...

  3. Git 命令详解及常用命令

    Git 命令详解及常用命令 Git作为常用的版本控制工具,多了解一些命令,将能省去很多时间,下面这张图是比较好的一张,贴出了看一下: 关于git,首先需要了解几个名词,如下: 1 2 3 4 Work ...

  4. 自测之Lesson11:消息和消息队列

    题目:key及ftok函数的作用. 解答: key是用来创建消息队列的一个参数,当两个key相同时,创建消息队列会引起“误会”(除非有意为之).所以我们可以通过ftok函数来获得一个“不易重复”的ke ...

  5. object-oriented 第二次作业(2)

    面向对象程序设计自学计划 由于我的英文实在是很差,所以我就没有去考虑看英文的课程视频.网络上的课程有很多,什么学校的也有,一开始我不知道该如何开始选择课程.感觉每个都还可以.后来在群里的看到别人推荐的 ...

  6. <Android>列表、网格、画廊视图及适配器的绑定

    列表视图和适配器的绑定 列表视图既可以使用ListView组件,也可以继承ListActivity.显示可以是ArrayAdapter,也可以是游标SimpleCursorAdapter,还可以是继承 ...

  7. 关于命令行参数argv(《学习OpenCV》)

    在<学习OpenCV>这本书中,很多示例代码都用到了命令行参数.作为新手,之前总是很困扰,不知道怎么用.偶然的机会终于略知一二了. 在Visual Studio中,我们可以自行设置命令行参 ...

  8. CSS 经典三列布局

    一 圣杯布局 1 html结构 <!DOCTYPE html> <html> <head> <title></title> <link ...

  9. [计算机网络-应用层] P2P应用

    首先我们要先来区分一下下面的几种体系结构: CS:Client/Server 客户-服务器结构BS:Browser/Server  浏览器-服务器结构 P2P:Peer to Peer 对等结构 BS ...

  10. Redis哨兵的详解

    1 哨兵的作用 哨兵是redis集群架构中非常重要的一个组件,主要功能如下: 集群监控:负责监控redis master和slave进程是否正常工作 消息通知:如果某个redis实例有故障,那么哨兵负 ...