Java 字符串 String
什么是Java中的字符串
在 Java 中,字符串被作为 String 类型的对象处理。 String 类位于 java.lang 包中。默认情况下,该包被自动导入所有的程序。
创建 String 对象的方法:
String s1 = "cjj"; //创建一个字符串并赋值
String s2 = new String(); //创建一个空字符串
String s3 = new String("cjj"); //创建一个字符串并赋值
Java 中字符串的不变性
String 对象创建后则不能被修改,是不可变的,所谓的修改其实是创建了新的对象,所指向的内存空间不同。
如下所示:
public class Test {
static String s1 = "cjj";
static String s2 = "cjj";
static String s3 = new String("cjj");
static String s4 = new String("cjj");
public static void main(String[] args) {
//多次出现的字符常量,Java编译程序只创建一个,所以返回true
System.out.println(s1 == s2);
//s1和s3是不同的对象,所以返回fale
System.out.println(s1 == s3);
//s3和s4是不同的对象,所以返回false
System.out.println(s3 == s4);
s1 = "I love " + s1;
//字符串s1被修饰,指向新的内存的空间
System.out.println(s1);
}
}
运行结果:
true
false
false
I love cjj
1、 通过 String s1="爱慕课"; 声明了一个字符串对象, s1 存放了到字符串对象的引用,在内存中的存放引用关系如下图所示:

然后通过 s1="欢迎来到:"+s1; 改变了字符串 s1 ,其实质是创建了新的字符串对象,变量 s1 指向了新创建的字符串对象,如下图所示:

2、 一旦一个字符串在内存中创建,则这个字符串将不可改变。
如果需要一个可以改变的字符串,我们可以使用StringBuffer或者StringBuilder 。
3、 每次 new 一个字符串就是产生一个新的对象,即便两个字符串的内容相同,使用 ”==” 比较时也为 ”false” ,如果只需比较内容是否相同,应使用 ”equals()” 方法 。
实例1:
public class HelloWorld {
public static void main(String[] args) {
String s1 = "imooc";
String s2 = "imooc";
//定义字符串s3,保存“I love”和s1拼接后的内容
String s3 = "I love " + s1;
// 比较字符串s1和s2
// imooc为常量字符串,多次出现时会被编译器优化,只创建一个对象
System.out.println("s1和s2内存地址相同吗?" + (s1 == s2));
//比较字符串s1和s3
System.out.println("s1和s3内存地址相同吗?" + (s1 == s3));
String s4 = "I love " + s1;
//比较字符串s4和s3
// s1是变量,s4在运行时才知道具体值,所以s3和s4是不同的对象
System.out.println("s3和s4内存地址相同吗?" + (s4 == s3));
}
}
运行结果:
s1和s2内存地址相同吗?true
s1和s3内存地址相同吗?false
s3和s4内存地址相同吗?false
实例2:
public class StringDemo {
public static void main(String[] args) {
// String str = "abc";
// str = "def";
// System.out.println(str);
// s1指向方法区
String s1 = "ab";
// s2指向堆内存,堆内存指向方法区
String s2 = new String("ab");
// 字符串在方法区中只存放一份
// 后续使用到值相等的字符串的时候使用的是同一个
String s3 = "ab";
// "a"和"b"是两个字面量
// 字面量在参与运算的时候为了提高效率在编译时期就会运算
// String s4 = "a" + "b"; -> String s4 = "ab";
String s4 = "a" + "b";
// s5 = s5 + "b";不会优化
// 实际上底层是利用了StringBuilder中的append方法来完成
String s5 = "a";
// s5 = new StringBuilder(s5).append("b").toString();
// s5最后指向堆内存,堆内存再指向方法区
s5 = s5 + "b";
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1 == s4);
System.out.println(s1 == s5);
System.out.println(s2 == s5);
}
}
运行结果:
false
true
true
false
false
Java 字符串 String的更多相关文章
- Java字符串String
Java字符串String 我们知道Java的字符窜是Immutable(不可变)的,一旦创建就不能更改其内容了:平常我们对字符串的操作是最多的,其实对字符串的操作,返回的字符串都是新建的字符串对象, ...
- Java字符串String 集合的迭代器
Java字符串String 我们知道Java的字符窜是Immutable(不可变)的,一旦创建就不能更改其内容了:平常我们对字符串的操作是最多的,其实对字符串的操作,返回的字符串都是新建的字符串对象, ...
- java 字符串String
在 Java 中,字符串被作为 String 类型的对象处理. String 类位于 java.lang 包中.默认情况下,该包被自动导入所有的程序. 创建 String 对象的方法: 只要是双引号标 ...
- Java字符串String类操作方法详细整理
关于String类的基本操作,可分为以下几类: 1.基本操作方法 2.字符串比较 3.字符串与其他数据类型之间的转换 4.字符与字符串的查找 5.字符串的截取与拆分 6.字符串的替换与修改 我觉得在整 ...
- java 字符串(String)常用技巧及自建方法模块汇总
1.String类常用方法汇总 (1)删除字符串的头尾空白符 public String trim() (2)从指定位置截取字符串 public String substring(int beginI ...
- [Java学习] Java字符串(String)
从表面上看,字符串就是双引号之间的数据,例如“微学苑”.“http://www.weixueyuan.net”等.在Java中,可以使用下面的方法定义字符串: String stringName = ...
- Java字符串(String)
从表面上看,字符串就是双引号之间的数据,例如“微学苑”.“http://www.weixueyuan.net”等.在Java中,可以使用下面的方法定义字符串: String stringName ...
- 老司机也晕车--java字符串String晕车之旅
首先声明,有晕车经历的司机请自备药物,String也可能让你怀疑人生! 第一道 开胃菜 请听题!第一道题: String hello="hello world!"; String ...
- Java字符串——String深入
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10840495.html 一:字符串的不可变性 1.可变 与 不可变 辨析 Java中的对象按照创建后,对象的 ...
随机推荐
- TortoiseGit 访问https远程仓库,上报SSL证书错误解决方法
报错 在使用TortoiseGit时,clone自己搭建的gitlab报如错SSL certificate problem: self signed certificate 原因:自行搭建的gitla ...
- 使用ntpdate工具校正linux服务器时间
当Linux服务器的时间不对的时候,可以使用ntpdate工具来校正时间. 安装:yum install ntpdate ntpdate简单用法: # ntpdate ip # ntpdate 210 ...
- BZOJ 1853: [Scoi2010]幸运数字(容斥原理)
http://www.lydsy.com/JudgeOnline/problem.php?id=1853 题意: 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运 ...
- Tinkoff Challenge - Elimination Round D. Presents in Bankopolis(区间DP)
http://codeforces.com/contest/793/problem/D 题意:给出一些点和他们之间的距离,是有向的,这些点从1~n顺序排列,现在选出k个点组成一条路径,使他们之间的距离 ...
- [sql]SET NOCOUNT ON 的作用
使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息. 说明: 场景1:(不使用SET NOCOUNT) 场景2:(使用SET NOCOUNT ON ) 场景3:(使用SET N ...
- 递归--练习7--noi1750全排列
递归--练习7--noi1750全排列 一.心得 二.题目 1750:全排列 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个由不同的小写字母组成的字符串,输出这个字符串的所 ...
- 为什么需要消息队列MQ?
主要原因:是在高并发情况下,由于来不及同步处理,请求往往会发生堵塞,比如诸多的insert.update之类的请求同时到达mysql,直接导致无数的行锁表锁,甚至最后请求会堆积很多,从而触发大量的to ...
- arcgis api for silverlight开发系列之二:缓存图层与动态图层及图层总结 .
本文摘自:http://blog.csdn.net/leesmn/article/details/6916458(很优秀的博客) 作为ESRI的平台的一份子arcgis api for silve ...
- Spring 调度任务@scheduled学习总结
官网Api:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html#sche ...
- IOS-快速集成检查更新
一直以为Appstore有了检查版本是否更新的机制,我们在APP上做这个更新功能会被拒,但是也有看到一些APP也是做了这个更新功能的.因为在网上没有找到完全正确的方法能获取到iTunes里的数据的,于 ...