String
1. 概述
java.lang.String类 代表字符串,Java程序中所有字符串文字 例如“abcd” 都为 此类的对象
String name = "abcd";
注意:字符串的内容是不会改变的,在对象创建后不能更改。
字符串拼接产生一个新的字符串。
String A = "hello";
String B = "world";
System.out.println(A+B);
- 创建String对象的两种方式:直接赋值 和 new
1.1直接赋值
String name = "爪洼"; //直接赋值
public String(); //创建空白字符串,不包含任何内容
public String(String original); //根据传入的字符串,创建字符串对象
public String(byte[] chs); //根据字节数组,创建字符串对象
2 使用new的方式来获取一个字符串对象
2.1 空参构造:可以获取一个空白的字符串对象
String s1 = new String();
System.out.println("?" + s1 + "?");// ? ?
2.2传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象
String s2 = new String("abc");
System.out.println(s2);//abc
2.3根据字符数组,创建字符串对象
需求:修改字符串中的内容,修改字符数组对应的索引即可
public String(char[] chs); //根据字符数组,创建字符串对象
char[] chs ={'a','b','c','d'};
String s3 = new String(chs);
System.out.println(s3); //abcd
2.4传递一个字节数组,根据字节数组的内容再创建一个新的字符串对象
需求:在网络中传输的数据都是字节信息,一般把字节信息进行转换,转成字符串,此时就要用到这个构造
byte[] bytes = {97,9,99,100};
String s4 = new String(bytes);
System.out.println(s4);//abcd
2.StringTable 串池,字符串常量池
package String;
public class test {
public static void main(String[] args){
String s1 = "abc";
String s2 = "abc";
}
}
1.当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在,不存在则创建新的,存在则直接使用。好处是可以节约内存
2.当使用new创建字符串时,每new一次,就是在堆区创建一个新的小空间。坏处是如果字符串重复,会浪费内存。
package String;
public class test {
public static void main(String[] args){
char[] chs = {'a','b','c'};
String s1 = new String(chs);
String s2 = new String(chs);
}
}
3.字符串比较
3.1 == 号
(1) 如果是基本数据类型,比较的是数据值
int a = 10;
int b = 20;
System.out.println(a==b); //false
(2) 如果是 引用数据类型,比较的是地址值
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1==s2); //false
例子:
String s1 = "abc"; //在串池中创建
String s2 = "abc"; //已存在,直接使用
System.out.println(s1==s2); //true,指向同一个地址
String s1 = new String("abc"); //记录堆中的地址值
String s2 = "abc"; //记录串池中的地址值
System.out.println(s1==s2); //false
3.2 使用关键字比较
(1) equals(要比较的字符串): 必须完全一样
(2) equalsIgnoreCase(要比较的字符串) :能忽略大小写
两者的返回值都是boolean类型
String s1 = new String("abc");
String s2 = "Abc";
boolean result1 = s1.equals(s2);
System.out.println(result1);//false
boolean result2 = s1.equalsIgnoreCase(s2);
System.out.println(result2);//true
- 键盘录入的String本质是什么?
//1.假设先用键盘录入一个abc
Scanner sc = new Scanner(System.in);
System.out.println("输入一个字符串");
String str1 = sc.next();
//2.再通过String定义一个abc
String str2 = "abc";
//3.用 == 比较这两者
System.out.println(str1==str2); //false
可见两者是不一样的,键盘录入的是new出来的
4.遍历和统计字符串
逐个遍历字符串中的每个字符
public char charAt(int index); //根据索引返回字符
import java.util.Scanner;
public class test {
public static void main(String []args){
//输入
Scanner sc = new Scanner(System.in);
System.out.println("输入一个字符串:");
String str = sc.next();
//开始遍历
for(int i=0;i<str.length();i++){
//i依次表示字符串的每一个索引
char c = str.charAt(i);
System.out.println(c);
}
}
}
案例:统计字符串中 大小写字母字符 数字字符的出现次数
import java.util.Scanner;
public class test {
public static void main(String []args){
//1.键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("输入一个字符串");
String str = sc.next();
//统计
int bigCount = 0;
int smallCount = 0;
int numberCount = 0;
for (int i = 0; i < str.length(); i++) {
//i表示每一个字符的索引
char c = str.charAt(i);
if(c>='a'&&c<='z'){
smallCount++;
}
else if(c>='A'&&c<='Z') {
bigCount++;
}
else if(c>='0'&&c<='9'){
numberCount++;
}
}
System.out.println("小写字母有:" + smallCount + "个");
System.out.println("大写字母有:" + bigCount + "个");
System.out.println("数字字符有:" + numberCount + "个");
}
}
案例:对输入的字符串进行反转输出
import java.util.Scanner;
public class test {
public static void main(String []args){
Scanner sc = new Scanner(System.in);
System.out.println("输入一个字符串:");
String str = sc.next();
System.out.println( reverser(str));
}

public static String reverser(String str){
String result = "";
for (int i = str.length()-1; i >= 0; i--) {
char c = str.charAt(i);
result = result + c;
}
return result;
}
}