1.String类的重要性
在程序开发中,经常会用到字符串。字符串是指一连串的字符。它是由许多单个字符串连接而成,如多个英文字母所组成的一个英文单词。字符串可以包含任意字符,这些字符必须包含在一对双引号""之内。如:"aaddd"。
Java中定义了3个封装字符串的类,分别是String类、StringBuffer类、StringBuilder类,他们在java.lang包中,并且提供了一系列操作字符串的方法,这些方法不需要导包可以自己使用,在开发和校招笔试中,字符串也是常客。
2.String类的初始化
在使用String类进行字符串操作之前,首先需要对String类进行初始化。
2.1字符串构造
2..1.1使用常量串构造
2.1.2直接newString对象
创建一个空字符串
2.1.3创建一个内容为abcdff的字符串
2.1.4使用字符数组进行构造
注意:string是引用类型,内部并不存储字符串本身,在string类的实现源码中,String类实例变量如下
我们先看以下代码
s1和s2引用的是不同对象,s1和s3引用的是同一对象,堆栈图如下:
数组的引用,存的是数组的地址,byte[]类型的数组
String是一个全新的数据类型,String是一个类类型,是一个引用类型,Java当中没有字符串的结尾是\0这种说法。
3.String对象的比较
字符串是比较常见的操作之一,比如字符串排序,Java总共提供了四种方法
3.1 == 比较是否引用同一对象
注意:对于内置类型 == 比较的是变量中的值,对于引用类型==比较的是引用中的地址
3.2boolean equals(Object anObject)方法:按字典序比较。
字典序:字符大小的顺序
String类重写了父类Object的equals方法,Object中equals默认按照==比较,String重写equlas方法后,按照以下规则进行比较:
比较的是里面的内容
下面我们写代码来看看
s1、s2、s3的内容都是hello,我们发现s1和s2用==比较结果是false,因为==比较引用类型比较的是地址,s1和s2的地址是不同的,所以是false。s1和s3用==比较结果是true因为他们引用了是同一对象同一个地址。s2和s3用==比较结果是false,原因和s1和s2是一样的。
用equals比较,比较的是里面的内容所以都是true
3.3 int compareTo(String s) 方法: 按照字典序进行比较
与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:
1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
2. 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值
3.4 int compareToIgnoreCase(String str) 方法:与compareTo方式相同,但是忽略大小写比较
4.字符串的查找
String类提供的常见查找方法:
下面我们一个一个来看看
4.1charA方法是根据下标进行查找
这样子查找容易造成越界,我们改进一下
4.2indexOf 查找对应字符或者字符串,注意这个从前往后找的
4.3lastIndex查找对应字符或者字符串,注意这个从后往前找的
5.数值和字符串的转化
6.大小写转换
7.字符串转数组
8.格式化
9.字符串的替换
10.字符串的拆分
可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串
注意返回类型是数组,需要用数组来进行接收
注意事项:
1. 字符"|","*","+"都得加上转义字符,前面加上 "\\" .
2. 而如果是 "\" ,那么就得写成 "\\\\" .
3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.
例如:以下的演示
11.字符串的截取
注意:
1. 索引从0开始
2. 注意前闭后开区间的写法, substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标
12.去掉左右空格保留中间空格
注意看运行结果是不同的
13.String的不可变性
String是一种不可变对象,字符串的内容是不可以改变的,字符串不能被修改
13.1String类在设计时就是不可改变的,String类内部实现描述中已经被说明
1. String类被final修饰,表明该类不能被继承
2. value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改。所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象
不能修改的原因 不是因为String类自身,或者其内部value被final修饰而不能被修改。