首先我们知道在C语言中没有字符串类型只能通过字符数组或者字符指针使用字符串,但是在Java中是有字符串类型的也就是今天要说的String类,好我们一起来看
目录
字符串构造
字符串对象的比较
1. ==比较是否引用同一个对象
2. boolean equals(Object anObject) 方法:按照字典序比较
3. int compareTo(String s) 方法: 按照字典序进行比较
4. int compareToIgnoreCase(String str) 方法
字符串查找
charAt
indexOf
lastIndexOf
转换
数字转字符串 valueOf
字符串转数字 valueOf 或 parseInt
小写转大写 toUpperCase
大写转小写 toLowerCase
字符串转数组 toCharArray
格式化形式转化为字符串 format
字符串替换
replace
replaceAll
replaceFirst
字符串拆分
split
字符串截取
subString
trim 去除字符串左右空格
字符串常量池
常量池
注意
intern方法
字符串的不可变性
字符串拼接
StringBuffer和StringBuilder
append
toString
注意
面试题
字符串构造
String str1="hello";
String str2=new String("haha");
char[] arr={'a','b','c'};
String str3=new String(arr);
以上三种就是在Java中最常见的三种字符串构造的方式
注意:
1.在Java中字符串不以‘\0’结尾,所以就需要使用字符串长度来判断结尾
2. String是引用类型,内部并不存储字符串本身
可以看到字符串是存在char类型的数组中的
可能还是不好理解这里我画图介绍一下
注意这里没有涉及到字符串常量池,只是为了理解String类中的value和hash以及上面的三行代码
字符串对象的比较
1. ==比较是否引用同一个对象
这里要知道==比较基本数据类型时是比较值,但是在引用数据类型中是比较地址是否相同
2. boolean equals(Object anObject) 方法:按照字典序比较
这里String类重写了父类Object中equals方法,Object中equals默认按照==比较,但此时的equals方法是比较对象的内容,字典序是字符大小顺序
3. int compareTo(String s) 方法: 按照字典序进行比较
compareTo与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型,返回字符的差值
4. int compareToIgnoreCase(String str) 方法
compareToIgnoreCase方法与compareTo方式相同,但是忽略大小写比较
好的以上就是Java中四种字符串比较方式,具体使用哪个看自己代码需求
字符串查找
字符串查找也是字符串中非常常见的操作,String类提供的常用查找的方法:
charAt
char charAt(int index) 返回index下标对应的字符,注意不要越界访问
indexOf
int indexOf(int ch) 返回字符ch(第一次出现)对应的下标,没有返回-1
indexOf方法有多个构成重载具体使用看场景
lastIndexOf
int lastIndexOf(int ch) 从后到前找返回字符ch第一次出现的下标,没有返回-1
lastIndexOf方法有多个构成重载具体使用看场景
转换
数字转字符串 valueOf
字符串转数字 valueOf 或 parseInt
小写转大写 toUpperCase
大写转小写 toLowerCase
注意:这里大小写转换只涉及到字母转换,非字母字符不会转换
字符串转数组 toCharArray
格式化形式转化为字符串 format
字符串替换
使用一个指定的新的字符串替换掉已有的字符串数据
replace
替换字符
String replace(char oldChar,char newChar)
replaceAll
替换所有指定的内容
String replaceAll(String regex, String replacement)
replaceFirst
替换首个指定的内容
String replaceFirst(String regex, String replacement)
注意:由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串 ,这个在后面会详细说
字符串拆分
可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串
split
String[] split(String regex) 拆分字符串按照传参方式分割
我们还可以多传一个参数来限制分隔次数
注意:
1. 字符"|","*","+"都得加上转义字符,前面加上 "\\"
2. 而如果是 "\" ,那么就得写成 "\\\\"
3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符
这里我举个例子加深理解,能看懂这个代码应该就掌握了
字符串截取
subString
String subString(int beginIndex) 从下标开始截取到末尾,下标从0开始
String subString(int beginIndex,int endIndex) 截取指定区间字符(左闭右开)
trim 去除字符串左右空格
trim 会去掉字符串开头和结尾的空白字符(空格, 换行, 制表符等)
好的以上就是Java中操作字符串常用的方法,每个方法都有代码介绍,希望对你有帮助,但是有关String类的知识还没介绍完我们接着来看
字符串常量池
在了解字符串常量池的知识前我们先看一段代码
想想输出结果是什么呢,都是字符串“hello”结果应该相同吧我们来看
结果不同这是为什么呢这就有关常量池的概念了看完博客相信你就懂了
字符串常量池其实就是一个StringTable的东西,StringTable其实就是一个哈希表
当然我画的图也不是最完整的在String对象与字符串常量池之前还会有一块空间记录对象的地址
这里要知道只要双引号引起来的元素,全部存放到常量池中且只有一份,在存放的时候会先去常量池中检查是否存在这个常量
常量池
1.Class文件常量池:每个.Java源文件编译后生成.Class文件中会保存当前类中的字面常量以及符号信息
2. 运行时常量池:在.Class文件被加载时,.Class文件中的常量池被加载到内存中称为运行时常量池,运行时常
量池每个类都有一份
3. 字符串常量池:在堆中
注意
1. 在JVM中字符串常量池只有一份,是全局共享的
2. 刚开始字符串常量池是空的,随着程序不断运行,字符串常量池中元素会越来越多
3. 当类加载时,字节码文件中的常量池也被加载到JVM中,称为运行时常量池,同时会将其中的字符串常量保存在字符串常量池中
4. 字符创常量池中的内容:一部分来自运行时常量池,一部分来自程序动态添加
intern方法
intern 是一个native方法 该方法的作用是手动将创建的String对象添加到常量池中
我们来看代码
可以看到自是多了一行代码结果就发生了改变,这是为什么请看图解
字符串的不可变性
String是一种不可变对象. 字符串中的内容是不可改变,字符串不可被修改
可以看到在源码中value数组是final修饰的,被final修饰表示指向对象不能改变,但指向的内容可以修改
但是字符串的不可变性并不是final影响而是private,并且String类中并没有提供关于数组getset方法所以字符串的内容是不可改变的
final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的
字符串拼接
上述代码中有多少对象呢?
不太好看我来试着写一下代码来表示
public static void main(String[] args) {
String str=new String("hello");
// str=str+"world";
StringBuilder sb=new StringBuilder();
sb.append(str);
sb.append("world");
str=sb.toString();
System.out.println(str);
}
由于字符串不可变所以尽量避免对String的直接使用,如果要修改建议尽量使用StringBuffer或者StringBuilder
StringBuffer和StringBuilder
由上述字符串拼接我们知道使用String拼接会产生大量临时字符串所以要使用StringBuffer或者StringBuilder所以我们就来介绍一下这两个类
Java中又提供StringBuilder和StringBuffer类,这两个类大部分功能是相同的我简单介绍
append
StringBuff append(String str) 在尾部追加,相当于String+= 作为拼接字符串使用
toString
String toString() 将所有字符按照String返回
好的还有很多方法可以自己下去实践使用这里只列举两个方法的使用
String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可
以修改,频繁修改字符串的情况考虑使用StringBuilder
注意
String和StringBuilder类不能直接转换,如果要想互相转换,可以采用如下原则
1)String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
2)StringBuilder变为String: 调用toString()方法
面试题
1)String、StringBuffer、StringBuilder的区别
1.String的内容不可修改,StringBuffer与StringBuilder的内容可以修改
2.StringBuffer与StringBuilder大部分功能是相似的,但是StringBuilder是线程不安全的,StringBuffer是线程安全的
2)String str = new String("a") + new String("b"); // 会创建多少个对象
看到这里String语法相关知识就总结完成了,当然可能也有我总结有误的地方还请大佬提醒一下,希望对你有帮助,觉得有用还请点赞评论会回关的,一起努力共同进步!!