JAVA----API
一、API
1.Scanner的基本使用
API解释:
全称叫应用程序编程接口( Application Programming Interface ) , 本意指的是JDK提供的各种类和接口
例如: Scanner 获取字符串
public String nextLine ( ) ; 获取用户录入的字符串,能获取整行数据。
public String nextInt ( ) ; 获取整数类型的数据
public String next ( ) ; 获取用户录入的字符串,但是只能获取空格以前的内容
import java. util. Scanner ;
public class Demo01 {
public static void main ( String [ ] args) {
Scanner scanner = new Scanner ( System . in) ;
System . out. println ( "请输入你爱的人的名字: " ) ;
String str = scanner. nextLine ( ) ;
System . out. println ( str) ;
}
}
2.Scanner的小技巧.
Scanner 的细节问题:
问题描述:
先用 nextInt ( ) 接收整数,再用 nextLine ( ) 接收字符串,发现字符串无法接收。
产生原因:
1. nextInt ( ) 、 nextLine ( ) 两个方法结束标记都是 \r\n
2. nextInt ( ) 方法只接收用户录入的整数,不接收 \r\n
3. 它遗留下来的 \r\n 只能被 nextLine ( ) 识别, 导致 nextLine ( ) 方法直接结束。
解决方案:
1. 都用字符串接收,然后把字符串形式的整数转化成对应的整数。 -- -- 》【掌握: 这是实际开发做法】
int num = Integer . parseInt ( "123" ) ;
2. 重新 new 一个Scanner 对象。
3. 重新调用一次 newLine ( ) 方法。
4. 通过 next ( ) 方法实现。
5. 尽量先 nextLine ( ) , 然后 nextInt ( ) 也能解决。
package demo01_scanner ;
import java. util. Scanner ;
public class Demo02 {
public static void main ( String [ ] args) {
System . out. println ( "----------------[华丽分割线]----------------" ) ;
Scanner sc = new Scanner ( System . in) ;
System . out. println ( "请输入一个整数: " ) ;
String str_num = sc. nextLine ( ) ;
int num = Integer . parseInt ( str_num) ;
System . out. println ( "num " + num) ;
System . out. println ( "请输入字符串: " ) ;
String str = sc. nextLine ( ) ;
System . out. println ( str) ;
}
}
3.Object类的toString和 equals方法
Object 类 简介: '它是所有类的父类, 所有的类都直接或者间接的继承自Object类'
构造方法:
public Object ( ) ;
成员方法:
public String toString ( )
返回该对象的字符串表示形式。
作者:格式为: 全类名,@标记符 ,该对象的哈希码的无符号十六进制形式组成。 == = 》对象的地址
实际开发:无意义,实际开发中,子类都会重写该方法,改为打印:该对象的各个属性值。
如何重写呢? 快捷键生成。
public boolean equals ( Object obj) ;
作者:比较两个对象是否相等( 即:是否是同一个对象) ,默认比较的是地址值是否相等,无意义
实际开发:子类都会重写该方法,用来比较各个对象的属性值是否相等。
举例:
stu1. name == stu2. name
stu1. age == stu2. age
stu1和stu2地址肯定不一样 new 了两次
如果各个属性都相等,可以认为是同一个对象
细节('记忆' ):
1. 实际开发中,我们认为,如果同一个类的多个对象,只要属性值相同,他们就是同一个对象,即:
Student s1 = new Student ( "马佳玉" ,23 ) ;
Student s2 = new Student ( "马佳玉" ,23 ) ;
上述两个对象实际开发中,我们也会认为他们是同一个对象。
2. 输出语句直接打印对象,默认调用了该对象的toString ( ) 方法。
public class Demo01 {
public static void main ( String [ ] args) {
Student student = new Student ( ) ;
System . out. println ( student) ;
System . out. println ( student. toString ( ) ) ;
Student stu1 = new Student ( "马佳玉" , 23 ) ;
Student stu2 = new Student ( "马佳玉" , 23 ) ;
boolean flag = stu1. equals ( stu2) ;
System . out. println ( flag) ;
}
}
4.字符串比较详解
String 类简介:
他是java. lang包下的类,可以直接使用,无需导包,他表示所有的字符串,每一个字符串都是它的对象。
String s1 = new String ( "abc" ) ;
String s1 = "abc" ;
成员方法:
public boolean equals ( Object obj) ;
这个是String 重写了Object #equals ( ) 方法,比较字符串的内容是否相同,区分大小写。
注意:不再是比较地址是否一致,非要比较地址是否一致: == = 比较运算符
public boolean equalsIgnoreCase ( String s)
这个是String 独有的方法,比较字符串的内容是否相同,不区分大小写。
需求:
定义字符数组chs,初始化值为:'a' , 'b' , 'c' ,这三个字符。
将其分别封装成s1 ,s2这两个字符串对象
直接通过 "" 的方式创建两个字符串对象s3 和 s4
通过 == 分别判断s1 和s2 , s3 和 s4 是否相同。
通过equals ( ) 分别判断 s1 和s2 , s3 和 s4 是否相同。
通过equalsIgnoreCase ( ) 判断字符串abc 和 ABC 是否相同
细节:(记忆)
1. == 的作用:
比较基本类型:比的是 数值。 10 == 20 比较数值
比较引用类型:比的是 地址值 s1 == s2 比较地址值
2. String # equals ( ) 区分大小写 equalsIgnoreCase ( ) 忽略大小写
package demo02_object ;
public class Demo02 {
public static void main ( String [ ] args) {
char [ ] chs = { 'a' , 'b' , 'c' } ;
String s1 = new String ( chs) ;
String s2 = new String ( chs) ;
String s3 = "abc" ;
String s4 = "abc" ;
System . out. println ( s1 == s2) ;
System . out. println ( s1 == s3) ;
System . out. println ( s3 == s4) ;
System . out. println ( "----------------[华丽分割线]----------------" ) ;
System . out. println ( s1. equals ( s2) ) ;
System . out. println ( s1. equals ( s3) ) ;
System . out. println ( s3. equals ( s4) ) ;
System . out. println ( "----------------[华丽分割线]----------------" ) ;
System . out. println ( "abc" . equals ( "ABC" ) ) ;
System . out. println ( "abc" . equalsIgnoreCase ( "ABC" ) ) ;
}
}
5. 模拟登陆
1. 定义变量,记录账号密码
2. 创建Scanner 对象
3. 因为只有三次机会 使用for 循环
4. 提示用户录入账号和密码 并接收
5. 判断录入的账号密码是否正确 正确就等于成功 退出程序
6. 如果不正确 判断是否还有剩余的登录次数 有就继续 没有就锁定账号
package demo02_object ;
import java. util. Scanner ;
public class Demo03_Login {
public static void main ( String [ ] args) {
String username = "马佳玉" ;
String password = "你好" ;
Scanner sc = new Scanner ( System . in) ;
for ( int i = 0 ; i < 3 ; i++ ) {
System . out. println ( "请输入您的密码: " ) ;
String usern = sc. nextLine ( ) ;
System . out. println ( "请输入您的密码: " ) ;
String pass = sc. nextLine ( ) ;
if ( usern. equals ( username) && pass. equals ( password) ) {
System . out. println ( "欢迎您登录: " + usern) ;
break ;
} else {
System . out. println ( 2 - i > 0 ? "录入错误 您还有" + ( 2 - i) + "次机会" : "错误次数 已达上限,账号锁定,请联系管理员" ) ;
}
}
}
}
6.遍历字符串
1. 提示用户录入字符串 并接收
2. 遍历字符串
package demo02_object ;
import java. util. Arrays ;
import java. util. Scanner ;
public class Demo03_Iter {
public static void main ( String [ ] args) {
Scanner sc = new Scanner ( System . in) ;
System . out. println ( "请录入一个字符串: " ) ;
String s = sc. nextLine ( ) ;
for ( int i = 0 ; i < s. length ( ) ; i++ ) {
char c = s. charAt ( i) ;
System . out. println ( c) ;
}
System . out. println ( "----------------[华丽分割线]----------------" ) ;
char [ ] chars = s. toCharArray ( ) ;
for ( int i = 0 ; i < chars. length; i++ ) {
char ch = chars[ i] ;
System . out. println ( ch) ;
}
System . out. println ( "----------------[华丽分割线]----------------" ) ;
System . out. println ( Arrays . toString ( s. toCharArray ( ) ) ) ;
}
}
7. 统计每类字符的次数
定义统计变量 用来记录结果
键盘录入一个字符串 并接收
遍历字符串 获取每一个字符
判断该字符属于那种类别 对应类别得到计数器就 ++
package demo04_exercise ;
import java. util. Scanner ;
public class Demo03 {
public static void main ( String [ ] args) {
int smallCount = 0 , bigCount = 0 , numberCount = 0 ;
Scanner sc = new Scanner ( System . in) ;
System . out. println ( "请录入一个字符串: " ) ;
String s = sc. nextLine ( ) ;
char [ ] chs = s. toCharArray ( ) ;
for ( int i = 0 ; i < chs. length; i++ ) {
char ch = chs[ i] ;
if ( ch >= 'a' && ch <= 'z' )
smallCount ++ ;
else if ( ch >= 'A' && ch <= 'Z' )
bigCount++ ;
else if ( ch >= 'O' && ch <= '9' )
numberCount++ ;
}
System . out. println ( "小写字母字符: " + smallCount) ;
System . out. println ( "大写字母字符: " + bigCount) ;
System . out. println ( "数字字符: " + numberCount) ;
}
}
8.StringBuilder基本使用
StringBuilder 简介:
它表示字符串缓冲区类,内容是可变的
构造方法:
public StringBulider ( ) ;
public StringBulider ( String s) ;
可以把这个构造方法理解为就是用来实现: 把字符串转成 对应的StringBuilder 对象的。
String 字符串 == 》 StringBulider 字符串缓冲区类
成员方法:
public String toString ( ) ; 重写object#toString ( ) , 打印对象内容
public String reverse ( String ) ; 反转字符串 返回自身
public boolean append ( Object obj) ; 添加元素 返回自身
package demo08_StringBuilder ;
public class Demo01 {
public static void main ( String [ ] args) {
StringBuilder sb1 = new StringBuilder ( ) ;
StringBuilder sb2 = sb1. append ( "abc" ) ;
StringBuilder sb3 = sb1. append ( "123" ) ;
System . out. println ( sb1) ;
System . out. println ( sb2) ;
System . out. println ( sb3) ;
System . out. println ( "----------------[华丽分割线]----------------" ) ;
System . out. println ( sb1 == sb2) ;
System . out. println ( sb1 == sb3) ;
System . out. println ( sb2 == sb3) ;
System . out. println ( "----------------[华丽分割线]----------------" ) ;
StringBuilder sb4 = new StringBuilder ( "james" ) ;
System . out. println ( sb4) ;
}
}
9.StringBuilder和string相互转换
问题: 为什么会有类型互相转换?
答案: 当某个类A 想用类B的功能的,我们可以尝试把类A对象转换成类B对象,这样就可以调用类B的方法之后,调用完毕之后,再转回类A即可。
package demo08_StringBuilder ;
public class Demo02 {
public static void main ( String [ ] args) {
String name = "马佳玉" ;
StringBuilder sb1 = new StringBuilder ( name) ;
System . out. println ( sb1) ;
System . out. println ( "----------------[华丽分割线]----------------" ) ;
String new_str = sb1. toString ( ) ;
System . out. println ( new_str) ;
}
}
10.拼接数组元素
链式调用:
如果某个方法的返回值是一个对象,可以再后边直接通过,语法继续调用对象的方法 实际开发写法 Arrays.toSring(arr) 代码
package demo05_StringBuilder ;
import java. util. Arrays ;
public class Demo03 {
public static void main ( String [ ] args) {
int [ ] arr = { 1 , 2 , 3 } ;
System . out. println ( Arrays . toString ( arr) ) ;
System . out. println ( "----------------[华丽分割线]----------------" ) ;
String s = arrayToString ( arr) ;
System . out. println ( s) ;
}
public static String arrayToString ( int [ ] arr) {
if ( arr == null || arr. length == 0 ) {
return "[]" ;
}
StringBuilder sb = new StringBuilder ( "[" ) ;
for ( int i = 0 ; i < arr. length; i++ ) {
if ( i != ( arr. length - 1 ) ) {
sb. append ( arr[ i] ) . append ( "," ) ;
} else {
sb. append ( arr[ i] ) . append ( "]" ) ;
}
}
return sb. toString ( ) ;
}
}
11.StringBuilder反转字符串
链式调用: 如果某个方法的返回值是一个对象 可以在后边直接通过,语法继续调用对象的方法 代码
package demo05_StringBuilder ;
import java. util. Scanner ;
public class Demo04 {
public static void main ( String [ ] args) {
Scanner sc = new Scanner ( System . in) ;
System . out. println ( "请录入一个字符串: " ) ;
String s = sc. nextLine ( ) ;
System . out. println ( "反转之前: " + s) ;
System . out. println ( "----------------[华丽分割线]----------------" ) ;
StringBuilder sb = new StringBuilder ( s) ;
sb. reverse ( ) ;
String new_str = sb. toString ( ) ;
System . out. println ( "反转之后: " + new_str) ;
System . out. println ( "----------------[华丽分割线]----------------" ) ;
String s1 = new StringBuilder ( s) . reverse ( ) . toString ( ) ;
System . out. println ( s1) ;
}
}
数据结构算法 : 冒泡排序,快速排序,希尔排序,堆排序。。。。。。。
12.冒泡排序
冒泡排序原理:
相邻元素两两比较,大的往后走,这样第一轮比较完之后,最大值就在最大所引出
代码
package demo06_sort ;
import java. util. Arrays ;
public class Demo01_Sort {
public static void main ( String [ ] args) {
int [ ] arr = { 25 , 69 , 80 , 57 , 13 } ;
for ( int i = 0 ; i < arr. length - 1 ; i++ ) {
for ( int j = 0 ; j < arr. length - 1 - i; j++ ) {
if ( arr[ j] > arr[ j + 1 ] ) {
int temp = arr[ j] ;
arr[ j] = arr[ j + 1 ] ;
arr[ j + 1 ] = temp;
}
}
}
System . out. println ( Arrays . toString ( arr) ) ;
}
}
二、Arrays
1.演示Arrays工具类的用法
Arrays工具类概念:
他是用来操作数组的工具类,里边定义了大量操作数组元素的方法,例如:排序、转换字符串等。
格式:
涉及到的成员方法:
1. 对数组进行升序排序,默认是升序。
public static void sort ( int [ ] arr) ;
2. 把数组转换成其对应的字符串表示形式,例如: int [ ] arr = [ 1 , 2 , 3 ] ; -- > "[1,2,3]"
public static String toString ( 数组对象) ;
工具类:
1. 成员都是静态的
2. 构造方法私有化
package demo06_sort ;
import java. util. Arrays ;
public class Demo02_Array_Sort {
public static void main ( String [ ] args) {
int [ ] arr = { 25 , 69 , 80 , 57 , 13 } ;
Arrays . sort ( arr) ;
System . out. println ( Arrays . toString ( arr) ) ;
}
}
四、包装类
1.包装类入门
包装类入门
包装类简介:
' 所谓的包装类指的就是 基本类型对应的引用类型。 '
对应关系:
基本类型 对应的包装类( 引用类型)
byte Byte
short Short
char Character
int Integer
long Long
float Float
double Double
boolean Boolean
学习包装类主要目的:
' String类型的数据 ==转换==》 该包装类对应的基本类型 '
例如:
Integer 是用来把 "123" -> 123
Double 是用来把 "10.3" -> 10.3
Boolean 是用来把 "false" -> false
. . . . . . . . . .
Integer 类解释:
概述:
' 他是int类型对应的引用类型(包装类),主要适用于把"123" -> 123 '
构造方法:
public Integer ( int i) ; 创建Integer 对象,封装:整数。
public Integer ( String s) ; 创建Integer 对象,封装:字符串,必须是纯数字形式的字符串
成员变量:
public static final int MAX_VALUE; int 类型最大值。
public static final int MIN_VALUE; int 类型最小值。
package demo04_exercise ;
public class Demo01 {
public static void main ( String [ ] args) {
System . out. println ( Integer . MAX_VALUE) ;
System . out. println ( Integer . MIN_VALUE) ;
Integer il = new Integer ( 10 ) ;
System . out. println ( il) ;
Integer i1 = new Integer ( "123" ) ;
System . out. println ( i1) ;
}
}
2.int和String相互转换
int 和 String 之间如何相互转换
int -- - 》 String :
String s = "" + 10 ;
String -- - 》 Int :
int num = Integer . parseInt ( "123" ) ;
Integer 类中的方法解释:
public static int parseInt ( String s) ; 把字符串形式的整数转成其对应的int 类型.
记忆(细节):
所有包装类都有一个parseXXX()方法,用于把字符串数据转换成该类型对应的基本类型的数据
例如:
int num = Integer . parseInt ( "123" ) ;
double d = Double . parseDouble ( "10.3" ) ;
boolean flag = Boolean . parseBoolean ( "true" ) ;
package demo07_interger ;
public class Demo01 {
public static void main ( String [ ] args) {
String str = "" + 10 ;
System . out. println ( str) ;
System . out. println ( "----------------[华丽分割线]----------------" ) ;
String str_int = "520" ;
int num = Integer . parseInt ( str_int) ;
System . out. println ( num) ;
}
}
3.字符串元素排序
需求:
已知字符串String s = "91 27 45 38 50" ;
请通过代码实现最终输出结果是: "27, 38, 45, 50, 91"
思路:
1. 把String 字符串转换成其对应的字符串数组。
String [ ] arrstr = { "91" , "27" , "45" , "38" , "50" } ;
2. 把String [ ] -> int [ ]
int [ ] arr = [ 91 , 27 , 45 , 38 , 50 ] ;
3. 对int [ ] 进行排序.
int [ ] arr = [ 27 , 38 , 45 , 50 , 91 ] ;
4. 把上一获取到的数组元素拼接成对应格式的字符串.
"27, 38, 45, 50, 91"
涉及到的成员方法:
String 类中的成员的方法:
public String [ ] split ( String regex) ; 根据规则,切割字符串。
public String substring ( int start ,int end) ; 截取字符串,包左不包右。
public String replaceAll ( String older , String newStr) ; 替换字符串
Integer 类中的成员方法:
将字符串转换成int 类型
parseInt ( ) ;
Arrays 类中的成员方法:
数组排序
sort ( ) ,
打印数组
toString ( )
package demo07_interger ;
import java. util. Arrays ;
public class Demo02 {
public static void main ( String [ ] args) {
String str = "91 27 45 38 50" ;
String [ ] arrstr = str. split ( " " ) ;
int [ ] intArr = new int [ arrstr. length] ;
for ( int i = 0 ; i < arrstr. length; i++ ) {
String str1 = arrstr[ i] ;
intArr[ i] = Integer . parseInt ( str1) ;
}
Arrays . sort ( intArr) ;
String s11 = Arrays . toString ( intArr) ;
String s12 = s11. replaceAll ( "\\[" , "" ) . replaceAll ( "]" , "" ) ;
System . out. println ( s12) ;
}
}
4.自动拆装箱(JDK1.5的特性)
package demo07_interger ;
import com. sun. tools. corba. se. idl. InterfaceGen ;
public class Demo03 {
public static void main ( String [ ] args) {
Integer i1 = new Integer ( 1 ) ;
Integer i2 = 10 ;
System . out. println ( i1) ;
System . out. println ( i2) ;
System . out. println ( "----------------[华丽分割线]----------------" ) ;
int a = i2. intValue ( ) ;
int b = i2;
System . out. println ( a) ;
System . out. println ( b) ;
Integer i3 = 10 ;
i3 += 20 ;
}
}
五、Date和Calendar
Date 解释: java. util包下的类, 它表示日期类, 可以精确到毫秒, 里边大多数的方法已过时, 已经被Calendar 替代了.
构造方法:
public Date ( ) ;
成员方法:
public void setTime ( long time) ;
public long getTime ( ) ;
细节:
1. 直接打印Date 对象, 格式我们不习惯, 能不能换成我们习惯的格式.
可以, SimpleDateFormat 可以实现.
2. 翻看API发现Date 大多数方法已过时, 被Calendar 替代了.
Calendar : 日历类.
3. 获取当前时间毫秒值.
long time = System . currentTimeMillis ( ) ;
package demo08_date ;
import java. util. Date ;
public class Demo01 {
public static void main ( String [ ] args) {
Date d = new Date ( ) ;
System . out. println ( d) ;
System . out. println ( d. getTime ( ) ) ;
System . out. println ( "--------------------" ) ;
Date d2 = new Date ( 1631180490798L ) ;
System . out. println ( d2) ;
System . out. println ( "--------------------" ) ;
long time = System . currentTimeMillis ( ) ;
System . out. println ( time) ;
}
}
2.SimpleDateFormat时间格式化类的用法
概述:
他表示日期格式化类,主要用来格式化或者解析日期的。
构造方法:
public SimpleDateFormat ( ) ; 默认模板
public SimpleDateFormat ( String pattern) 指定模板
成员方法:
Date - 》 String : 格式化
format ( ) ;
String -> Date : 解析
parse ( ) ;
案例:
自定义DateUtils 工具类。
package demo08_SimpleDateFormat ;
import java. text. SimpleDateFormat ;
import java. util. Date ;
public class Demo01 {
public static void main ( String [ ] args) throws Exception {
Date d = new Date ( ) ;
System . out. println ( d) ;
System . out. println ( "===================" ) ;
SimpleDateFormat sdf = new SimpleDateFormat ( "yyyy-MM-dd HH-mm-ss" ) ;
String new_date = sdf. format ( d) ;
System . out. println ( new_date) ;
System . out. println ( "=================" ) ;
String s = "2021年10月10日 15:50:50" ;
SimpleDateFormat sdf2 = new SimpleDateFormat ( "yyyy年MM月dd日 HH:mm:ss" ) ;
Date d2 = sdf2. parse ( s) ;
System . out. println ( d2) ;
}
}
3.Calendar基本使用
案例: 演示Calendar 的用法.
Calendar 简介:
概述:
它表示日历类,是一个抽象类,里面大多数的方法都是代替 Date 类的功能。
成员常量:
public static final int YEAR;
public static final int MONTH;
public static final int DATE;
public static final int DAY_OF_MONTH;
public static final int DAY_OF_YEAR;
成员方法:
public static Calendar getInstance ( ) ; 获取Calendar 类的实例.
public int get ( int field) ; 根据指定的日历字段, 获取值.
public int set ( int year, int month, int day) ; 设置时间.
package demo08_SimpleDateFormat ;
import java. util. Calendar ;
public class Demo02 {
public static void main ( String [ ] args) {
Calendar c = Calendar . getInstance ( ) ;
System . out. println ( c. get ( Calendar . YEAR) ) ;
System . out. println ( c. get ( Calendar . MONTH) ) ;
System . out. println ( c. get ( Calendar . DATE) ) ;
System . out. println ( c. get ( Calendar . DAY_OF_MONTH) ) ;
System . out. println ( c. get ( Calendar . DAY_OF_YEAR) ) ;
System . out. println ( "-----------------------------" ) ;
}
}
4. 异常处理
异常简介:
概述:
Java 中, 把所有的非正常情况统称为异常.
分类:
父类: Throwable
Exception : 这个才是我们常说的异常.
运行时异常: 指的是 RuntimeException 及其子类.
编译期异常: 指的是 非RuntimeException 及其子类.
编译期异常和运行时异常的区别是什么?
编译期异常: 必须处理, 才能通过编译.
运行时异常: 不处理, 也能通过编译, 但是运行报错.
JVM默认是如何处理异常的?
1. 会把异常的类型, 原因, 位置打印到控制台上.
2. 并终止程序的执行.
异常的处理方式:
方式1 : 声明抛出异常, throws
大白话翻译: 告诉调用这里, 我这里有问题, 谁调用, 谁处理.
处理之后, 程序终止运行, JVM默认用的就是这个.
方式2 : 捕获异常, 处理之后, 程序继续执行.
try {
可能出现问题的代码;
} catch ( Exception e) {
e. printStackTrace ( ) ;
} finally {
里边放一定会执行的代码.
}
package com. itheima. demo09_exception ;
import java. text. ParseException ;
import java. text. SimpleDateFormat ;
public class Demo01 {
public static void main ( String [ ] args) {
try {
show ( ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
} finally {
}
System . out. println ( "看看我执行了吗?" ) ;
}
public static void show ( ) throws ParseException {
SimpleDateFormat sdf2 = new SimpleDateFormat ( "yyyy年MM月dd日 HH:mm:ss" ) ;
sdf2. parse ( "2020/1/1" ) ;
}
}