一、API:应用程序编程接口
Java APl:指的就是JDK中提供的各种功能的Java类
这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可。
API帮助文档
API文档练习:
需求:按照帮助文档的使用步骤学习Scanner类的使用,并实现接收键盘录入一个小数,最后输出在控制台
package cn.nwafu.APIHelpDocument;
import java.util.Scanner;
public class test1 {
public static void main(String[] args) {
// API文档练习:
// 需求:按照帮助文档的使用步骤学习Scanner类的使用,并实现接收键盘录入一个小数,最后输出在控制台
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字");
double num = sc.nextDouble();
System.out.println(num);
}
}
二、字符串 String:
- Strin是Java定义好的一个类。定义在java.lang包中,所以使用的时候不需要导包。
- Java程序中的所有字符串文字,都被实为此类的对象。
- 字符串不可变,它们的值在创建后不能被更改
当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在。
不存在:创建新的
存在:复用
当用new时,每new一次,都会在堆上开辟一次内存空间,地址值各不相同,与是否存在无关
三、String类 Java常用方法
1、比较
==号到底比什么?
基本数据类型比较的是数据值
引用数据类型比较的是地址值
boolean equals方法(要比较的字符串) 完全一样结果才是true,否则为false
boolean equalslgnoreCase(要比较的字符串) 忽略大小写的比较
注意:键盘录入字符串是new出来的;
案例1、用户登录:
需求:已知正确的用户名和密码,请用程序实现模拟用户登录。
总共给三次机会,登录之后,给出相应的提示
package cn.nwafu.StringTest;
import java.util.Scanner;
public class test4 {
public static void main(String[] args) {
//1、定义两个变量表示正确的用户名和密码
String rightUserName = "lihua";
String rightPassWord = "123456";
// //2、键盘录入用户名和密码
// Scanner sc = new Scanner(System.in);
// System.out.println("请输入用户名");
// String username = sc.next();
// System.out.println("请输入用户密码");
// String password = sc.next();
//2、键盘录入用户名和密码
Scanner sc = new Scanner(System.in);
//3、比较
//统计思想
int count = 0;
while(true) {
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 {
System.out.println("登录失败,用户名或密码错误");
count++;
if (count < 3) {
System.out.println("剩余" + (3 - count) + "次机会!");
} else {
System.out.println("连续三次输入错误,请稍后重试!");
break;
}
}
}
}
}
2、遍历
案例2、遍历字符串
需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串
package cn.nwafu.StringTest;
import java.util.Scanner;
public class test5 {
public static void main(String[] args) {
//1.键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String str = sc.next();
//2.进行遍历
for (int i = 0; i < str.length(); i++) {
//i 以此表示字符串的每一个索引
char c = str.charAt(i);
System.out.print(c+" ");
}
}
}
统计字符次数
键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数
(不考虑其他字符)
package cn.nwafu.StringTest;
import java.util.Scanner;
public class test5 {
public static void main(String[] args) {
//1、键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String str = sc.next();
//2、统计思想
//定义三个计数器
int bigCount = 0;
int smallCount = 0;
int numberCount = 0;
for (int i = 0; i < str.length(); i++) {
char c =str.charAt(i);
//System.out.println(c);
if(c >= 'a'&& c <= 'z' ){
//char类型变量在参与计算的时候自动类型提升为int,查询ASCII表
smallCount++;
}else if (c >= 'A' && c <= 'Z'){
bigCount++;
}else if (c >= '0' && c <= '9'){
numberCount++;
}
}
//3、输出打印
System.out.println("大写字母有:"+bigCount+"个");
System.out.println("小写字母有:"+smallCount+"个");
System.out.println("数字字母有:"+numberCount+"个");
}
}
3、拼接
拼接字符串
定义一个方法,把 int数组中的数据按照指定的格式拼接成一个字符串返回,
调用该方法,并在控制台输出结果。例如:
数组为int[]arr = {1,2,3};
执行方法后的输出结果为:[1,2,3]
package cn.nwafu.StringTest;
public class test6 {
public static void main(String[] args) {
int[] arr = {1,2,3};
String result = arrToString(arr);
System.out.println(result);
}
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;
}
}
4、反转
字符串反转
一个方法,实现字符串反转。
键盘录入一个字符串,调用该方法后,在控制台输出结果例如,键盘录入abc,输出结果cba
package cn.nwafu.StringTest;
public class test6 {
public static void main(String[] args) {
int[] arr = {1,2,3};
String result = arrToString(arr);
System.out.println(result);
}
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;
}
}
案例、金额转换
package cn.nwafu.StringTest;
import java.util.Scanner;
public class test8 {
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 capitalNumber = getCapitalNumber(ge);
moneyStr = capitalNumber + moneyStr;
money = money / 10;
if(money == 0){
break;
}
}
//System.out.println(money);
//补0凑齐7位
int count = 7-moneyStr.length();
for (int i = 0; i < count; i++) {
moneyStr = "零" + moneyStr;
}
//System.out.println(moneyStr);
//插入单位
//定义一个字符串数组放入单位
String[] arr = {"佰","拾","万","千","佰","拾","元"} ;
String result = "";
for (int i = 0; i < moneyStr.length(); i++) {
char c = moneyStr.charAt(i);
result = result + c + arr[i];
}
//打印结果
System.out.println(result);
}
//定义一个方法,大写数字与小写数字一一对应,方便后续转换
public static String getCapitalNumber(int number){
String[] arr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
return arr[number];
}
}
5、截取与替换
案例、手机号屏蔽
package cn.nwafu.StringTest;
public class test9 {
public static void main(String[] args) {
//1、获取一个手机密码
String phoneNumber = "13146245768";
//2、截取前3位
String start = phoneNumber.substring(0,3);
//3、截取后四位
String end = phoneNumber.substring(7);
//4、拼接
String result = start + "****" + end;
//5、打印
System.out.println(result);
}
}
身份证信息查看
package cn.nwafu.StringTest;
public class test10 {
public static void main(String[] args) {
//1、定义字符串存放身份证号
String arr = "220302201604090248";
//2、截取年月日和性别
String year = arr.substring(6,10);
String month = arr.substring(10,12);
String day = arr.substring(12,14);
char gender = arr.charAt(16);
//打印对应信息
System.out.println("人物信息为:");
System.out.println("出生年月日:"+year+"年"+month+"月"+day+"日");
//3、把字符变成数字‘3’-->3
//并且进行男女判断
//ASCII表
//'0'-->48
//'1'-->49
//'2'-->50
//'3'-->51
//'4'-->52
//'5'-->53
//'6'-->54
//'7'-->55
//'8'-->56
//'9'-->57 差值就是真正的数字
int num = gender - 48;
if(num % 2 == 0){
System.out.println("性别为:女");
}else{
System.out.println("性别为:男");
}
}
}
敏感词替换
package cn.nwafu.StringTest;
public class test11 {
public static void main(String[] args) {
//1.获取到说的话
String talk = "你玩的真好,以后不要再玩了,TMD,SB!";
//2.定义一个敏感词库
String[] arr = {"TMD","CNM","SB","XSWL"};
//3.遍历每一个敏感词进行替换
for (int i = 0; i < arr.length; i++) {
talk = talk.replace(arr[i],"***");
}
System.out.println(talk);
}
}
四、StringBuilder类 用法
stringBuilder可以看成是一个容器,创建之后里面的内容是可变的
作用:提高字符串的操作效率
对称字符串
需求:键盘接受一个字符串,程序判断出该字符串是否是对称字符串,并在控制台打印是或不是
对称字符串:123321、111
非对称字符串:123123
package cn.nwafu.StringBulider;
import java.util.Scanner;
public class test4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("键盘录入一个字符串");
String input = sc.next();
String result = new StringBuilder().append(input).reverse().toString();
if(input.equals(result)){
System.out.println("当前字符串是对称字符串");
}else{
System.out.println("当前字符串不是对称字符串");
}
}
}
拼接字符串(用StringBuilder方法)
定义一个方法,把 int数组中的数据按照指定的格式拼接成一个字符串返回,
调用该方法,并在控制台输出结果。例如:
数组为int[]arr = {1,2,3};
执行方法后的输出结果为:[1,2,3]
package cn.nwafu.StringBulider;
public class test5 {
public static void main(String[] args) {
int[] arr = {1,2,3};
String result = arrToString(arr);
System.out.println(result);
}
public static String arrToString(int[] arr){
StringBuilder sb = new StringBuilder("[");
//sb.append("[");
for (int i = 0; i < arr.length; i++) {
if(i == arr.length-1){
sb.append(arr[i]);
}else{
sb.append(arr[i]+",");
}
}
return sb.append("]").toString();
}
}
五、StringJoiner类 用法JDK8
StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。
作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用。
六、字符串原理
字符串拼接无变量
字符串拼接有变量JDK8以前的原理
s4先预估总长度再建立数组放入内容再将整体变成字符串
字符串原理小结
常见面试题
七、综合练习
练习1.转换罗马数字
键盘录入一个字符串,
要求1:长度为小于等于9
要求2:只能是数字
将内容变成罗马数字
下面是阿拉伯数字跟罗马数字的对比关系:
1-Ⅰ、2-Ⅱ、3-Ⅲ、4-Ⅳ、5-Ⅴ、6-Ⅵ、7-Ⅶ、8-Ⅷ、9-Ⅸ
注意点:罗马数字里面是没有0的
如果键盘录入的数字包含0,可以变成””(长度为0的字符串)
package cn.nwafu.Test;
import java.util.Scanner;
public class test1 {
public static void main(String[] args) {
// 练习1.转换罗马数字
// 键盘录入一个字符串,
// 要求1:长度为小于等于9
// 要求2:只能是数字
// 将内容变成罗马数字
// 下面是阿拉伯数字跟罗马数字的对比关系:
// 1-Ⅰ、2-Ⅱ、3-Ⅲ、4-Ⅳ、5-Ⅴ、6-Ⅵ、7-Ⅶ、8-Ⅷ、9-Ⅸ
// 注意点:罗马数字里面是没有0的
// 如果键盘录入的数字包含0,可以变成””(长度为0的字符串)
//1.键盘录入一个字符串
Scanner sc = new Scanner(System.in);
String str;
while (true) {
System.out.println("请输入一个字符串");
str = sc.next();
//2.校验字符串
boolean flag = checkStr(str);
//System.out.println(flag);
if(flag){
break;
}else{
System.out.println("当前字符串不符合规则,请重新输入");
continue;
}
}
//将内容变成罗马数字
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
int number = c - 48;
String s = changeLuoMa(number);
//System.out.println(s);
sb.append(s);
}
System.out.println(sb);
}
//罗马数字表的方法
public static String changeLuoMa(int number){
String[] arr = {"","Ⅰ","Ⅱ","Ⅲ","Ⅳ","Ⅴ","Ⅵ","Ⅶ","Ⅷ","Ⅸ"};
return arr[number];
}
//校验字符串的方法
public static boolean checkStr(String str){
if (str.length()>9){
return false;
}
for (int i = 0; i < str.length(); i++) {
if(str.charAt(i) < '0' || str.charAt(i) > '9'){
return false;
}
}
//只有全部判断完毕才能返回true
return true;
}
}
练习2.调整字符串
给定两个字符串,A和B。
A的旋转操作就是将A最左边的字符移动到最右边。例如,若A= 'abcde',在移动一次之后结果就是'bcdea'。
如果在若干次调整操作之后,A能变成B,那么返回True。如果不能匹配成功,则返回false
package cn.nwafu.Test;
public class test2 {
public static void main(String[] args) {
// 练习2.调整字符串
// 给定两个字符串,A和B。
// A的旋转操作就是将A最左边的字符移动到最右边。
// 例如,若A= 'abcde',在移动一次之后结果就是'bcdea'。
// 如果在若干次调整操作之后,A能变成B,那么返回True。
// 如果不能匹配成功,则返回false
//1.定义两个字符串
String str1 = "eabcd";
String str2 = "cdeab";
//2.旋转字符串
//str1 = rotate(str1);
//3.比较
boolean flag = check(str1,str2);
System.out.println(flag);
}
//比较
public static boolean check(String str1,String str2){
for (int i = 0; i < str1.length();i++) {
str1 = rotate(str1);
if(str1.equals(str2)){
return true;
}
}
return false;
}
//旋转字符串
public static String rotate(String str){
//套路:
//如果我们看到要修改字符串的内容
//可以有两个办法:
//1.用substring进行截取,把左边的字符截取出来拼接到右侧去
//2.可以把字符串先变成一个字符数组,然后调整字符数组里面数据,最后再把字符数组变成字符串。
//截取思路
char first = str.charAt(0);
String end = str.substring(1);
return end + first;
}
}
练习3.
键盘输入任意字符串,打乱里面的内容
package cn.nwafu.Test;
import java.util.Random;
import java.util.Scanner;
public class test3 {
public static void main(String[] args) {
//键盘输入任意字符串,打乱里面的内容
//1.键盘输入字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String str = sc.next();
//2.打乱内容
//用第二种思路,变成字符数组
char[] arr = str.toCharArray();
//3.打乱数组里面的内容
//从0索引开始,跟一个随机索引进行位置的交换
//当数组里面的每一个元素都跟一个随机索引进行交换完毕之后,那么内容就打乱了
for (int i = 0; i < arr.length; i++) {
Random r = new Random();
int index = r.nextInt(arr.length);
char temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
//4.把字符数组再变回字符串
String result = new String(arr);
System.out.println(result);
}
}
练习4.生成验证码
内容:可以是小写字母,也可以是大写字母,还可以是数字
规则:
长度为5
内容中是四位字母,1位数字。
其中数字只有1位,但是可以出现在任意的位置。
package cn.nwafu.Test;
import java.util.Random;
public class test4 {
public static void main(String[] args) {
// 练习4.生成验证码
// 内容:可以是小写字母,也可以是大写字母,还可以是数字
// 规则:
// 长度为5
// 内容中是四位字母,1位数字。
// 其中数字只有1位,但是可以出现在任意的位置。
//1.可以把所有的大写字母,小写字母都放到一个数组当中
char[] arr = new char[52];
for (int i = 0; i < arr.length; i++) {
if (i<26){
arr[i] = (char) (97+i);
}else{
arr[i] = (char)(65+i-26);
}
}
//2.从数组中随机获取4次
//3.生成一个0~9之间的随机数拼接到最后
// ACFG7I
Random r =new Random();
String str = "";
for (int i = 0; i < 4; i++) {
int index = r.nextInt(arr.length);
str = str + arr[index];
}
//System.out.println(str);
int num = r.nextInt(10);
str = str + num;
System.out.println(str);
//思考,我们把7放到前面,修改了字符串的内容
// 把生成的验证码先变成一个字符数组
//再让最后一个元素跟前面的随机位置的元素进行交换
char[] chs = str.toCharArray();
int randomIndex = r.nextInt(chs.length);
char temp = chs[randomIndex];
chs[randomIndex] = chs[chs.length-1];
chs[chs.length-1] = temp;
//交换完毕之后再变成字符串就可以了。
String result = new String(chs);
System.out.println(result);
}
}
练习5.
给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。注意:需要用已有的知识完成。
不需要考虑乘积过大之后的结果
就认为乘积一定是小于int的最大值的
package cn.nwafu.Test;
public class test5 {
public static void main(String[] args) {
// 给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。注意:需要用已有的知识完成。
// 不需要考虑乘积过大之后的结果
// 就认为乘积一定是小于int的最大值的
String num1 = "1234";
String num2 = "0123";
//1.把num1和num2变成对应的整数才可以
先遍历字符串依次得到每一个字符 '0' 1’ '2''3’'4''5’'6''7''8''9'
// 再把字符变成对应的数字即可0 1 2 3 4 5 6 7 8 9
// 把每一个数字组合到一起1234
int number1 = getNumber(num1);
//System.out.println(number1);
int number2 = getNumber(num2);
//2.利用整数进行相乘
int resultNum = number1 * number2;
//3.把整数变回字符串
System.out.println(resultNum+"");
}
public static int getNumber(String num){
//num == "1234"
int result = 0;
for (int i = 0; i < num.length(); i++) {
char c = num.charAt(i);
//System.out.println(c);
int number =c - 48;
result = result * 10 + number;
}
return result;
}
}
练习6.
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。
单词是指仅由字母组成、不包含任何空格字符的最大子字符串。
示例1:输入: s = "Hello world" 输出:5
解释:最后一个单词是"world”,长度为5。
示例2:输入: s = "fly me to the moon" 输出:4
解释:最后一个单词是"moon”,长度为4。
示例3:输入: s = "luffy is still joyboy" 输出:6
解释:最后一个单词是“joyboy”,长度为6。
package cn.nwafu.Test;
public class test6 {
public static void main(String[] args) {
// 练习6.
// 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。
// 单词是指仅由字母组成、不包含任何空格字符的最大子字符串。
// 示例1:输入: s = "Hello world" 输出:5
// 解释:最后一个单词是"world”,长度为5。
// 示例2:输入: s = "fly me to the moon" 输出:4
// 解释:最后一个单词是"moon”,长度为4。
// 示例3:输入: s = "luffy is still joyboy" 输出:6
// 解释:最后一个单词是“joyboy”,长度为6。
String str = "Hello World joyboy";
//倒着遍历
//直到遇到空格为止
//那么遍历的次数就是单词的长度
int count = 0;
for (int i = str.length()-1; i >= 0; i--) {
char c = str.charAt(i);
//System.out.println(c);
if(c == ' '){
break;
}else{
count++;
}
}
System.out.println(count);
}
}