第01篇 为什么推荐使用String直接赋值
在四海学的时候,可能需要我们经过沉淀才会去想一些事情,有的时候不知道为什么这样或者那样的时候,从今天看是,胖先生打算给大家开辟一个课程,就是我的读书笔记。
首先我们来认识一下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直接赋值的更多相关文章
- Autofac全面解析系列(版本:3.5) – [使用篇(推荐篇):2.解析获取]
前言 Autofac是一套高效的依赖注入框架. Autofac官方网站:http://autofac.org/ Autofac在Github上的开源项目:https://github.com/auto ...
- [改善Java代码]推荐使用String直接量赋值
建议52:推荐使用String直接量赋值 一.建议 String对象的生成方式有两种: 1.通过new关键字生成,String str3 = new String(“中国”); 2.直接声明,如:St ...
- C风格字符串和C++ string 对象赋值操作的性能比较
<<C++ Primer>> 第四版 Exercise Section 4.3.1 部分Exercise 4.2.9 习题如下: 在自己本机执行如下程序,记录程序执行时间: # ...
- string的赋值
string的赋值 string s1="123456"; 一: 只能在刚开始定义的时候用: (1) 从后往前赋值 string s2(s1,3); ...
- String直接赋值与使用new String的区别
在研究String直接赋值与new String的区别之前我们需要先了解java中的字符串常量池的概念 字符串常量池 String类是我们平常项目中使用频率非常高的一种对象类型,jvm为了提升性能和减 ...
- Autofac全面解析系列(版本:3.5) – [使用篇(推荐篇):1.类型注册]
前言 Autofac Autofac是一套高效的依赖注入框架. Autofac官方网站:http://autofac.org/ Autofac在Github上的开源项目:https://github. ...
- Java总结篇系列:Java String
String作为Java中最常用的引用类型,相对来说基本上都比较熟悉,无论在平时的编码过程中还是在笔试面试中,String都很受到青睐,然而,在使用String过程中,又有较多需要注意的细节之处. 1 ...
- 【jframe】Java Web应用程序框架 - 第01篇:Get Started
jframe是什么? jframe是一个基于MIT协议开源的java web应用程序框架,汇聚了我们团队之于java web应用程序的核心架构思想以及大量最佳实践,并且持续在实际项目中不断完善优化. ...
- 【jframe】Java架构师之路 - 第01篇:Get Started
jframe是什么? jframe是一个基于MIT协议开源的java web应用程序框架,汇聚了我们团队之于java web应用程序的核心架构思想以及大量最佳实践,并且持续在实际项目中不断完善优化. ...
随机推荐
- 20届的阿里 头条 网易 滴滴 百度 小米等Java面经
转载连接 个人博客:junxuelian.cn 总结:个人感觉回答面试官问题不必太官方和书面化,腾讯sng招实习被发现照着百度百科念.结果可想而知.用自己的话和理解去回答就好.可能应届生会抱怨设计题, ...
- unity 学习记录
世界第九条约定 缘起 嗯,其实一开始我知道unity是个弄游戏的,也知道好像神庙逃亡,炉石都是出自unity,然后舍友都报了,我也觉得这个东西挺高大上的,所以忍不住自己的双手,报了名,确实,这能学到很 ...
- 第一、二章——Python简介与Python基础
前言:<Data Wrangling with Python>这本书主要是讲使用Pyhon来处理各种类型保存的数据的. 第一章:Python简介 1.版本选择 本书选择的Python版本是 ...
- PHP利用pcntl_exec突破disable_functions
http://fuck.0day5.com/?p=563 PHP突破Disable_functions执行Linux命令 利用dl函数突破disable_functions执行命令 http://ww ...
- iOS-根据两个经纬度计算相距距离
CLLocation *orig=[[[CLLocation alloc] initWithLatitude:[mainDelegate.latitude_self doubleValue] long ...
- css那些事儿2 经典两列布局
<!DOCTYPE html> <html> <head> <title></title> <link rel="style ...
- mini2440 Nor Flash工作原理分析
我的mini2440上是只接了一块Nor Flash,型号是S29AL016M90TAI02,这是一块2M Byte,16位宽度的Nor Flash,用于引导扇区的闪存.原理图里面关键的引脚是: 地址 ...
- Dom的样式操作和属性操作
如果说web的研究对象是html和css,那么整个dom结构,包含html树和dom树的dom结构才是研究对象,而在整个页面呈现上面,js起到的作用则是异步的用户行为. 按照上面整个思路,获取dom元 ...
- 关于设置Visaul Studio 2010 代码编辑界面背景的方法
1.打开代码编辑界面: 2.找到工具--选项: 3.打开选项后选中纯文本--项背景色: 4.点击自定义,找到自己需要的颜色: [注]: “项前景色”即代码的颜色: “项背景色”即背景颜色. 设置好后, ...
- vector中数据进行去重和排序
, , , , , , ,}; std::vector<int> vec(a, a+sizeof(a)/sizeof(int) ); std::sort(vec.begin(), vec. ...