一.String类的概述:
1.String类:代表字符串
2.字符串是常量,一旦被赋值,其值不能在改变
方法区:有一个内存区域:字符串常量池
如果我们创建一个字符串对象,给对象赋值,这个值会在常量池找,有的话,就返回,没有在常量池开辟空间
public class Demo2{
public static void main(String[] args) {
//创建字符串对象
String s = "hello" ;
s += "world" ;
System.out.println("s:"+s);
}
}
结果:
s:helloworld
内存图解:
3.练习:
String s1 = new String(“hello”);创建了几个对象
String s2 = “hello” ;创建了几个对象
s1:创建了两个对象
s2:创建了一个对象,指向常量池中
分析:
4.看程序写结果
public class Demo3{
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
System.out.println(s3 == s1 + s2);
System.out.println(s3.equals((s1 + s2)));
System.out.println(s3 == "hello" + "world");
System.out.println(s3.equals("hello" + "world"));
}
}
结果:
false
true
true
true
分析:
字符串变量相加,先开辟空间,在相加
字符串常量相加,先相加,然后在常量池中,是否有这个值,由直接返回地址值,没有就创建
==和equals的区别:
==
:默认比较的是地址值
equals:比较的是内容
二.String类常见的方法
构造方法
public String()
:无参构造public String(byte[] bytes)
:将字节数组转换成字符串public String(byte[] bytes,int offset,int length)
:将字节数组的一部分转换成字符串public String(char[] value
):将字符数组转换成字符串public String(char[] value,int offset,int count)
:将字符数组的一部分转换成字符串public String(String original)
:将一个常量转换字符串:String 是不可变的,所以无需使用此构造方法- 举例:
public class Demo1 {
public static void main(String[] args) {
//无参构造:
String s = new String() ;
//空字符序列
System.out.println(s);
//返回字符串长度
System.out.println(s.length());
System.out.println("-----------------------");
//public String(byte[] bytes):将字节数组转换成字符串
//构造一个字节数组,静态初始化
byte[] bys = {97,98,99,100,101} ;
String s2 = new String(bys) ;
System.out.println(s2);
System.out.println(s2.length());
//public String(byte[] bytes,int offset,int length):将字节数组的一部分转换成字符串
String s3 = new String(bys, 0, 3) ;
System.out.println(s3);
System.out.println(s3.length());
System.out.println("-------------------------");
//创建一个字符数组
char[] ch = {'a','b','c','d','e','f','g','h','i'} ;
//public String(char[] value):将字符数组转换成字符串
String s4 = new String(ch) ;
System.out.println(s4);
System.out.println(s4.length());
System.out.println("-------------------------");
// public String(char[] value,int offset,int count):将字符数组的一部分转换成字符串:char[] value,int index,int length
String s5 = new String(ch, 5, 4) ;
System.out.println(s5);
System.out.println(s5.length());
//public String(String original):将一个常量转换字符串:由于String 是不可变的,所以无需使用此构造方法
String s6 = new String("hello") ;
System.out.println(s6);
System.out.println(s6.length());
//创建字符串对象s6相当于 s7字符串对象的创建方式
String s7 = "hello" ;
System.out.println(s7);
System.out.println(s7.length());
}
}
结果:
0
-----------------------
abcde
5
abc
3
-------------------------
abcdefghi
9
-------------------------
fghi
4
hello
5
hello
5
String的获取功能
int length()
:获取字符串的长度- char charAt(int index):返回指定索引处的字符
int indexOf(int ch)
:返回指定字符在此字符串中第一次出现处的索引
int indexOf(String str)
:返回指定字符串在此字符串第一次出现的索引
int indexOf(int ch,int fromIndex)
:返回此字符中从指定位置开始后第一次出现的索引
int indexOf(String str,int fromIndex)
:返回此字符串中从指定位置开始后第一次出现的索引- String substring(int start):从指定位置开始截取, 默认截取到末尾(包含start这个索引)
String substring(int start,int end):从指定位置开始截取到指定位置结束(包含start,不包含end—包左不包右) - 举例:
public class Demo4 {
public static void main(String[] args){
//定义一个字符串
String s = "helloworld";
//int length():获取字符串的长度
System.out.println(s.length());
//char charAt(int index):返回指定索引处的字符
System.out.println(s.charAt(4));
//int indexOf(int ch):返回回指定字符在此字符串中第一次出现处的索引
System.out.println(s.indexOf('l'));
//int indexOf(String str):返回指定字符串在此字符串第一次出现的索引
System.out.println(s.indexOf("el"));
//String substring(int start,int end):从指定位置开始截取到指定位置结束:包左(start这个索引),不包含end这个位置
System.out.println(s.substring(4, 8));
}
}
结果:
10
o
2
1
owor
String的转换功能
byte[] getBytes()
:将一个字符串转换字节数组- char[] toCharArray():将一个字符串转换成字符数组
static String valueOf(char[] chs)
:将字符数组转换成字符串
static String valueOf(int i)
:将int类型的数据转换字符串
注意:String类中的valueOf方法可以将任何数据类型转换成StringString toLowerCase()
:将字符串转换成小写
String toUpperCase()
:将字符串转换成大写String concat(String str)
:字符串拼接功能
public class Demo5{
public static void main(String[] args) {
String s1 = "HelloWorld";
//byte[] getBytes():将一个字符串转换字节数组
byte[] arr = s1.getBytes();
for(int i = 0 ;i < arr.length ; i ++){
System.out.print(arr[i]+" ");
}
System.out.println();
System.out.println("-----------");
//char[] toCharArray():将字符串转换为字符数组
char[] chs = s1.toCharArray();
//static String valueOf(char[] chs):将字符数组转化为字符串(静态方法用类名调用)
String s2 = String.valueOf(chs);
System.out.println(s2);
System.out.println("------------");
//String toLowerCase():将字符串转换成小写
System.out.println(s1.toLowerCase());
System.out.println("------------");
//String toUpperCase():将字符串转换成大写
System.out.println(s1.toUpperCase());
System.out.println("------------");
String s3 = "java";
System.out.println(s1.concat(s3));
}
}
结果:
72 101 108 108 111 87 111 114 108 100
-----------
HelloWorld
------------
helloworld
------------
HELLOWORLD
------------
HelloWorldjava
String的替换功能
String replace(char old,char new)
:将老的字符替换成一个新的字符String replace(String old,String new)
:替换字符串String trim()
:去除字符串两端空格
public class Demo6 {
public static void main(String[] args) {
String s1 = " helloworld ";
//String replace(char old,char new):将老的字符替换成一个新的字符
System.out.println(s1.replace('o', 'l'));
//String replace(String old,String new):替换字符串
System.out.println(s1.replace("llo", "eee"));
//String trim():去除字符串两端空格
System.out.println(s1.trim());
}
}
结果:
helllwlrld
heeeeworld
helloworld
四.String类的综合练习
1.把数组中的数据按照指定格式拼接成一个字符串
举例:int[] arr = {1,2,3};
输出结果:[1, 2, 3] String类型
public class Demo7 {
public static void main(String[] args) {
//静态初始化一个数组
int[] arr = {1,2,3};
//定义一个空字符串
String s = "";
//先拼接开始的符号
s += "[";
//遍历数组进行拼接
for(int i = 0 ; i < arr.length ; i ++){
if(i == arr.length-1){
s += arr[i];
s += "]";
}else{
s += arr[i];
s += ",";
}
}
//输出字符串
System.out.println(s);
}
}
结果:
[1,2,3]
2.字符串反转
举例:键盘录入”abc” 输出结果”cba”
public class Demo8 {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
//将字符串转换为字符数组
char[] c = s.toCharArray();
//定义一个空的字符串
String s2 = "";
//反向遍历字符数组并进行拼接
for(int i = c.length-1 ; i >= 0 ; i --){
s2 += c[i];
}
//输出字符串
System.out.println(s2);
}
}
结果:
abc
cba
3.统计大串中小串出现的次数
import java.util.Scanner;
/*统计大串中小串出现的次数*/
public class Demo9 {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串(长串):");
String s = sc.nextLine();
System.out.println("请输入一个字符串(小串):");
String s2 = sc.nextLine();
//定义一个统计次数的遍历
int count = 0;
//查找大串中小串第一次出现的索引
int index = s.indexOf(s2);
//如果找不到,返回-1;如果找到,分步截取,count++
while(index != -1){
count ++ ;
//现在index索引和java所在的字符串长度作为起始位置
int startIndex = index + s2.length();
//再次截取大字符串,返回一个新的字符串,把新的字符串赋值给s
s = s.substring(startIndex);
//新的字符串在查找小字符串第一次出现的索引:继续查
index = s.indexOf(s2);
}
System.out.println(count);
}
}
结果:
请输入一个字符串(长串):
helloworldjavahellohelloworld
请输入一个字符串(小串):
world
2