Java笔记_06(字符串)
一、字符串
1.1、API和API帮助文档
API:应用程序编程接口
简单理解:API就是别人已经写好的东西,我们不需要自己编写,直接使用即可
Java API
:指的就是JDK中提供的各种功能的Java类
这些类将底层的实现封装起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可
API帮助文档:帮助开发人员更好的使用API和查询API的一个工具
- 如何使用API帮助文档
- ①打开API帮助文档
- ②点击显示,并找到索引下面的输入
- ③在输入框中输入类名并点击显示
- ④查看类所在的包
- ⑤查看类的描述
- ⑥查看构造方法
- ⑦查看成员方法
1.2、String概述
java.lang.String
类代表字符串,Java程序中的所有字符串文字(例如“abc”)都为此类的对象
字符串的内容是不会发生改变的,它的对象在创建后不能被更改
String是Java定义好的一个类,定义在java.lang包中,所以使用的时候不需要导包
1.3、String构造方法代码实现和内存分析
- 创建String对象的两种方式
- 直接赋值:
String 变量 = "字符串"
- new
- 直接赋值:
- 当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在
- 不存在:创建新的
- 存在:复用
- 非双引号直接赋值的字符串,每次赋值都会创建一个新的字符串
1.4、字符串的比较
- ==号比的到底是什么
- 基本数据类型:比较的是数据值
- 引用数据类型:比较的是地址值
- 字符串的比较
- boolean equals方法(要比较的字符串):完全一样结果才是true,否则为false
- boolean equalsIgnoerCase(要比较的字符串):忽略大小写的比较
boolean result1 = s1.equals(s2);
System.out.println(result1);
//如果返回是true则说明相同
//如果返回是false则说明是不同的
1.5、用户登录
已知正确的用户名和密码,请用程序实现模拟用户登录,总给三次机会,登录之后,给出相应的提示
import java.util.Scanner;
public class StringTest1 {
public static void main(String[] args) {
String rightUserName = "zhangsan";
String rightPassWord = "123456";
for (int i = 0; i < 3; i++) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名");
String UserName = sc.next();
System.out.println("请输入密码");
String PassWord = sc.next();
if (UserName.equals(rightUserName) && PassWord.equals(rightPassWord)){
System.out.println("用户登录成功");
break;
}else {
if (i == 2){
System.out.println("该用户已锁定");
}else {
System.out.println("用户名或密码错误,请重新输入");
}
}
}
}
}
1.6、遍历字符串和统计字符串个数
- 需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串
- public char charAT(int index):根据索引返回字符
- public int length():返回此字符串的长度
- 数组的长度:数组名.length
- 字符串的长度:字符串对象.length()
import java.util.Scanner;
public class StringTest2 {
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++) {
char c = str.charAt(i);
System.out.println(c);
}
}
}
统计字符次数
- 键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)
import java.util.Scanner;
public class StringTest2 {
public static void main(String[] args) {
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++) {
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("大写字母有" + bigCount + "个");
System.out.println("小写字母有" + smallCount + "个");
System.out.println("数字字母有" + numberCount + "个");
}
}
1.7、字符串的拼接和反转
拼接字符串
- 定义一个方法,把int数组中的数据按照指定格式拼接成一个字符串返回,调用该方法,并在控制台输出结果
- 例如:
- 数组为
int[] arr = {1,2,3};
- 执行方法后的输出结果为:
[1,2,3]
- 数组为
package itheimaTest;
public class StringTest3 {
public static void main(String[] args) {
int[] arr = {1,2,3};
String str = ArrToString(arr);
System.out.println(str);
}
public static String ArrToString (int[] arr){
if(arr == null){
return "";
}
if(arr.length == 0){
return "[]";
}
String result = "[";
for (int i = 0; i < arr.length; i++) {
if(i == arr.length - 1){
result = result + arr[i];
}else {
result = result + arr[i] + ", ";
}
}
result = result + "]";
return result;
}
}
字符串的反转
- 定义一个方法,实现字符串的反转。
- 键盘录入一个字符串,调用该方法后,在控制台输出结果
- 例如,键盘录入abc,输出结果cba
package itheimaTest;
public class StringTest3 {
public static void main(String[] args) {
String str = reverser("123");
System.out.println(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;
}
}
1.8、金额转换
package itheimaTest;
import java.util.Scanner;
public class StringTest4 {
public static void main(String[] args) {
//键盘录入一个金额
Scanner sc = new Scanner(System.in);
int money;
while (true) {
System.out.println("请输入一个金额");
money = sc.nextInt();
if (money >= 0 && money <= 9999999){
break;
}else{
System.out.println("输入金额无效");
}
}
//定义一个字符串用来拼接
String moneyStr = "";
//获取金额中的每一位数字,并且将其转换为大写
while (true){
//从右往左获取每一位数字
int ge = money % 10;
//调用方法将获取到的每一位数字转换成大写,并且拼接在一起
String number = getCapitalNumber(ge);
moneyStr = number + moneyStr;
money = money / 10;
//当金额为0时,所有数字获取完毕,跳出循环
if (money == 0){
break;
}
}
//将没满七位的地方用零代替
int count = 7 - moneyStr.length();
for (int i = 0; i < count; i++) {
moneyStr = "零" + moneyStr;
}
System.out.println(moneyStr);
//将单位加入数字当中
//定义一个数组来记录单位
//定义一个字符串来拼接
String result = "";
String[] arr = {"佰","拾","万","仟","佰","拾","元"};
for (int i = 0; i < moneyStr.length(); i++) {
char c = moneyStr.charAt(i);
result = result + c + arr[i];
}
//打印结果
System.out.println(result);
}
//定义一个方法使数字变成大写 --- 1变成壹
public static String getCapitalNumber (int number){
String[] arr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
String result = arr[number];
return result;
}
}
1.9、手机号屏蔽
String substring(int beginIndex,int endIndex)
截取- 包头不包尾,包左不包右
- 只有返回值才是截取值
String substring(int beginIndex)
截取到末尾
package itheimaTest;
public class StringTest5 {
public static void main(String[] args) {
//定义一个字符串来记录手机号码
String phoneNumber = "13112344685";
//截取手机号码前三位
String start = phoneNumber.substring(0,3);
//截取手机号码后三位
String end = phoneNumber.substring(7,11);
//拼接
String result = start + "****" + end;
//打印结果
System.out.println(result);
}
}
身份证号码信息查看
package itheimaTest;
public class StringTest5 {
public static void main(String[] args) {
//定义一个字符串用来记录身份证号码
String id = "321281202001011234";
//将身份证号码中的年月日截取出来
String year = id.substring(6,10);
String month = id.substring(10,12);
String day = id.substring(12,14);
//打印该人物的出生日期
System.out.println("该人物信息为:");
System.out.println("出生年月日:" + year + "年" + month + "月" + day + "日");
//获取表达性别的数字
char gender = id.charAt(16);
int num = gender - 48;
if (num % 2 == 0){
System.out.println("性别为:女");
}else {
System.out.println("性别为:男");
}
}
}
敏感词替换
String replace(旧值,新值)
替换- 注意点:只有返回值才是替换之后的结果
package itheimaTest;
public class StringTest5 {
public static void main(String[] args) {
//获取到说的话
String talk = "你玩的真好,以后不要再玩了,TMD,CNM";
//定义一个敏感词库
String[] arr = {"TMD", "CNM", "SB", "MLGB"};
//循环得到数组中的每一个敏感词汇,依次进行替换
for (int i = 0; i < arr.length; i++) {
talk = talk.replace(arr[i],"***");
}
System.out.println(talk);
}
}
1.10、StringBuilder概述
StringBuilder可以看成是一个容器,创建之后里面的内容是可变的
- 作用:提高字符串的操作效率
StringBuilder构造方法
方法名 | 说明 |
---|---|
public StringBuilder() | 创建一个空白可变字符串对象,不含有任何内容 |
public StringBuilder(String str) | 根据字符串的内容,来创建可变字符串的对象 |
StringBuilder常用方法
方法名 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 反转容器中的内容 |
public int length() | 返回长度(字符出现的个数) |
public String toString() | 通过toString()就可以实现把StringBuilder转化为String |
链式编程:
当我们在调用一个方法的时候,不需要用变量接收他的结果,可以继续调用其他方法
对称字符串
- 需求:键盘接收一个字符串,程序判断出该字符串是否是对称字符串,并在控制台打印是或不是
- 对称字符串:123321、111
- 非对称字符串:123123
package itheimaTest;
import java.util.Scanner;
public class StringBuilderTest5 {
public static void main(String[] args) {
//键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String str = sc.next();
//反转
String result = new StringBuilder().append(str).reverse().toString();
//比较
if (str.equals(result)){
System.out.println("该字符串是对称字符串");
}else {
System.out.println("该字符串不是对称字符串");
}
}
}
1.11、StringJoiner
StringJoiner概述
- StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。
- 作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用
StringJoiner的构造方法
方法名 | 说明 |
---|---|
public StringJoiner(间隔符号) | 创建一个StringJoiner对象,指定拼接时的间隔符号 |
public StringJoiner(间隔符号,开始符号,结束符号) | 创建一个StringJoiner对象,指定拼接时的间隔符号、开始符号、结束符号 |
StringJoiner的成员方法
方法名 | 说明 |
---|---|
public StringJoiner add(添加的内容) | 添加数据,并返回对象本身 |
public int length() | 返回长度(字符出现的个数) |
public String toString() | 返回一个字符串(该字符串就是拼接之后的结果) |
1.12、字符串原理
扩展底层原理1:字符串存储的内存原理
- 直接赋值会复用字符串常量池中的
- new出来不会复用,而是开辟一个新的空间
扩展底层原理2:==号比较的到底是什么
- 基本数据类型比较数据值
- 引用数据类型比较地址值
扩展底层原理3:字符串拼接的底层原理
- 如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串。
- 字符串拼接的时候有变量参与:在内存中创建了很多对象浪费空间,时间也非常慢
- 结论:如果很多字符串变量拼接,不要直接+。在底层会创建多个对象,浪费时间,浪费性能。
字符串拼接的时候,如果有变量:
JDK8以前:
- 系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接。
- 拼接后,再调用其toString方法转换为String类型,而toString方法的底层是直接new了一个字符串对象。
JDK8版本:
- 系统会预估要字符串拼接之后的总大小,把要拼接的内容都放在数组中,此时也是产生一个新的字符串。
扩展底层原理4:StringBuilder提高效率原理图
- 所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存
扩展底层原理5:StringBuilder源码分析
- 默认长度为16的字节数组
- 添加的内容长度小于16,直接存
- 添加的内容大于16会扩容(原来的容量*2+2)
- 如果扩容之后还不够,以实际长度为准
1.13、罗马数字的两种方法
键盘录入一个字符串,
要求1∶长度为小于等于9
要求2:只能是数字将内容变成罗马数字
下面是阿拉伯数字跟罗马数字的对比关系
Ⅰ-1、Ⅱ -2、Ⅲ- 3、Ⅳ- 4、Ⅴ - 5、Ⅵ- 6、Ⅶ- 7、Ⅷ- 8、Ⅸ- 9
注意点:
罗马数字里面是没有0的
如果键盘录入的数字包含0,可以变成" "(长度为0的字符串)
package itheimaTest;
import java.util.Scanner;
public class StringTest6 {
public static void main(String[] args) {
//键盘录入一个字符串
Scanner sc = new Scanner(System.in);
String str;
while (true) {
System.out.println("请输入一个字符串");
str = sc.next();
boolean check = checkStr(str);
if(check){
break;
}else {
System.out.println("输入的字符串不符合要求");
}
}
//遍历字符串并将其转化为罗马数字
String result = "";
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
int number = c - 48;
String a = toLuoMa(number);
result = result + a;
}
System.out.println(result);
}
//定义一个方法的将数字转变成罗马数字
//Ⅰ-1、Ⅱ -2、Ⅲ- 3、Ⅳ- 4、Ⅴ - 5、Ⅵ- 6、Ⅶ- 7、Ⅷ- 8、Ⅸ- 9
public static String toLuoMa(int number){
String[] arr = {"","Ⅰ","Ⅱ","Ⅲ","Ⅳ","Ⅴ","Ⅵ","Ⅶ","Ⅷ","Ⅸ"};
String luoMa = arr[number];
return luoMa;
}
//定义一个方法判断录入的字符串是否符合要求
public static boolean checkStr(String str){
//判断长度是否小于9
if (str.length() > 9){
return false;
}
//判断是否只有数字
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c <= '0' || c >= '9'){
return false;
}
}
return true;
}
}
1.14、调整字符串
给定两个字符串,A和B。
A的旋转操作就是将A最左边的字符移动到最右边。
例如,若A= ‘abcde’,在移动一次之后结果就是’bcdea’。
如果在若干次调整操作之后,A能变成B,那么返回True。
如果不能匹配成功,则返回false
package String;
public class moveString {
public static void main(String[] args) {
String str1 = "asdfg";
String str2 = "dfgas";
System.out.println(flag (str1,str2));
}
//判断字符串是否与旋转后的相同
public static boolean flag (String strA,String strB){
for (int i = 0; i < strA.length(); i++) {
strA = roate (strA);
if(strA.equals(strB)){
return true;
}
}
return false;
}
//方法一:通过字符串截取的方法旋转字符串
public static String roate (String str){
char first = str.charAt(0);
String end = str.substring(1);
return end+first;
}
/*
//方法二:通过字符数组的方式旋转字符串
public static String roate (String str){
char[] arr = str.toCharArray();
char first = arr[0];
for (int i = 1; i < str.length(); i++) {
arr[i-1] = arr[i];
}
arr[arr.length-1] = arr[0];
String str2 = new String(arr);
return str2;
}
*/
}