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

首先我们来认识一下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. CodeForces 908C. New Year and Curling 解题报告 Java

    1. 思路 这题实际上是个几何问题——两个外相切的圆,由勾股定理,他们的纵坐标有以下的规律: 则有$$y_{n+1} = y_{n} + \sqrt{(2r)^2 - (x_{n} - x_{n+1} ...

  2. JQuery常用函数方法全集

    Attribute: $("p").addClass(css中定义的样式类型); 给某个元素添加样式 $("img").attr({src:"test ...

  3. HDU 4300 Clairewd’s message (next函数的应用)

    题意:给你一个明文对密文的字母表,在给你一段截获信息,截获信息前半段是密文,后半段是明文,但不清楚它们的分界点在哪里,密文一定是完整的,明文可能是残缺的,求完整的信息串(即完整的密文+明文串). 题解 ...

  4. [git]基本用法1

    一.实验说明 本节实验为 Git 入门第一个实验,可以帮助大家熟悉如何创建和使用 git 仓库. 二.git的初始化 在使用git进行代码管理之前,我们首先要对git进行初始化. 1.Git 配置 使 ...

  5. LintCode-372.在O(1)时间复杂度删除链表节点

    在O(1)时间复杂度删除链表节点 给定一个单链表中的一个等待被删除的节点(非表头或表尾).请在在O(1)时间复杂度删除该链表节点. 样例 给定 1->2->3->4,和节点 3,删除 ...

  6. iOS开发应用程序生命周期

    各个程序运行状态时代理的回调: - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSD ...

  7. c语言作业1

  8. [剑指Offer] 48.不用加减乘除做加法

    题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. [思路] 首先看十进制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算进位,得到2.第二步:计算进 ...

  9. MyBatis原理系列

    原理分析之一:从JDBC到Mybatis 原理分析之二:框架整体设计 原理分析之三:初始化(配置文件读取和解析) 原理分析之四:一次SQL查询的源码分析

  10. C#中WVVM的使用

    学习WVVM模式,设计一个简单的菜单显示和选择时显示个数的一个例子. 最终效果: 所建文件结构如下: MenuModel:菜品属性-名称和价格 using System; using System.C ...