API(Application Programming Interface)应用程序编程接口
API就是别人写好的东西,不需要我们自己再去编写,直接使用即可
JavaAPI:就是指在JDK中提供的各种功能的JAVA类,这些类将底层的实现封装起来,我们不需要关心这些类是如何实现的,只需要学习如何使用即可。
Scanner----键盘录入
Random----随机数
字符串
字符串的内容是不会发生改变的,JAVA程序中所有字符串被创建后都被视为String对象,它的对象在创建后不能被更改。如果是通过字符串的拼接,产生的是一个新的字符串。
字符串构造
package com.sstxwd6;
public class stringDemo {
public static void main(String[] args) {
//字符串的构造
//1.使用直接构造
String s1 = "abcd";
System.out.println(s1);
//2.使用new的方式来获取一个字符串对象,调用字符串的构造函数
//空参构造
String s2 = new String();//这是一个为任何内容的字符串对象。 ""
System.out.println(s2);
//传递一个字符数组,根据字符数组的内容再创建一个新的字符串
char []chs = {'a','b','c'};
String s3 = new String(chs);
System.out.println(s3);
//传递一个字节数组,根据字节数组的内容再去创建新的字符串对象
byte[] bytes = {97,98,99,100};//拿这个数字先去ASCII表去查对应的字母,再将其转换
//应用场景:在网络中传输的数据其实是字节信息,我们一般要将字节信息进行转换,转换成字符串,此时就用到这个构造
String s4 = new String(bytes);
System.out.println(s4);// abcd
}
}
不同的字符串构造方法在内存的区别
内存模型
栈内存:方法运行的时候进栈,执行完毕后出栈
堆内存:new出来的对象都在这里,只要是new出来的就是在堆内存中开辟了一个新的空间,传递的是地址
方法区:程序编译出来的字节码文件存放处
String Table(串池) 存储字符串,直接赋值的方式构造的字符串会存储在串池中,使用new关键字构造的就直接在堆内存中了。串池目前在堆内存中
当你使用双引号直接进行字符串赋值时,系统会检查该字符串在串池中是否存在。当不存在时创建新的,存在时传递地址直接复用即可。
当使用new进行构造字符串时,每new一次就会开辟一个新的空间,不会复用!!
只要是创建的是一个类的对象,该对象中存储的是该对象在堆内存中的地址值。
所以使用的构造方法不同,字符串的比较也可能不相等。
字符串的比较
以后如果想比较字符串,一定要使用String类里面的方法equals或者equalsIgnoreCase,不要直接比较,容易出错。
String s1 = "abc";
char []chs = {'a','b','c'};
String s3 = new String(chs);
System.out.println(s1==s3);//false
//比较字符串中的内容是否相同
boolean result1 = s1.equals(s3);//equals在比较时需要完全一样
System.out.println(result1);//true
//比较字符串中的内容是否相同 忽略大小写仅在英文状态下
String s5 = "AbC";
boolean result2 = s1.equalsIgnoreCase(s5);
System.out.println(result2);//true
package com.sstxwd6;
import java.util.Scanner;
public class stringDemo2 {
public static void main(String[] args) {
//已知正确的用户名和密码,请用程序实现模拟用户登录。
// 总共给出三次机会,登录之后给出相应的提示
String correctUsername = "sstxwd6";
String correctPassword = "1234567";
Scanner sc = new Scanner(System.in);
for (int i = 1; i <= 3; i++) {
System.out.println("请输入您的用户名:");
String s1 = sc.next();
System.out.println("请输入您的密码:");
String s2 = sc.next();
//登录界面上是用户名和密码同时判断
boolean r1 = correctUsername.equals(s1);
boolean r2 = correctPassword.equals(s2);
if (r1 && r2) {
System.out.println("祝您登陆愉快!");
break;
}
if (!r1) {
if (i == 1) {
System.out.println("用户名错误,请重新输入,您还有两次尝试机会");
continue;
} else if (i == 2) {
System.out.println("用户名错误,请重新输入,您还有一次尝试机会");
continue;
} else {
System.out.println("连续三次错误,请您1分钟后再试");
continue;
}
} else {
if (i == 1) {
System.out.println("密码错误,请重新输入,您还有两次尝试机会");
continue;
} else if (i == 2) {
System.out.println("密码错误,请重新输入,您还有一次尝试机会");
continue;
} else {
System.out.println("连续三次错误,请您1分钟后再试");
continue;
}
}
}
}
}
遍历字符串
String类中的方法:
public char charAt(int index): 根据索引返回字符
public int length(): 返回字符串的长度
public String substring(beginIndex,endIndex) 截取字符串中索引从beginIndex到endIndex 包左不包右
public String substring(beginIndex) 默认从beginIndex到最后一个索引
public String replace(旧值,新值) 替换 这里的旧值就是字符串中已经存在的字符串
注意:方法的返回值是替换后的结果
请注意: 在数组中,length是一个属性,索引想获取数组的长度直接使用 数组名.length即可
但在字符串中,length是一个函数,要使用 字符串对象.length()
package com.sstxwd6;
import java.util.Scanner;
public class stringDemo3 {
//键盘录入一个字符串,并实现字符串的遍历
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.print(c);
}
}
}
字符串中的统计
package com.sstxwd6;
import java.util.Scanner;
public class stringDemo4 {
//键盘录入一个字符串,统计字符串中大写字符,小写字符,数字字符出现的次数
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);
//char类型的变量在参与计算的时候自动类型提升为int 查询ASCII码
if (c>='a'&&c<='z'){
smallcount++;
} else if (c>='A'&&c<='Z') {
bigcount++;
}else if (c>='0'&&c<='9'){
numbercount++;
}
}
System.out.println("该字符串中,大写字母有"+bigcount+"个,小写字母有"+smallcount+"个,数字有"+numbercount+"个。");
}
}
字符串与数组的转换
package com.sstxwd6;
import java.util.Scanner;
public class stringDemo5 {
//定义一个方法,把int数组中的数据按照指定格式拼接成一个字符串返回
//调用该方法,并在控制台中输出结果
public static void main(String[] args) {
//键盘输入一个数组
Scanner sc = new Scanner(System.in);
System.out.println("请输入您想要的数组长度");
int length = sc.nextInt();
int []arr = new int[length];
System.out.println("请依次输入您想在数组中存储的整数数据:");
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
System.out.println("接下来进行数组到字符串的转换");
String str = arrToStr(arr);
for (int i = 0; i < str.length(); i++) {
System.out.print(str.charAt(i));
}
}
//该方法首先实现将数组转换成字符串,其中可以使用空字符串的拼接
public static String arrToStr(int []arr){
//排除数组是null 和长度为0的情况
if (arr ==null){
return null;
}
if (arr.length ==0){
return "[]";
}
String str = "[";
for (int i = 0; i < arr.length; i++) {
if (i<arr.length-1){
str=str + arr[i] +",";
}else {
str+=arr[i];
}
}
str +="]";
return str;
}
}
字符串反转
package com.sstxwd6;
public class stringDemo6 {
//实现字符串的反转
//请注意,字符串是不能发生改变的,经过反转后的字符串是新的字符串
public static void main(String[] args) {
String str = "abcd638-=";
String reversalStr = reverse(str);
for (int i = 0; i < reversalStr.length(); i++) {
System.out.print(reversalStr.charAt(i));
}
}
public static String reverse(String str){
String reversalStr = "";
for (int i = str.length()-1; i >=0 ; i--) {
reversalStr += str.charAt(i);
}
return reversalStr;
}
}
金额转换
错误写法:
//请注意,该代码结果是错误的,此处记录是为了引以为戒
public class stringDemo7 {
//金额转换
//将2135 转换成 零佰零拾零万贰仟壹佰叁拾伍元 共七位
//将输入的金额每一位分开并填补到7位 0002135 (这里报错!!原因:此时定义的7位的数组为int类型,
// 将字符串中的字符赋值给数组时,会自动发生类型转换,导致报错)
//每一位要转成文字大写
//最后输出字符串的拼接形式
public static void main(String[] args) {
String str = "2135";
//将字符串转为7位的数组
int []arr = new int[7];
int num = 7-str.length();//要补的位数
for (int i = 0; i < arr.length; i++) {
if (i<num){
arr[i] = 0;
}else { //这步报错,原因是字符型的数字,赋值到int类型,会自动进行类型转换
arr[i] = str.charAt(i-num);
}
System.out.print(arr[i]);
}
}
}
上述代码的解决方案为:
正确写法:arr[i] = str.charAt(i-num); 替换为: arr[i] = str.charAt(i-num)-48; 利用ASCII码表
package com.sstxwd6;
import java.util.Scanner;
public class stringDemo8 {
//金额转换
//将2135 转换成 零佰零拾零万贰仟壹佰叁拾伍元 共七位
//先将2135转换为大写文字------采用查表法,定义一个数组来存储与索引相对的大写文字,转换时,查表即可
//最后输出字符串的拼接形式
public static void main(String[] args) {
//键盘录入一个金额
Scanner sc = new Scanner(System.in);
System.out.println("请录入您的金额:");
int money;
while (true) {
money = sc.nextInt();
//要判断一下金额是否有效,小于0 或者大于7位的金额均无效
if(money>0&&money<=9999999){
break;
}else {
System.out.println("该金额无效,请重新输入您的金额:");
}
}
//将金额的每一位都转换为文字大写
String []arr = new String[7];
//先将初始化的数组所有元素都转换成大写文字
for (int i = 0; i < arr.length; i++) {
arr[i] = getCapitalNumber(0);
}
//再进行将金额中每一位数字提取出来后,转换为大写文字,再进行替换
for (int i = arr.length-1; i>=0&&money>=0; i--) {
int ge = money%10;
arr[i] = getCapitalNumber(ge);
money = money/10;
}
System.out.println("您的金额转换为"+arr[0]+"佰"+arr[1]+"拾"+arr[2]+"万"
+arr[3]+"仟"+arr[4]+"佰"+arr[5]+"拾"+arr[6]+"元");
}
//实现一位数字与其文字大写的转换
public static String getCapitalNumber(int a){
String []arr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
return arr[a];
}
}
手机号屏蔽--包含了字符串的截取
package com.sstxwd6;
import java.util.Scanner;
public class stringDemo9 {
//键盘录入一个字符串表示手机号,进行手机号的截取
//手机号11位,前三位不变,后四位不变,中间四位用****来替代
public static void main(String[] args) {
//录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一串手机号");
String str = sc.next();
//实现字符串的截取,请注意substring方法中前一个表示开始字符,后一个表示结束字符,且包头不包尾
String topThree = str.substring(0,3);
String endFour = str.substring(7);
String newString = topThree +"****"+endFour;
for (int i = 0; i < newString.length(); i++) {
System.out.print(newString.charAt(i));
}
}
}
敏感词替换---包含字符串的替换
package com.sstxwd6;
public class stringDemo10 {
//敏感词替换
public static void main(String[] args) {
String talk = "菜狗,滚啊,TMD,CNM";
//定义一个敏感词库
String[]arr = {"TMD","CNM","SB","滚","菜"};
//
for (int i = 0; i < arr.length; i++) {
talk = talk.replace(arr[i],"***");
}
System.out.println(talk);
}
}