API和API帮助文档
API:
(Application Programming Interface):应用程序编程接口
API就是别人写好的东西 我们不需要自己写 直接使用即可
Java API :目前是JDK中提供的各种功能的Java类
这些类将底层的实现封装了起来 我们不需要关心这些类是如何实现的 只需要学习这些类如何使用即可
API帮助文档
帮助开发人员更好的使用API和查询API的一个工具
如何使用帮助文档
1 打开API帮助文档
2 找到右上角显示点击 找到索引下面的输入框
3 输入类名回车点显示
4 查看类所在包
5 查看类描述
6 查看构造方法
7 查看成员方法
API文档练习
需求:
按照帮助文档的使用步骤学习Scanner类的使用 并实现接收键盘录入一个小数 最后输出在控制台
package com.wide;
import java.util.Scanner;
public class Role {
public static void main(String[] args) {
//创建对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个小数");
//接收一个小数
double result = sc.nextDouble();
//输出打印
System.out.println(result);
}
}
字符串
String
Java.lang.String类代表字符串,Java程序中的所有字符串文字(例如"abc")都为此类的对象
String是Java定义好的一个类 定义在Java.lang包中 所以使用的时候不需要导包
字符串不可变 它们的值在创建后不能被更改
注意点
字符串的内容是不会发生改变的 它的对象在创建后不能被更改
创建String对象的两种方式
1 直接赋值
2 new
package com.wide;
public class StringDemo01 {
public static void main(String[] args) {
//1 使用直接赋值的方式获取一个字符串对象
String s1 = "abc";
System.out.println(s1);
//2 使用new的方式来获取一个字符串对象
//空参构造:可以获取一个空白的字符串对象
String s2 = new String();
System.out.println("@" + s2 + "|");
//快递一个字符串 根据传递的字符串内容在创建一个新的字符串对象
String s3 = new String("abc");
System.out.println(s3);
//传递一个字符数组,根据字符数组的内容再创造一个新的字符串对象
char[] chs = {'a','b','c','d'};
String s4 = new String(chs);
System.out.println(s4);
//快递一个字节数组 根据字节数组的内容再创造一个新的字符串对象
//应用场景:以后在网络当中传输的数据其实都是字节信息
//我们一般要把字节信息进行转换 转换成字符串 此时就要用到这个构造了
byte[] bytes = {97,98,99,100};
String s5 = new String(bytes);
System.out.println(s5);
}
}
Java的常用方法(比较)
==号比较的到底是什么?
基本数据类型
int a = 10;
int b = 20;
System.out.println(a==b); //false
基本数据类型比较的是数据值;//具体的数据值
引用数据类型
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1==s2); //false
数据类型比较的是地址值
字符串比较
package com.wide;
public class StringDemo02 {
public static void main(String[] args) {
//1创建两个字符串对象
String s1 = new String("abc");
String s2 = "Abc";
//2 ==号比较
//基本数据类型比的是数据值
//引用数据类型比的是地址值
System.out.println(s1 == s2);
//3 比较字符串中对象中的内容是否相等
boolean result1 = s1.equals(s2);
System.out.println(result1);
//4比较字符串对象中的内容是否相等 忽略大小写
boolean result2 = s1.equalsIgnoreCase(s2);
System.out.println(result2);
}
}
案例用户登录
需求:
已知正确的用户名和密码 请用程序实现模拟用户登录
总共三次机会 登录之后给出相应提示
package com.wide;
import java.util.Scanner;
public class StringDemo02 {
public static void main(String[] args) {
//1键盘录入用户名和密码
String rightUsername = "Alacan";
String rightPassword = "5201314";
//键盘录入用户名和密码
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();
//3 比较
if (username.equals(rightUsername) && password.equals(rightPassword)){
System.out.println("用户登录成功");
break;
}else{
System.out.println("用户登录失败用户名或密码有误");
}
}
}
}
案例 遍历字符串
需求:
键盘录入一个字符串 使用程序实现在控制台遍历该字符串
package com.wide;
import java.util.Scanner;
public class StringDemo02 {
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);
}
}
}
案例 统计字符次数
键盘录入一个字符串 统计该字符串中大写字母字符 小写字母字符 数字字符出现的次数
(不考虑其他字符)
package com.wide;
import java.util.Scanner;
public class StringDemo02 {
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++) {
//i 表示字符串中每一个索引
char c = str.charAt(i);
if (c >= 'a' && c <= 'z'){
smallCount++;
}else if (c >= 'A' && c <= 'Z'){
bigCount++;
}else if (c >= '1' && c >= '9'){
numberCount++;
}
}
System.out.println("小写字母有"+smallCount+"个");
System.out.println("大写字母有"+bigCount+"个");
System.out.println("数字有"+numberCount+"个");
}
}
案例 拼接字符串
定义一个方法 把int数组中的数据按照指定的格式拼接成一个字符串返回
调用该方法 并在控制台输出结果
例如 数组为 int[] arr = {1,2,3};
执行方法后的输出结果为:[1,2,3]
package com.wide;
public class StringDemo02 {
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 com.wide;
public class StringDemo02 {
public static void main(String[] args) {
String result = reveser("abc");
System.out.println(result);
}
public static String reveser(String str){
String result = " ";
for (int i = str.length()-1;i >= 0; i--) {
char c = str.charAt(i);
result = result + c;
}
return result;
}
}
案例 金额转换
package com.wide;
import java.util.Scanner;
public class StringDemo02 {
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 <= 999999999){
break;
}else {
System.out.println("金额无效");
}
}
//定义一个变量用来表示钱的大写
String moneyStr = "";
//得到money里面扽每一个数
while(true){
//从右往左获取数据 因为右侧是数据的个位
int ge = money % 10;
String capitalNumber = getCapitalNumber(ge);
//转换之后的大写拼接到moneyStr中
moneyStr = capitalNumber + moneyStr;
//去掉刚刚获取的数据
money = money / 10;
if(money == 0){
break;
}
}
//3在前面补零补齐七位
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 = result + c + arr[i];
}
System.out.println(result);
}
public static String getCapitalNumber(int number){
//定义数组 让数字跟大写中文产生对应关系
String[] arr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
//返回结果
return arr[number];
}
}
案例 手机号屏蔽
String substring(int beginIndex,int endIndex) //截取
//注意点:包头不包尾 包左不包右 只有返回值才是截取的小串
String substring(int beginIndex). //截取到末尾
package com.wide;
public class StringDemo02 {
public static void main(String[] args) {
//获取一个手机号码
String phoneNumber = "13112349468";
//2 截取手机号码前三位
String start = phoneNumber.substring(0,3);
//3 截取手机号码后面四位
String end = phoneNumber.substring(7);
//4 拼接
String result = start + "****" + end;
System.out.println(result);
}
}
案例 身份证查看
package com.wide;
import java.util.Locale;
public class StringDemo02 {
public static void main(String[] args) {
//定义一个字符串记录身份证号码
String id = "321281202001011234";
//获取出生年月日
String year = id.substring(6,10);
String mouth = id.substring(10,12);
String day = id.substring(12,14);
System.out.println("人物信息为:");
System.out.println("出生年月日为:" + year + "年" + mouth + "月" + day + "日");
//获取性别
char gender = id.charAt(16);
int num = gender - 48;
if (num % 2 == 0){
System.out.println("性别为女");
}else{
System.out.println("性别为男");
}
}
}
案例 敏感词替换
String replace(旧值,新值)// 替换
注意点:只有返回值才是替换之后的结果
基本写法
package com.wide;
public class StringDemo02 {
public static void main(String[] args) {
//获取要说的话
String talk = "你玩的真好,TMD";
//把里面敏感词换成***
String result = talk.replace("TMD","***");
System.out.println(result);
}
}
package com.wide;
public class StringDemo02 {
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);
}
}
StringBuilder
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
使用StringBuilder场景:
字符串的拼接
字符串的反转
package com.wide;
public class StringDemo02 {
public static void main(String[] args) {
//创建对象
StringBuilder sb = new StringBuilder("abc");
//添加元素
sb.append(1);
sb.append(2.3);
sb.append(true);
//反转
sb.reverse();
//获取长度
int len = sb.length();
System.out.println(len);
System.out.println(sb);
}
}
package com.wide;
public class StringBuilderDemo03 {
public static void main(String[] args) {
//创建对象
StringBuilder sb = new StringBuilder();
//添加字符串
sb.append("aaa");
sb.append("bbb");
sb.append("ccc");
System.out.println(sb);
//把StringBuilder变回字符串
String str = sb.toString();
System.out.println(str);
}
}
链式编程
package com.wide;
import java.util.Scanner;
public class StringBuilderDemo04 {
public static void main(String[] args) {
//链式编程
//当我们在调用一个方法的时候 不需要用变量接收他的结果 可以继续调用其他方法
int len = getString().substring(1).replace("A","Q").length();
System.out.println(len);
}
public static String getString(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String str = sc.next();
return str;
}
}
public class StringBuilderDemo03 {
public static void main(String[] args) {
//创建对象
StringBuilder sb = new StringBuilder();
//添加字符串
sb.append("aaa").append("bbb").append("ccc");
System.out.println(sb);
//把StringBuilder变回字符串
String str = sb.toString();
System.out.println(str);
}
}
练习 对称字符串
需求:
键盘接受一个字符串 程序判断出该字符串是否对称字符串 并在控制台打印是或不是
对称字符串:123321 111
非对称字符串: 123123
package com.wide;
import java.util.Scanner;
public class StringBuilderDemo03 {
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("当前字符串不是对称字符串");
}
}
}
练习 拼接字符串
需求:
定义一个方法 把int数组中的数据按照指定的格式拼接成一个字符串返回
调用该方法 并在控制台输出结果
例如:数组为int[] arr = {1,2,3};
执行方法后的输出结果为:[1,2,3]
package com.wide;
public class StringBuilderDemo03 {
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){
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]).append(",");
}
}
sb.append("]");
return sb.toString();
}
}
StringJoiner
StringJoiner跟StringBuilder一样 也可以看成是一个容器 创建之后里面的内容是可变的
作用:
提高字符串的操作效率 而且代码编写特别简洁 但是目前市场上很少有人在用
JDK8 出现的
StringJoiner的构造方法
方法名:
public StringJoiner(间隔符号)
说明:
创建一个StringJoiner对象 指定拼接时的间隔符号
方法名:
public StringJoiner(间隔符号 ,开始符号, 结束符号)
说明:
创建一个StringJoiner对象 指定拼接时的间隔符号、开始符号、结束符号;
StringJoiner的成员方法
方法名:
public StringJoiner add(添加的内容)
说明:
添加数据 并返回对象本身
方法名:
public int length()
说明:
返回长度(字符出现个数)
public String toString
说明:
返回一个字符串(该字符串就是拼接之后的结果)
package com.wide;
import java.util.StringJoiner;
public class StringBuilderDemo03 {
public static void main(String[] args) {
//创建一个对象
StringJoiner sj = new StringJoiner("====");
//添加元素
sj.add("aaa").add("bbb").add("ccc");
System.out.println(sj);
}
}
package com.wide;
import java.util.StringJoiner;
public class StringBuilderDemo03 {
public static void main(String[] args) {
//创建一个对象
StringJoiner sj = new StringJoiner(", ","[","]");
//添加元素
sj.add("aaa").add("bbb").add("ccc");
int len = sj.length();
System.out.println(len);
System.out.println(sj);
String str = sj.toString();
System.out.println(str);
}
}
总结:
String:
表示字符串的类 定义了很多操作字符串的方法
StringBuilder:
一个可变的操作字符串的容器
可以高效的字母拼接字符串 还可以将容器里面的内容反转
StringJoiner:
JDK8出现的一个可变的操作字符串的容器 可以高效 方便的拼接字符串
在拼接的时候 可以指定间隔符号 开始符号 结束符号
字符串原理
底层原理 1 : 字符串存储的内存原理
直接赋值会复用字符串常量池中的
new出来不会复用 而是开辟一个新空间
底层原理 2 : ==号比较的到底是什么
基本数据类型比较数据值
引用数据类型比较地址值
底层原理 3 :字符串拼接的底层原理
拼接的时候没有变量 都是字符串
触发字符串的优化机制
在编译的时候就已经是最终结果了
在拼接的时候有变量
JDK8以前底层会使用StringBuilder
字符串拼接的时候有变量参与:
在内存中创建了很多的对象
浪费空间 时间也非常慢
结论:
如果很多字符串变量拼接 不要直接➕ 在底层创建多个对象 浪费时间 浪费性能
如果没有变量参与 都是字符串直接相加 编译之后就是拼接之后的结果 会复用串池中的字符串
如果有变量参与 每一行拼接的代码 都会在内存中创建新的字符串 浪费内存
底层原理 4 :StringBuilder提高效率原理图
字符串拼接的时候 如果有变量:
JDK8以前:系统底层会自动创建一个StringBuilder对象 然后在调用其append方法完成拼接
拼接后 在调用其 toString方法转换为String类型 而toString方法的底层是直接new了一个字符串对象
JDK8版本:系统会预估要字符串拼接之后的总大小 把要拼接的内容都放在数组中 此时也是产生了一个新的字符串
所有要拼接的内容都会往StringBuilder中放 不会创建很多无用的空间 节约内存
底层原理 5 :StringBuilder源码分析
默认创建一个长度为16的字节数组
添加的小于16直接存储
大于16(容量16*2+2)
扩容之后还不够 以实际长度为准
package com.wide;
public class StringBuilderDemo03 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
//容量是最多可以装多少
//长度是已经装了多少
System.out.println(sb.capacity());
System.out.println(sb.length());
// sb.append("abc");
// sb.append("abcdefghijklmnopqrstuvwxyz");
sb.append("abcdefghijklmnopqrstuvwxyz0123456789");
System.out.println(sb.capacity());
System.out.println(sb.length());
}
}
综合练习 转换罗马数字
键盘录入一个字符串
要求1:长度小于等于9
要求2:只能是数字
将内容变成罗马数字
下面是阿拉伯数字跟罗马数字的对比关系
I - 1、II - 2、III - 3、IV - 4、V - 5、VI - 6 、VII - 7 、VIII - 8、IX - 9;
注意点:
罗马数字里面没有零
如果键盘录入的数字包含0,可以变成“”(长度为0的字符串)
package com.wide;
import java.util.Scanner;
public class StringBuilderDemo03 {
public static void main(String[] args) {
//System.out.println('0'+0);
Scanner sc = new Scanner(System.in);
//ctrl+alt+t
String str;
while (true) {
System.out.println("请输入一个字符串");
str = sc.next();
//校验字符串是否满足规则
boolean flag = checkStr(str);
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 = changLouMa(number);
sb.append(s);
}
System.out.println(sb);
}
public static String changLouMa(int number){
//定义一个数组让索引跟罗马数组产生一个对应关系
String[] arr = {"","I","II","III","IV","V","VI","VII","VIII","IX"};
return arr[number];
}
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);//0-9
if (c < '0'|| c > '9'){
return false;
}else{
return true;
}
}
return true;
}
}
综合练习 调整字符串
给定两个字符串 A 和 B
A的旋转操作就是将A最左边的字符移动到最右边
例如,若A=‘abcde',在移动一次之后结果是’bcdea‘
如果在若干次调整操作之后 A能变成B 那么返回True
如果不能匹配成功 则返回false
package com.wide;
public class StringBuilderDemo03 {
public static void main(String[] args) {
String strA = "abcde";
String strB = "cdeab";
boolean result = check(strA,strB);
System.out.println(result);
}
public static boolean check(String strA,String strB){
for (int i = 0; i < strA.length(); i++) {
strA = rotate(strA);
if (strA.equals(strB)){
return true;
}
}
return false;
}
public static String rotate(String str){
//截取思路
//获取最左侧字符
char first = str.charAt(0);
//获取到剩余字符
String end = str.substring(1);
return end + first;
}
}
package com.wide;
public class StringBuilderDemo03 {
public static void main(String[] args) {
String strA = "abcde";
String strB = "cdeab";
boolean result = check(strA,strB);
System.out.println(result);
}
public static boolean check(String strA,String strB){
for (int i = 0; i < strA.length(); i++) {
strA = rotate(strA);
if (strA.equals(strB)){
return true;
}
}
return false;
}
public static String rotate(String str){
char[] arr = str.toCharArray();
//拿到0索引字符
char first =arr[0];
//获取到剩余字符
for (int i = 1; i < arr.length; i++) {
arr[i-1] = arr[i];
}
arr[arr.length-1] = first;
String result = new String(arr);
return result;
}
}