常用API(String、ArrayList)
API(Application Programming Interface):应用程序接口
- java写好的技术(功能代码),可以直接调用
- API文档
String类
String是字符串类型,可以定义字符串变量指向字符串对象。
- String常被称为不可变字符串类型,它的对象在创建后不能被更改
String变量每次的修改其实都是产生并指向了新的字符串对象,原来的字符串对象都是没有改变的,所以称为不可变字符串。
字符串对象的特点有哪些?
- 双引号创建的字符串对象,在字符串常量池中存储同一个
- 通过new构造器创建的字符串对象,在堆内存中分开存储
String.equals
String s1 = “abc”//字符串对象存储在字符串常量池中
Scanner sc = new Scanner(System.in);
String s2 = sc.next()//后面接的非” “里的内容,存储在堆内存中
用==判断不了
String(引用数据类型)采用equals判断字符串内容是否一样,只关心内容一样就返回true
==在基本数据类型比较时使用
String常用API
String生成验证码
public class StringRandom {
public static void main(String[] args) {
String code = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random r = new Random();
String s = "";
for (int i = 0; i < 5; i++) {
char c = code.charAt(r.nextInt(code.length()));
s += c;
}
System.out.println("验证码为:" + s);
}
}
String加密手机号:
public class StringTel {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String tel = sc.next();
String beforeThree = tel.substring(0, 3);//截取前三位手机号
String after = tel.substring(7);//截取之后的手机号
System.out.println("手机号为:" + tel);
System.out.println("加密过的手机号为:" + beforeThree + "****" + after);
}
}
统计字符串所含字符类型数量:
public class StringCount {
public static void main(String[] args) {
System.out.println("请输入一个字符串:");
Scanner sc = new Scanner(System.in);
String str = sc.next();
int bigNumber = 0, smallNumber = 0, Number = 0;
for (int i = 0; i < str.length(); i++) {//遍历该字符串
char c = str.charAt(i);
if (c >= 'a' && c <= 'z') {
smallNumber++;
} else if (c >= 'A' && c <= 'Z') {
bigNumber++;
} else {
Number++;
}
}
System.out.println("大写字母数量为:" + bigNumber);
System.out.println("小写字母数量为:" + smallNumber);
System.out.println("数字数量为:" + Number);
}
}
字符串遍历+反转字符串:
public class StringPracticeArray {
public static void main(String[] args) {
System.out.println("请输入一个数组!");
Scanner sc = new Scanner(System.in);
int[] a = new int[3];
for (int i = 0; i < a.length; i++) {
a[i] = sc.nextInt();
}
traverseArray(a);//遍历数组
//反转字符串
System.out.println("请输入需要反转的字符串!");
String str = sc.next();
backArray(str);
}
private static void backArray(String str) {
String backStr = "";
for (int i = str.length() - 1; i >= 0; i--) {
backStr += str.charAt(i);
}
System.out.println("反转后的字符串为:" + backStr);
}
public static void traverseArray(int[] a) {
String str = "[";
for (int i = 0; i < a.length; i++) {
if (i != a.length - 1) {
str += a[i] + ",";
} else {
str += a[i];
}
}
str += "]";
System.out.println("遍历后的数组是:" + str);
}
}
打印大写数字发票单:
public class StringMoneyTransform {
public static void main(String[] args) {
System.out.println("请输入一串金额:");
Scanner sc = new Scanner(System.in);
int money = sc.nextInt();
String result = "";
while (true) {
int single = money % 10;
money = money / 10;
result = getBigMoney(single) + result;
if (money == 0) {
break;
}
}
int j = result.length();
for (int i = 0; i < (7 - j); i++) {
result = "零" + result;
}
String[] array = {"佰", "拾", "万", "千", "佰", "拾", "元"};
String r = "";
for (int i = 0; i < array.length; i++) {
char c = result.charAt(i);
r = r + c + array[i];
}
System.out.println("转换后的金额为:" + r);
}
private static String getBigMoney(int single) {
String str;
String[] BigMoney = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
str = BigMoney[single];
return str;
}
}
提取身份证信息:
public class StringCard {
public static void main(String[] args) {
System.out.println("请输入身份证号码:");
Scanner sc = new Scanner(System.in);
String card = sc.next();//获取身份证 501234200010131373
System.out.println("您的身份证号码为:" + card);
String birthday = getBirthday(card);
System.out.println("您的出生年月日:" + birthday);
Boolean sex = judgeSex(card);
if (sex) {
System.out.println("您的性别为男!");
} else {
System.out.println("您的性别为女!");
}
}
private static Boolean judgeSex(String card) {
Boolean sex;//定义性别
char c = card.charAt(16);//0对应ASCII表48,不难直接判断C%2==0,C会转换为对应的ASCII值,逻辑错误
int num = c - 48;
sex = num % 2 != 0;
return sex;
}
private static String getBirthday(String card) {
String birthday = "";
birthday = card.substring(6, 10) + "年";
birthday += card.substring(10, 12) + "月";
birthday += card.substring(12, 14) + "日";
return birthday;
}
}
替换敏感词:
public class StringReplace {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请发言:");
String[] arr = new String[3];
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.next();//记录说的话
}
String[] dirty = {"tmd", "妈", "b"};
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < dirty.length; j++) {
arr[i] = arr[i].replace(dirty[j], "*");
}
System.out.println(arr[i]);
}
}
}
StringBuilder
StringBuilder可以看成是一个容器,创建之后里面的内容是可变的。
一般用在字符串的拼接与反转。
StringBuilder打印对象不是地址值而是属性值
- 提高字符串的操作效率
tips:
链式编程:当我们在调用一个方法的时候,不需要用变量接收他的结果,可以继续调用其他方法
String result = new StringBuffer(input).reverse().toString();
判断是否为对称字符串:
public class StringBuilderT1 {
public static void main(String[] args) {
System.out.println("请输入一个字符串:");
Scanner sc = new Scanner(System.in);
String input = sc.next();
String result = new StringBuffer(input).reverse().toString();
if (result.equals(input)) {
System.out.println(input + "是对称字符串");
} else {
System.out.println(input + "不是对称字符串");
}
}
}
遍历字符串:
public class TraverseArr {
public static void main(String[] args) {
System.out.println("请输入一个数组:");
Scanner sc = new Scanner(System.in);
int[] arr = new int[3];
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
String str = traverseAarry(arr);
System.out.println(str);
}
private static String traverseAarry(int[] arr) {
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < arr.length - 1; i++) {
sb.append(arr[i] + ",");
}
sb.append(arr[arr.length - 1] + "]");
return sb.toString();
}
}
StringJoiner
- StringJoiner和StringBuffer一样,可看成一个容器,创建之后里面的内容是可变的
- 作用:提高字符串的操作效率,而且代码编写特别简洁
- JDK8才出现
public class StringJo {
public static void main(String[] args) {
StringJoiner sj = new StringJoiner(",", "[", "]");//(间隔符号,开始符号,结束符号)
sj.add("aaa").add("bbb").add("ccc");
System.out.println(sj.length());
String str = sj.toString();
System.out.println(str);
System.out.println(sj);
}
}
字符串原理
-
字符串存储的内存原理
- 直接赋值会复用字符串常量池中的
- new出来不会复用,而是开辟一个新的空间
-
==号比较的到底是什么?
- 基本数据类型比较数据值
- 引用数据类型比较地址值
-
字符串拼接的底层原理
- 如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串。
- 如果有变量参与,每一行拼接的代码,都会在内存中创建新的字符串,浪费内存。
-
StringBuilder提高效率原理图
- 所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存
-
StringBuilder源码分析
- 默认创建一个长度为16的字节数组
- 添加的内容长度小于16,直接存
- 添加的内容大于16会扩容(原来的容量*2+2)
- 如果扩容之后还不够,以实际长度为准
leetcode算法之罗马数字练习:
public class LuoMaNumber {
public static void main(String[] args) {
System.out.println("请输入一串阿拉伯数字:");
String str;
Scanner sc = new Scanner(System.in);
while (true) {
str = sc.next();//获得输入的阿拉伯数字
boolean flag;//true为符合要求的数字
flag = checkNumber(str);
if (flag) {
System.out.println(str + "输入正确!");
break;
} else {
System.out.println("输入不符,请重新输入!");
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char number = str.charAt(i);
// int number = c - 49;
sb.append(changeNumber(number));
}
System.out.println("转换后的字符串为:" + sb);
}
public static String changeNumber(char number) {
String str;
switch (number) {
case '1':
str = "Ⅰ";
break;
case '2':
str = "Ⅱ";
break;
case '3':
str = "Ⅲ";
break;
case '4':
str = "Ⅳ";
break;
case '5':
str = "Ⅴ";
break;
case '6':
str = "Ⅵ";
break;
case '7':
str = "Ⅶ";
break;
case '8':
str = "Ⅷ";
break;
case '9':
str = "Ⅸ";
break;
default:
str = "";
break;
}
;
return str;
}
public static char changeNumber(int number) {
char[] luoMa = {'Ⅰ', 'Ⅱ', 'Ⅲ', 'Ⅳ', 'Ⅳ', 'Ⅵ', 'Ⅶ', 'Ⅷ', 'Ⅸ'};
return luoMa[number];
}
public static boolean checkNumber(String str) {
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;
}
}
如果需要修改字符串的内容,一般两种方法:
- 用subString进行截取,把左边的字符截取出来拼接到右侧去
- 可以把字符串先变成一个字符数组,然后调整字符数组里面数据,最后再把字符数组变成字符串。
public class AdjustString {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串A:");
String a = sc.next();
System.out.println("请输入字符串B:");
String b = sc.next();
boolean flag = check(a, b);
if (flag) {
System.out.println("B可由A翻转得到");
} else {
System.out.println("B不可由A翻转得到");
}
}
// public static String rotate(String str) {
// 法一:
// //翻转字符串
// char first = str.charAt(0);//获取字符串第一位字符
// String s = str.substring(1);//获取字符串第一位之后的字符串
// return s + first;
// }
public static String rotate(String str) {
char first = str.charAt(0);
char[] c = str.toCharArray();
for (int i = 1; i < c.length; i++) {
c[i - 1] = c[i];
}
c[c.length - 1] = first;
String st = new String(c);
return st;
}
public static boolean check(String a, String b) {
//检验若干次
for (int i = 0; i < a.length(); i++) {
a = rotate(a);
if (a.equals(b)) {
return true;
}
}
return false;
}
}
8793

被折叠的 条评论
为什么被折叠?



