一、String类的基本概述
1、API
Java.lang //不用导包
public final class String
String类代表字符串。Java程序中的所有字符串字面值(如:”abc“)都作为此类的实例实现。
即”abc“就是String类的实例对象。
2、重点理解
字符串是常量;它的值在创建之后不能更改。解释如下:
截图来源:https://www.cnblogs.com/cisum/p/8011485.html
s只是一个String对象的引用,并不是对象本身。
字符串常量池:
字符串池是方法区中的一部分特殊存储。当一个字符串被创建的时候,首先会去这个字符串池中查找,如果找到,
直接返回对该字符串的引用;
(也就是说,如果两个字符串的内容完全一样,那么他们的内存地址一定相等,且其实只有一份)
线程的安全性;
多线程操作之所以不安全,完全是因为多个子线程在同一时间内操作某个公共变量,且该变量在操作之后变量的值
会发生改变;因为String一旦创建之后,就无法再修改其值,所以,String是线程安全的;
3、创建与存储机制(参笔试面试宝典)
4、如果直接打印对象的引用,会默认调用toString方法,如果返回的不是对象@哈希地址,那么toString方法就被重写了。
String 类重写了toString方法,返回的是该对象本身。
二、String类的构造方法(11种)
1、public String():空构造 空的字符串
2、public String(byte[] bytes):把字节数组转成字符串,解码GBK byte[]
3、public String(byte[] bytes,int index, int length):把字节数组的一部分转换成字符串,length是要转换的长度 byte[]
4、public String(char[] value):将字符数组转换成字符串 char[]
5、public String(char[] value,int index, int count):把字符数组的一部分转换成字符串
5、public String(String original):把字符串常量值转换成字符串
三、常见面试题(掌握)
1、常量池中没有这个对象就创建一个,有的话就直接用不用再创建了。指向同一个对象的引用的地址值是相同的
2、new String("abc");创建两个对象,一个在常量池中,一个在堆内存中(字符串的副本),地址值不一样就是两个对象。(前提是常量池中之前没有abc,如果有的话这里就创建一个对象)。
3、“+”,java语言提供对字符串串联符号+以及将其他对象转换为字符串的特殊支持。字符串穿蓝是通过先创建StringBuilder(StringBuffer)对象的append方法实现拼接,然后通过toString方法将字符串返回。
内存图示意:
flase
true
四、String类的判断功能(掌握)
1、boolean equals(Object obj):比较字符串的内容是否相同,区分大小写
2、boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
3、boolean contains(String str):判断大字符串中是否包含小字符串
4、boolean startWith(String str):判断字符串是否以某个指定的字符串开头
5、boolean endWith(String str):判断字符串是否以某个指定的字符串结尾
6、4、boolean isEmpty():判断字符是否为空
null和“ ”的区别:
1、“ ”是字符串常量,同事也是一个String类的对象,也可调用String类的方法
2、null是空常量,不能调用任何办法,否则会出现空指针异常
五、模拟用户登录
需求:模拟登陆,给三次机会,并提示还有几次。
用户名和密码都是admin
分析:
1、模拟登陆,需要键盘录入,Scanner
2、给三次机会,需要循环,for
3、并提示有几次,需要判断,if
import java.util.Scanner;;
public class Test_monidenglu {
public static void main(String[] args) {
int count;
for(int i = 1;i<=3;i++) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String name = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
if (name.equals("admin") && password.equals("admin")) {
System.out.println("成功登陆!");
break;
}else
{
count = 3-i;
System.out.println("您还有"+ count +"次机会");
System.out.println("请继续输入");
if(count ==0) {
System.out.println("您的次数已用完,请联系客服找回用户名和密码");
}
}
}
}
}
六、String类的获取功能(掌握)
1、int length():获取字符串的长度(每个字符的个数不是字节长度),注意数组中的legth是属性,而这里是方法
2、char charAt(int index):获取指定索引位置的字符
3、int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引
4、int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引
5、int indexOf(int ch, int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引
6、lastIndexOf(String str):返回指定字符串在此字符串中最后一次出现的索引
7、String substring(int start):从指定位置开始截取字符串,默认到末尾
8、String substring(int start,int end):从指定位置开始到指定位置结束截取字符串,包含头不包含尾
七、字符串的遍历
需求:遍历字符串
八、统计不同类型的字符个数
需求:统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数,其他字符出现的次数
ABCDEabcd123456!@#$%^
public class Test_tongji {
public static void main(String[] args) {
int x = 0 ,y = 0, z=0, k=0;
String s = "ABCDEabcd123456!@#$%^";
for(int i = 0;i < s.length();i++) {
char a = s.charAt(i); //char charAt(int index):获取指定索引位置的字符
if(a >='A' && a <= 'Z') {
x++;
}else if(a >='a' && a <= 'z')
{
y++;
}else if(a >='1' && a <='9')
{
z++;
}else
{
k++;
}
}
System.out.println("大写字母的个数是:"+ x);
System.out.println("小写字母的个数是:"+ y);
System.out.println("数字的个数是:"+ z);
System.out.println("其他字母的个数是:"+ k);
}
}
九、String类的转换功能
1、byte[] geyBytes():把字符串转换为字符数组 编码:将看的懂的转换为计算机看的
GBK编码:一个中文代表两个字节。中文的第一个字节肯定是负数。
2、char[] toCharArray():把字符串转换为字符数组
3、static String valueOf(char[] chs):把字符数组转换为字符串
4、static String valueOf(int i):把int 类型的数据转换为字符串
注意:String类的valueOf方法可以把任意类型的数据转换成字符串。重载类型。都是静态方法,类名.方法就可以调用了。该方法的底层实现其实就是String的一个构造方法,将new String方法封装起来了。
5、String toLowerCase():把字符串转换成小写
6、String toUpperCase():把字符串转换成大写
7、String concat(String str):把字符串拼接
十、String类的其他功能
1、String的替换功能
String replace(char old,char new)
String replace(String old,String new)
2、String的去除字符串两端空格
String trim();
3、String的按照字典顺序比较两个字符串 按照码表值比较 ASICC unicode
int compareTo(string str)
int compareToIgnoreCase(string str):忽略大小写
十一、字符串的反转
思路:
1、通过键盘录入获取字符串
2、将字符串转换成字符数组
3、倒着白哪里字符数组。并再次拼接成字符串
4、打印
public class Test_fanzhuang {
public static void main(String[] args) {
String s="abc";
char[] ch = s.toCharArray();
String ss = "";
for(int i = ch.length-1; i >= 0; i--) { //倒着遍历
ss = ss + ch[i]; //字符拼接
}
System.out.println(ss);
}
}
十二、在大字符串中找小字符串出现的次数
思路:
1、定义计数器变量
2、判断小字符串中是否有小字符串 indexOf()
有,用substring()将大字符串进行截取(在第一次小字符串的后边进行截取),重新赋值给大字符串,计数器加1,继续循环。
没有,返回-1
3、打印计数器
import java.util.Scanner;
public class Test_daxiaochuan {
public static void main(String[] args) {
Scanner sc1 = new Scanner(System.in);
System.out.println("请输入大字符串:");
String s1 = sc1.nextLine();
Scanner sc2 = new Scanner(System.in);
System.out.println("请输入小字符串:");
String s2 = sc2.nextLine();
int count = 0;
while(s1.indexOf(s2) != -1) { //大字符串中出现小字符串
int index = s1.indexOf(s2);
s1 = s1.substring(index+s2.length()); //将大字符串进行截取
count++;
}
System.out.println(count);
}
}