java基础
待补
前言
在Java中,字符串(String)是一种非常重要的数据类型,用于表示文本数据。字符串是字符的序列,可以包含0个或多个字符,并且这些字符可以是字母、数字、空格、标点符号等。
1.String类
1.1声明字符串
字符串必须使用**“”**包裹
声明的字符串变量必须设置初始值,基础类型会有默认初始值,但字符串对象不会,所以必须手动赋予初始值。
1.2创建字符串
1.2.1使用构造器创建
传入字符数组或者字符串为参数
char a[]={'a','b','c'}
Satring s=new String(a)
//或者
String s =new String("abc")
1.2.2直接使用""创建
String str1,str2;
str1="abc";
str2="abc";
1.2.3区别
使用构造器创建的字符串对象和其他引用对象一样,会在堆内存中分别开辟一个区域进行存储,即使字符串的内容一致,也会在内存中开辟不同的两个对象。
使用**""创建的对象,会把对象创建在堆内存中一个叫"串池"的地方,并且,在创建前会先检查串池中是否存在同内容的字符串对象**,如果存在就复用
2.连接字符串
2.1多字符串连接
使用**+**可以连接多个字符串
2.2连接其他数据类型
使用+把字符串和其他数据类型连接,则会直接把其他数据类型转换为字符串
3.获取字符串信息
3.1获取字符串长度
使用String类提供的length()方法可以获取到字符串的长度。
3.2字符串查找
indexOf(String str)
这个方法返回第一次出现的指定子字符串在此字符串中的索引。
如果没有找到子字符串,则返回 -1。
lastIndexOf(String str)
返回在此字符串中的最右边出现指定子字符串的索引。
如果没有找到子字符串,则返回 -1。
indexOf(String str, int fromIndex)
与 indexOf(String str) 类似,但是从 fromIndex 开始搜索。
如果没有找到子字符串,则返回 -1。
lastIndexOf(String str, int fromIndex)
与 lastIndexOf(String str) 类似,但是从 fromIndex 或之前的位置开始向左搜索。
如果没有找到子字符串,则返回 -1。
contains(String str)
检查此字符串是否包含指定的子字符串。
如果包含则返回 true,否则返回 false
String a="avaeasg";
System.out.println(a.indexOf("ae"));
System.out.println(a.contains("lk"));
4.字符串操作
4.1获取子字符串
使用String类提供的substring()方法可以并传入int型参数可以从指定索引截取子串。可以只传起始索引,也可以同时额外传入结束索引,结果包含起始索引字符,不包含结束索引字符。
String a="avaeasg";
System.out.println(a.substring(2,4));
4.2字符串替换
String类提供的replace()方法可以把指定字符串替换为新字符串
String a="avaeasg";
System.out.println(a.replace("ae","替换"));
4.3判断字符串开始与结尾
使用startwith(),endwith()方法
String a="avaeasg";
System.out.println(a.startsWith("av"));
System.out.println(a.endsWith("sg"));
4.4判断字符串相等
使用equals()方法比较字符串内容是否相等(使用==比较引用类型时,比较的是两对象的地址值)。
使用equlsignoreCase()方法在忽略大小写的情况下比较字符串内容是否相等
4.5字符串大小写转换
使用toLowerCase()方法把所有大写字母改为小写字母
使用toUpperCase()方法把所有小写字母改为大写字母
4.6字符串分割
使用split()方法分割字符串,(即以传入的字符串为分隔符,来对原字符串进行划分)
5.字符串格式化
5.1日期和时间格式化
在要使用日期和时间并需要将其转换为字符串时,通常会需要将其转换为某些格式的字符串比如2024-7-17(具体格式看个人需求)。这种让日期对象转换为特定格式的字符串的过程就是格式化。这里不赘述,在需要时可以向AI取证。
5.2常规类型格式化
其他类型的值也可以转换格式,比如将某个整数换为十六进制表示。
6.正则表达式
正则表达式可以检查字符串是否满足某些要求,具体语法不赘述,使用Sring类中的**matches(“正则表达式”)**方法来判断某字符是否满足对应正则表达式。
String a="acvasw";
System.out.println(a.matches("(\\p{Lower})*"));//任意数量的小写字母
7.字符串生成器StringBuilder
7.1介绍
普通的字符串一旦创建其内容无法更改,即使使用+进行添加,也是在内存中创建了一个新对象来存储新值。这样会消耗更多内存,于是后来的jdk提供StringBuilder来解决这个问题。
StringBuilder 类允许你在运行时动态地修改字符串数据。由于 String 类是不可变的,这意味着一旦创建了一个 String 对象,你就不能更改它的内容。但是,StringBuilder 提供了可变的字符串缓冲区,使得添加、删除和修改字符串内容变得简单。
7.2常用操作
以下是如何使用 StringBuilder 来修改字符串的几个常见操作:
创建 StringBuilder 实例: 你可以通过构造函数使用现有的字符串来初始化 StringBuilder。
追加内容: 使用 append() 方法可以将任何类型的数据追加到现有字符串的末尾。
插入内容: 使用 insert() 方法可以在指定位置插入内容。
替换内容: 使用 replace() 方法可以在指定范围内替换字符串。
删除内容: 使用 delete() 或 deleteCharAt() 方法可以删除字符串中的部分或全部内容。
修改单个字符: 使用 setCharAt() 方法可以修改字符串中特定位置的字符。
反转字符串: 使用 reverse() 方法可以反转字符串中的字符顺序。
获取最终结果: 使用 toString() 方法可以将 StringBuilder 的内容转换回不可变的 String。
8.字符串底层
字符串底层是一个数组.
在jdk1.9以前是一个char[],jdk1.9之后是一个byte[]。
当底层是byte类型的数组,字符串对象会先调用字符串本身的getBytes()方法获取到对应的字节数组后再进行存入。
8.1不同的对象创建方式
一个字符串对象可以直接使用**"“创建,也可以使用String()构造器**创建。
区别:使用”"创建的字符串对象存在于字符串常量池(串池)中,使用构造器创建的对象存在于堆中。
补充:串池是一片 用来存储字符串常量的内存区域。在jdk1.8前它存在于方法区中,jdk1.8之后随着元空间搬到本地内存中,串池也就被放到堆中。
8.2字符串拼接原理
仅字符串常量拼接:使用字符串优化机制,在编译时已经是拼接完的结果。
字符串变量与字符串常量拼接:jdk1.8前和jdk1.8后的原理不同,这里分开讲。
jdk1.8前:
每次使用一个字符串变量和字符串常量拼接,都会在堆中新建一个StringBuilder对像,StringBuilder对象从串池中取出要拼接的字符串进行拼接,最后StringBuilder对象调用toString方法来在堆中创建一个新的String对象存放拼接完的字符串。
jdk1.8之后:
在拼接前先估计最终拼接结果的长度,然后再创建一个数组来进行拼接操作,最终返回拼接完的字符串。
8.3StringBuilder底层
底层也是一个数组,这里jdk17(查看时的版本),中该数组是一个byte类型的数组。
总结
本文章简单介绍一下字符串的使用。