String类

  • 一、String类的特点
  • 二、String 类的常见构造方法
  • 三、String常见的面试题
  • 1.字符串常量池
  • 2.String s = "abc"与String s = new String("abc")区别
  • 3.字符拼接+
  • 4.常量优化机制
  • 四、String常用方法
  • 1. 比较字符串内容
  • 2. 遍历字符串
  • 3.截取字符串
  • 4.替换字符串
  • 5.切割字符串


一、String类的特点
  1. String是一个类,属于引用数据类型,不属于基本数据类型。

JAVA中String可以进行除法吗 java string a_java

  1. Java 程序中所有双引号字符串, 都是 String 类的对象
/*
* 这里的"abc",就是一个String类对象
* 所以可以调用类里面的方法
* */
System.out.println("abc".length());
System.out.println("abc".toUpperCase());
  1. 字符串在创建之后, 其内容不可更改

例子如下:

String s="abc";
s="def";
System.out.println(s);//打印结果def

上面的例子相当于:

char data1[] = {'a', 'b', 'c'};
String s = new String(data1);

char data2[] = {'d', 'e', 'f'};
s=new String(data2);//使用新的对象进行替换

System.out.println(s);//打印结果def

结论:字符串对象一旦被创建,其内容就不能更改。要更改就只能使用新的字符串对象进行替换。后面会给出内存图。

  1. 字符串虽然不可改变, 但是可以被共享
String s1="abc";
String s2="abc";

System.out.println(s1==s2);//true

结论:String是引用数据类型,所以==号比较的是地址,也就是说,s1和s2共享同一份地址。
这是什么原因呢?

在JDK当中双引号括起来的字符串,例如:“abc” "def"都是直接存储在“方法区”的“字符串常量池”当中的。

字符串常量池:

当我们使用双引号创建字符串对象时,会检查字符串常量池中是否存在该数据
存在:复用(共享)
不存在:创建

JAVA中String可以进行除法吗 java string a_System_02

二、String 类的常见构造方法

JAVA中String可以进行除法吗 java string a_java_03

//最常用的方式,不使用构造器
String s1 = "abc";
System.out.println(s1);//abc

//构造方法1:public String()
String s2=new String();
System.out.println(s2);//空白字符串

//构造方法2:public String(String original)
String s2 = new String("abc");//根据传入的字符串,创建字符串对象
System.out.println(s2);//abc

//构造方法3:public String(char[] chs)
char[] c = {'a' , 'b', 'c'};
String s3 = new String(c);//根据字符数组,创建字符串对象
System.out.println(s3);//abc
三、String常见的面试题
1.字符串常量池

JAVA中String可以进行除法吗 java string a_System_04

2.String s = "abc"与String s = new String(“abc”)区别

JAVA中String可以进行除法吗 java string a_System_05

3.字符拼接+

JAVA中String可以进行除法吗 java string a_System_06

4.常量优化机制
//Main.java
String s1="abc";
String s2="a"+"b"+"c";
System.out.println(s1==s2);//true
//Main.class
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);

分析:与上一道题不同的是,这里字符串拼接符+左右都是字符串常量,没有变量。所以,常量优化机制吧它拼接成“abc”。因此,在字节码文件中,s1与s2一样,变为第一道面试题了。

四、String常用方法

JAVA中String可以进行除法吗 java string a_字符串_07

1. 比较字符串内容

public boolean equals方法(要比较的字符串) : 比较内容
public boolean equalsIgnoreCase(要比较的字符串) : 比较内容, 忽略大小写

String s1="abc";
String s2=new String("abc");
String s3="AbC";
System.out.println(s1==s2);//false
System.out.println(s1.equals(s2));//true
System.out.println(s1.equals(s3));//false
System.out.println(s1.equalsIgnoreCase(s3));//true
2. 遍历字符串

public char[] toCharArray () : 将字符串转换为字符数组
public char chatAt (int index) : 根据索引找字符
public int length() : 返回字符串的长度

方法一:

String s="abcdefgh";
char[] data=s.toCharArray();
for (int i = 0; i < data.length; i++) {
    System.out.println(data[i]);
}

方法二:

String s="abcdefg";
for (int i = 0; i < s.length(); i++) {
    System.out.println(s.charAt(i));
}

推荐使用方法一,就只调用了一次toCharArray()。而方法二,每次循环都调用了一次length()和charAt(),开销大。

3.截取字符串

public String substring(int beginIndex) 截取到末尾
public String substring(int beginIndex, int endIndex) 根据开始和结束索引做截取, 包含头不包含尾

案例:截取手机号,隐藏中间四位

String s="12345678901";

String start=s.substring(0,4);//截取前四位
String end=s.substring(7);//截取后四位
System.out.println(start+"****"+end);//1234****8901
4.替换字符串

public String replace(旧值,新值) : 替换
案例:敏感词替换(仅为案例)

String s="你TMD真是个小可爱";
s=s.replace("TMD","***");
System.out.println(s);//你***真是个小可爱
5.切割字符串

public String[] split(String regex) :根据给出的标识切割字符串

String s="192.168.0.0";
String[] splits = s.split("\\.");
for (int i = 0; i < splits.length; i++) {
    System.out.println(splits[i]);// 192  168  0  0
}

注意:如果根据指定标识符无法进行切割,则加上\\