本文主要是说明一些String数据类型的基本知识,有些杂乱,不过都是比较重要的东西,主要是参考了网上人的资料。原文网址:http://dev.yesky.com/91/2309091.shtml

  主要是一下几点:

  1、String是不属于8中基本数据类型的,String是一个对象。

这里补充下JAVA的8种基本数据类型:基本类型分为三类,字符型(char)、布尔型(boolean)、数值型(byte、short、int、long、float、double)。这里数值型又可以分为两种,整数型(int、short、long)和浮点型(float、double)。JAVA中数值类型不存在无符号的,他们的取值范围是固定的,不会随机器硬件环境或者操作系统的改变而改变。

对象的默认值是null,所以String的默认值也是null。但它又是一种独特的对象,有自己独特的一些性质。

2.new String()和new String("");都是声明一个空串,这是要注意声明的是空串而不是null。

3.String str1="hello"; 和String str2= new String("hello");的区别:

  这里不去谈堆也没有涉及栈,只是先简单引入常量池的概念。常量池(constant pool)指的是在编译期间被确定,并被保存在已编译的.class文件中的一些数据,包括了类、方法、接口等的常量,也包括字符串常量。下面有两个例子:

 String s0=”kvill”;
String s1=”kvill”;
String s2=”kv” + “ill”;
System.out.println( s0==s1 );
System.out.println( s0==s2 );

这里输出结果为:

true
true

解释下,java确保一个字符串常量只有一个拷贝,在例子中,s0和s1中的“kvill”都是字符串常量,在编译期就确定了,所以s0==s1为true。对于s2,“kv”和“ill”都是常量,当一个字符串常量由多个字符串常量相加得到时,它本身也是字符串常量。所以s2在编译期就被解析为一个字符串常量而得以确定,所以我们可以得出s0==s1==s2。但是用new String("kvill')建立的字符串不是一个常量,所以由new String()创立的字符串不放到常量池中。他们有各自的地址空间。

  

  4.String中的intern()函数。

  存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用。

下面看例子:

 String s0= “kvill”;
String s1=new String(”kvill”);
String s2=new String(“kvill”);
System.out.println( s0==s1 );
System.out.println( “**********” );
s1.intern();
s2=s2.intern(); //把常量池中“kvill”的引用赋给s2
System.out.println( s0==s1);
System.out.println( s0==s1.intern() );
System.out.println( s0==s2 );

输出的结果为:

false
**********
false //虽然执行了s1.intern(),但它的返回值没有赋给s1
true //说明s1.intern()返回的是常量池中”kvill”的引用
true

  5.String是不可变的。

  String的实例一旦生成就不会再改变了,比如说:String str=”kv”+”ill”+” “+”ans”; 就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和” “ 生成 ”kvill “存在内存中,最后又和生成了”kvill ans”;并把这个字符串的地址赋给了str,就是因为String的“不可变”产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的。

  综上,就是java中对String的一些理解。主要是参考的文章开头的链接那篇文章,有些东西我还没接触到,比如java虚拟机,所以对一些东西还是不懂得,准备看看这方面的书,有些人推荐这类书了。只是一直没看,得抓紧加油好好学习了!

最新文章

  1. 《在纹线方向上进行平滑滤波,在纹线的垂直方向上进行锐化滤波》 --Gabor增强的具体实践
  2. gradle << 操作符作废
  3. 扩展Unity的方法
  4. GTP V0 和 GTP V1
  5. Axiom3D学习日记 1.程序配置
  6. css元素水平垂直居中的十种方法
  7. java实现https请求
  8. Python[小甲鱼006常用操作符]
  9. firefly rk3288 内核模块编译
  10. http短连接与长连接简介
  11. python学习 第二天
  12. Typecho——数据库无法连接问题
  13. 记录网件r6220路由器登录配置
  14. Ubuntu/Unity中更改窗口修饰键Alt为Super
  15. PHP Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity,
  16. SSH免密码登录配置方法详解
  17. oracle不小心更新了数据库中的所有内容后的恢复
  18. 机器学习入门-数值特征-数字映射和one-hot编码 1.LabelEncoder(进行数据自编码) 2.map(进行字典的数字编码映射) 3.OnehotEncoder(进行one-hot编码) 4.pd.get_dummies(直接对特征进行one-hot编码)
  19. 【Spring boot】第一个项目 Springboot + mysql + hibernate
  20. 一次delete速度异常慢的处理过程

热门文章

  1. mac上好用的软件
  2. rm_invalid_file
  3. 执行后台任务的利器——Hangfire
  4. 【python】-- 文件操作
  5. lua2json
  6. CI 框架下执行CLI(命令行)
  7. PAT 天梯赛 L2-005. 集合相似度 【SET】
  8. spring-cloud 实现更新配置不用重启服务 @FreshScope
  9. Data Structure Array: Largest subarray with equal number of 0s and 1s
  10. hdu 1701 (Binary Tree Traversals)(二叉树前序中序推后序)