Java之字符串


2018/12/24 Java

# 首先要明白

字符串String并不是一个基本类型的对象,而是引用类型 字符串就是一堆字符数组组合成的 String 被修饰为final,所以是不能被继承的

# 创建字符串

  1. 创建字符串有两种方法:

    • 直接赋值(推介,不仅仅是简单)
    String s1 ="哈哈";
    
    1
    • new
    //调用String的构造方法创建一个字符串对象
    String s2 = new String("嘿嘿");
    
    1
    2
  2. 通过+加号进行字符串拼接会创建新的字符串对象

    String s3 = s1+s2;  //s3为 哈哈嘿嘿
    
    1

new关键字可以理解为在内存中强制开辟一份内存

直接赋值的方式,会先在堆中寻找有没有相同已存字符串对象,没有的话新建一个,有的话直接引用相同的字符串对象,所以s1和s3是同一个对象
为什么推介直接赋值,因为这样的话如果字符相同就不会创建新的字符串对象,从而节省内存空间

 package String;

 public class TestString {
     public static void main(String[] args) {
        String s1 ="哈哈";
        String s3 ="哈哈";
        String s2 = new String("哈哈");
        String s4 = new String("哈哈");
        //这里为什么不用.equals()? .equals()是用于对字符串值的比较。 == 是比较内存地址
        System.out.print("s1和s2 ");
        System.out.println(s1==s2); //false
        System.out.print("s1和s3 ");
        System.out.println(s3==s1); //true
        System.out.print("s2和s4 ");
        System.out.println(s2==s4); //false
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# immutable

immutable 是指不可改变的
比如创建了一个字符串对象
String garen ="盖伦";
不可改变的具体含义是指:
不能增加长度
不能减少长度
不能插入字符
不能删除字符
不能修改字符
一旦创建好这个字符串,里面的内容 永远 不能改变

# 字符串格式化

如果不使用格式化输出,就需要进行字符串连接,如果变量比较多,拼接就会显得繁琐
使用格式化输出,就可以简洁明了

使用字符串格式化,就要使用printf()方法,这个方法使用类似C语言

可以查看源码得到,printf直接是直接调用的format
所以也可以直接使用format()输出(这样会不会提高一些性能?)

%s 表示字符串
%d 表示数字
%n 表示换行

public class TestNumber {
  
    public static void main(String[] args) {
 
        String name ="盖伦";
        int hp = 650;
        
        System.out.printf("姓名:%s%n血量:%d",name,hp);
    }
}
1
2
3
4
5
6
7
8
9
10

# 换行符

换行符就是另起一行 —— '\n' 换行(newline)
回车符就是回到一行的开头 —— '\r' 回车(return)
在eclipse里敲一个回车,实际上是回车换行符
Java是跨平台的编程语言,同样的代码,可以在不同的平台使用,比如Windows,Linux,Mac
然而在不同的操作系统,换行符是不一样的
(1)在DOS和Windows中,每行结尾是 “\r\n”;
(2)Linux系统里,每行结尾只有 “\n”;
(3)Mac系统里,每行结尾是只有 "\r"。
为了使得同一个java程序的换行符在所有的操作系统中都有一样的表现,使用%n,就可以做到平台无关的换行

# 四种情况分析

直接赋值字符串连接时,考虑编译期和运行期
如果在编译期可以被确定,那么就使用已有的对象,否则会创建新的对象

String a = "a";
//下面的a,在编译时因为是变量,所以是不确定的,只有运行时才能确定(编译是一行一行代码编译,下一行与上一行无关)
//所以编译的时候只能在创建一个新的对象,因而与a2不是同一个变量
String a1 = a+1;
String a2 = "a1";
System.out.println(a1==a2); //返回false
1
2
3
4
5
6

Initializing...

山楂树之恋
程佳佳