一、String 使用 private final char value[]来实现字符串存储

所以String对象创建之后就不能再修改此对象中存储的字符串内容,所以说String本质是字符数组char[],且其类型是不可变的!

相对应String,StringBuffer与String功能大致相同,但实现方法不同,StringBuffer是可变的,而且是线程安全的。

二、Java中String的创建方法(四种)

1、直接使用" "双引号创建;  (String s1 = "first";)

2、使用new String()创建;(String s2 = new String();)

3、使用new String("string")创建;(String s3 = new String("string");)

4、采用重载的字符串连接符创建;   (String s4 = "first" + "second";)

三、在深入了解String创建机制之前,要先了解一个重要概念:常量池(Constant Pool)

在Java编译好的字节码文件.class文件中,有个区域被称为Constant Pool,是一个由数组组成的表,用来存储程序中的各种常量,包括Class、String、Integer等各种Java基本数据类型;

String Pool是Constant Pool中存储String常量的区域;

四、直接使用” “双引号的创建机制

用” “双引号创建的方法是一种非常特别的创建方法;例如下面这段代码:

String s1 = "first";
Stirng s2 = "first";
System.out.println(s1 == s2);
1、编译期:"first"是编译期常量,编译期就能确认它的值,在编译好的.class字节码文件中,"first"就已经存在String Pool中了;

2、运行期:JVM仅仅会查找维护常量池,拿着"first"在String Pool中查找是否存在内容相同的字符串(用equals()方法确认),如果存在,返回String Pool中相应内存单元的引用,赋值给s1(s1即是String Pool中存放"first"内存单元的地址);如果不存在,则创建一个"first"放在String Pool中,返回引用,赋值给s1;s2同理;

这个过程实际是调用intern()方法实现的;

此过程中,JVM绝不会在堆区(heap)创建String对象;

所以,上述代码,s1与s2指向String Pool中同一块内存区域,是同一个对象,故返回true。

五、用new string(”string”)的创建机制

相当于创建两次String对象,一次在String Pool中,一次在堆区(heap)中;

String s1 = new String("first");
String s2 = "first";
System.out.println("s1 == s2");

在Java中,使用new关键字创建一个新对象,不管在String Pool中是否有值相同的对象,总会创建一个新的String对象存储在堆区(heap)中,然后返回堆栈区(heap)中相应内存单元的引用,赋值给s1;而s2还是指向String Pool中相应内存单元;

故s1与s2肯定不是同一个对象,只是存储字符串值相同,故返回false。

六、Java内存模型

JVM具有一个堆(heap),堆是运行时数据区,为所有类实例与数组动态分配内存(堆的优势),数据的生命周期不必告诉编译器,而内存的释放由GC(垃圾处理机制)自动回收,但由于动态分配内存,堆的存取效率较低(堆的缺点);

相比于堆,栈存取速度很快(栈的优势),仅次于寄存器,一般用来存放基本类型变量数据如(int、short、long、byte、float、double、boolean、char)与对象的引用,栈中数据可以共享;但栈中数据大小与生命周期必须是确定的,缺乏灵活性(栈的缺点)。


原文地址:

http://blog.csdn.net/zhangliangzi/article/details/50075281

最新文章

  1. 【Quartz】配置最简单的集群
  2. MySQL 拷贝数据库表方式备份,还原后提示 table xxx '' doesn`t exist
  3. 【SQL篇章】【SQL语句梳理 :--基于MySQL5.6】【已梳理:ALTER TABLE解析】
  4. Linux下Web服务器环境搭建LNMP一键安装包[20130911更新]
  5. 实战项目:通过当当API将订单抓取到SAP(一)
  6. hdu 4280 网络流
  7. Xcode常见错误以及解决方案
  8. HDU 2045 不容易系列之(3)—— LELE的RPG难题(递推)
  9. #Leet Code# LRU Cache
  10. [译]36 Days of Web Testing(三)
  11. HDOJ 1716 排列2 next_permutation函数
  12. (十)unity4.6学习Ugui中文文档-------參考-UGUI Canvas Components
  13. OD调试2---TraceMe
  14. linux的基本命令
  15. http post,get,put,delete区别(收集整理)
  16. python3 基础语法(二)
  17. iOS开发多线程之GCD
  18. 学以致用二十九-----python3连接mysql
  19. Js/对数组的认识。
  20. [20171206]rman与truncate.txt

热门文章

  1. 风炫安全WEB安全学习第二十节课 反射型XSS讲解
  2. WPF DataGrid与ListView性能对比与场景选择
  3. Spring Security OAuth2.0认证授权四:分布式系统认证授权
  4. FastApi学习(一)
  5. MATLAB OPC错误OPCenum service is not operating correctly解决办法
  6. CICD基础概念
  7. spring cloud config —— git配置管理
  8. for update语句锁机制问题
  9. MySQL 使用sql添加和创建用户
  10. 【Spring Boot】创建一个简单的Spring Boot的 Demo