什么是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的更多相关文章

  1. Java字符串String

    Java字符串String 我们知道Java的字符窜是Immutable(不可变)的,一旦创建就不能更改其内容了:平常我们对字符串的操作是最多的,其实对字符串的操作,返回的字符串都是新建的字符串对象, ...

  2. Java字符串String 集合的迭代器

    Java字符串String 我们知道Java的字符窜是Immutable(不可变)的,一旦创建就不能更改其内容了:平常我们对字符串的操作是最多的,其实对字符串的操作,返回的字符串都是新建的字符串对象, ...

  3. java 字符串String

    在 Java 中,字符串被作为 String 类型的对象处理. String 类位于 java.lang 包中.默认情况下,该包被自动导入所有的程序. 创建 String 对象的方法: 只要是双引号标 ...

  4. Java字符串String类操作方法详细整理

    关于String类的基本操作,可分为以下几类: 1.基本操作方法 2.字符串比较 3.字符串与其他数据类型之间的转换 4.字符与字符串的查找 5.字符串的截取与拆分 6.字符串的替换与修改 我觉得在整 ...

  5. java 字符串(String)常用技巧及自建方法模块汇总

    1.String类常用方法汇总 (1)删除字符串的头尾空白符 public String trim() (2)从指定位置截取字符串 public String substring(int beginI ...

  6. [Java学习] Java字符串(String)

    从表面上看,字符串就是双引号之间的数据,例如“微学苑”.“http://www.weixueyuan.net”等.在Java中,可以使用下面的方法定义字符串: String stringName = ...

  7. Java字符串(String)

    从表面上看,字符串就是双引号之间的数据,例如“微学苑”.“http://www.weixueyuan.net”等.在Java中,可以使用下面的方法定义字符串:    String stringName ...

  8. 老司机也晕车--java字符串String晕车之旅

    首先声明,有晕车经历的司机请自备药物,String也可能让你怀疑人生! 第一道 开胃菜 请听题!第一道题: String hello="hello world!"; String ...

  9. Java字符串——String深入

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10840495.html 一:字符串的不可变性 1.可变 与 不可变 辨析 Java中的对象按照创建后,对象的 ...

随机推荐

  1. 如何表示各个时区的时间DateTime.ToString()

    使用sqlite进行时间的插入的时候,使用了 DateTime.ToString("s")  //s: 2008-06-15T21:15:07 插入到数据库之后,发现时间被加了8个 ...

  2. 【Java----正则关键字转义】

    正则需要转义字符:'$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|'   问题现象:  替换URL格式的字符串时 ...

  3. hdu 6430 线段树 暴力维护

    Problem E. TeaTree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  4. caffe2 环境的搭建以及detectron的配置

    caffe2 环境的搭建以及detectron的配置 建议大家看一下这篇博客https://tech.amikelive.com/node-706/comprehensive-guide-instal ...

  5. python 去除不可见的控制字符

    尤其是在json load的时候,字符串中的不可见控制字符可能会导致错误,应该先对字符串进行控制字符过滤. 对网页文本同样适用,最好在处理网页文本时先进性控制字符清洗. Replace null by ...

  6. php 格式化时间

    <?php echo date("Y/m/d") . "<br>"; echo date("Y.m.d") . " ...

  7. Java 字节的常用封装

    一. Java 的字节 byte (字节) 是 Java 中的基本数据类型,一个 byte 包含8个 bit(位),byte 的取值范围是-128到+127. byte 跟 Java 其他基本类型的关 ...

  8. UI 交互

    动效设计 亮色优缺点 排版 原型图交互说明

  9. 【转】使用sklearn做特征工程

    1 特征工程是什么? 有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已.那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中 ...

  10. npm安装vue详细教程(图片详解)

    npm安装vue详细教程(图片详解) 一.总结 一句话总结:整个安装流程照着教程来,注意系统环境变量的配置,注意一下npm的本地仓库和缓存位置 教程 系统环境变量 仓库 缓存 1.什么情况下最适合用n ...