九、Java常见API(1)

本文深入解析Java核心类库,覆盖API、Object类、Scanner类、String类、正则表达式、Math类等关键内容,详述各类的构造方法、特性与应用,如toString()、equals()方法的重写,String类的判断、获取与转换功能,及正则表达式的规则与功能。

1 API的概述(了解)

(1)应用程序编程接口。
(2)就是JDK提供给我们的一些提高编程效率的java类

2 Object类(掌握)

  1. Object是类层次结构的根类,所有的类都直接或者间接的继承自Object类。
  2. Object类的构造方法有一个,并且是无参构造
    这其实就是理解当时我们说过,子类构造方法默认访问父类的构造是无参构造

2.1 toString()方法

toString()

  1. 返回对象的字符串表示,默认是由类的全路径+’@’+哈希值的十六进制表示。这个表示其实是没有意义的,一般子类都会重写该方法。
  2. 如何重写呢?
    把该类的所有成员变量值组成返回即可。
    重写的最终版方案就是自动生成toString()方法
    @Override
    public String toString() {
    	return "Student [name=" + name + ", age=" + age + "]";
    }
    
    System.out.println(s.toString());
    // 输出对象的方法相当于打印对象的toString方法
    System.out.println(s);
    

2.2 equals()方法

比较两个对象是否相同。默认情况下,比较的是地址值是否相同。而比较地址值是没有意义的,所以,一般子类也会重写该方法。
重写过程,我也详细的讲解和分析了。但是最终还是自动生成。

@Override
public boolean equals(Object obj) {
	//为了提高效率
	if(this == obj){
		return true;
	}
	
	//为了提供程序的健壮性
	//我先判断一下,obj是不是学生的一个对象,如果是,再做向下转型,如果不是,直接返回false。
	//这个时候,我们要判断的是对象是否是某个类的对象?
	//记住一个格式:对象名 instanceof 类名
	//表示:判断该对象名是否是该类名一个对象
	if(!(obj instanceof Student)){
		return false;
	}
	//如果是就继续
	
	Student s = (Student)obj;
	//System.out.println("同一个对象,还需要向下转型并比较吗?");
	return this.name.equals(s.name) && this.age == s.age;
}

2.3 了解的方法

A:hashCode() 返回对象的哈希值。哈希值是根据哈希算法计算出来的一个值,这个值和地址值有关,但是不是实际地址值。
B:getClass() 返回对象的字节码文件对象,反射中我们会详细讲解
C:finalize() 用于垃圾回收,在不确定的时间
D:clone() 可以实现对象的克隆,包括成员变量的数据复制,但是它和两个引用指向同一个对象是有区别的。

2.4 两个注意问题

A:直接输出一个对象名称,其实默认调用了该对象的toString()方法。
B:面试题
== 和equals()的区别?
A: ==
基本类型:比较的是值是否相同
引用类型:比较的是地址值是否相同
B: equals()
只能比较引用类型。默认情况下,比较的是地址值是否相同。

3 Scanner类(了解)

在JDK5以后出现的用于键盘录入数据的类

  1. 构造方法
    public Scanner(InputStream source)
    
  2. 常用的格式
    Scanner sc = new Scanner(System.in);
    
    说明:System类下有一个静态的字段:public static final InputStream in; 标准的输入流,对应着键盘录入。InputStream is = System.in;
  3. 基本方法格式
    A: hasNextXxx() 判断是否是某种类型的
    B: nextXxx() 返回某种类型的元素
    举例:用int类型的方法举例
    public boolean hasNextInt()
    public int nextInt()
    
  4. 可能会出现的问题
    1: 常用的两个方法
    public int nextInt():获取一个int类型的值
    public String nextLine():获取一个String类型的值
    2: 出现问题
    先获取一个数值,在获取一个字符串,会出现问题。
    3: 主要原因:就是那个换行符号的问题。
    4: 如何解决呢?
    A:先获取一个数值后,在创建一个新的键盘录入对象获取字符串。
    B:把所有的数据都先按照字符串获取,然后要什么,你就对应的转换为什么。

4 String类(掌握)

字符串:就是由多个字符组成的一串数据。也可以看成是一个字符数组。

4.1 构造方法

A:public String()
B:public String(byte[] bytes)
C:public String(byte[] bytes,int offset,int length)
D:public String(char[] value)
E:public String(char[] value,int offset,int count)
F:public String(String original)
下面的这一个虽然不是构造方法,但是结果也是一个字符串对象
G:String s = "hello";

4.2 字符串的特点

  1. 字符串一旦被赋值,就不能改变。
    注意:这里指的是字符串的内容不能改变,而不是引用不能改变。
    在这里插入图片描述
  • 字符串如果是变量相加,先开空间,在拼接。
  • 字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。
  1. 字面值作为字符串对象和通过构造方法创建对象的不同
    String s = new String(“hello”);和String s = "hello"的区别?
    答:前者会创建2个对象,后者创建1个对象。
    在这里插入图片描述
  2. String的equals方法
    ==:比较引用类型比较的是地址值是否相同
    equals:比较引用类型默认也是比较地址值是否相同,而String类重写了equals()方法,比较的是内容是否相同。

4.3 String类的判断功能

String类的判断功能:

boolean equals(Object obj):比较字符串的内容是否相同,区分大小写
boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
boolean contains(String str):判断大字符串中是否包含小字符串
boolean startsWith(String str):判断字符串是否以某个指定的字符串开头
boolean endsWith(String str):判断字符串是否以某个指定的字符串结尾
boolean isEmpty():判断字符串是否为空。

注意:
字符串内容为空和字符串对象为空。
String s = “”;
String s = null;

4.4 String类的获取功能

 * int length():获取字符串的长度。
 * char charAt(int index):获取指定索引位置的字符
 * int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。
 * 		为什么这里是int类型,而不是char类型?
 * 		原因是:'a'97其实都可以代表'a'
 * int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引。
 * int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
 * int indexOf(String str,int fromIndex):返回指定字符串在此字符串中从指定位置后第一次出现处的索引。
 * String substring(int start):从指定位置开始截取字符串,默认到末尾。
 * String substring(int start,int end):从指定位置开始到指定位置结束截取字符串。

4.5 String的转换功能

 * byte[] getBytes():把字符串转换为字节数组。
 * char[] toCharArray():把字符串转换为字符数组。
 * static String valueOf(char[] chs):把字符数组转成字符串。
 * static String valueOf(int i):int类型的数据转成字符串。
 * 		注意:String类的valueOf方法可以把任意类型的数据转成字符串。
 * String toLowerCase():把字符串转成小写。
 * String toUpperCase():把字符串转成大写。
 * String concat(String str):把字符串拼接。

4.6 String的其他功能

 * 替换功能:
 * String replace(char old,char new)
 * String replace(String old,String new)
 *
 * 去除字符串两空格	
 * String trim()
 * 
 * 按字典顺序比较两个字符串  
 * int compareTo(String str)
 * int compareToIgnoreCase(String str)

4.7 字符串案例

A:模拟用户登录
B:字符串遍历
C:统计字符串中大写,小写及数字字符的个数
D:把字符串的首字母转成大写,其他小写
E:把int数组拼接成一个指定格式的字符串
F:字符串反转
G:统计大串中小串出现的次数

5 正则表达式(理解)

正则表达式:符合一定规则的字符串。

5.1 常见规则

	A:字符
			x 字符 x。举例:'a'表示字符a
			\\ 反斜线字符。
			\n 新行(换行)符 ('\u000A') 
			\r 回车符 ('\u000D')
		
	B:字符类
		[abc] a、b 或 c(简单类) 
		[^abc] 任何字符,除了 a、b 或 c(否定) 
		[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围) 
		[0-9] 0到9的字符都包括
		
	C:预定义字符类
		. 任何字符。我的就是.字符本身,怎么表示呢? \.
		\d 数字:[0-9]
		\w 单词字符:[a-zA-Z_0-9]
			在正则表达式里面组成单词的东西必须有这些东西组成

	D:边界匹配器
		^ 行的开头 
		$ 行的结尾 
		\b 单词边界
			就是不是单词字符的地方。
			举例:hello world?haha;xixi
		
	E:Greedy 数量词 
		X? X,一次或一次也没有
		X* X,零次或多次
		X+ X,一次或多次
		X{n} X,恰好 n 次 
		X{n,} X,至少 n 次 
		X{n,m} X,至少 n 次,但是不超过 m 次 

5.2 常见功能

	A:判断功能
		String类的public boolean matches(String regex)
	B:分割功能
		String类的public String[] split(String regex)
	C:替换功能
		String类的public String replaceAll(String regex,String replacement)
	D:获取功能
		Pattern和Matcher
			Pattern p = Pattern.compile("a*b");
			Matcher m = p.matcher("aaaaab");
			
			find():查找存不存在
			group():获取刚才查找过的数据

5.3 常见案例

案例:
A:判断电话号码和邮箱(matches)

String phone = sc.nextLine();
//定义手机号码的规则
String regex = "1[38]\\d{9}";
//调用功能,判断即可
boolean flag = phone.matches(regex);

//定义邮箱的规则
//String regex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]{2,6}(\\.[a-zA-Z_0-9]{2,3})+";
String regex = "\\w+@\\w{2,6}(\\.\\w{2,3})+";
//调用功能,判断即可
boolean flag = email.matches(regex);

B:按照不同的规则分割数据(split)
C:把论坛中的数字替换为*(replaceAll)

D:获取字符串中由3个字符组成的单词

/*
获取功能
Pattern和Matcher类的使用
模式和匹配器的基本使用顺序
*/
public static void main(String[] args) {
	// 定义字符串
	String s = "da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?";
	// 规则
	String regex = "\\b\\w{3}\\b";

	// 把规则编译成模式对象
	Pattern p = Pattern.compile(regex);
	// 通过模式对象得到匹配器对象
	Matcher m = p.matcher(s);
	
	// 调用匹配器对象的功能
	// 通过find方法就是查找有没有满足条件的子串
	// public boolean find()
	// boolean flag = m.find();
	// System.out.println(flag);
	// // 如何得到值呢?
	// // public String group()
	// String ss = m.group();
	// System.out.println(ss);
	//
	// // 再来一次
	// flag = m.find();
	// System.out.println(flag);
	// ss = m.group();
	// System.out.println(ss);

	while (m.find()) {
		System.out.println(m.group());
	}

	// 注意:一定要先find(),然后才能group()
	// IllegalStateException: No match found
	// String ss = m.group();
	// System.out.println(ss);
}

6 Math类

* 成员变量:
* 		public static final double PI
* 		public static final double E
* 成员方法:
* 		public static int abs(int a):绝对值
*		public static double ceil(double a):向上取整
*		public static double floor(double a):向下取整
*		public static int max(int a,int b):最大值 (min自学)
*		public static double pow(double a,double b):a的b次幂
*		public static double random():随机数 [0.0,1.0)
*		public static int round(float a) 四舍五入(参数为double的自学)
*		public static double sqrt(double a):正平方根

案例:
需求:请设计一个方法,可以实现获取任意范围内的随机数。

/*
 * 写一个功能 两个明确: 返回值类型:int 参数列表:int start,int end
 */
public static int getRandom(int start, int end) {
	// 回想我们讲过的1-100之间的随机数
	// int number = (int) (Math.random() * 100) + 1;
	// int number = (int) (Math.random() * end) + start;
	// 发现有问题了,怎么办呢?
	int number = (int) (Math.random() * (end - start + 1)) + start;
	return number;
}

7 Random(理解)

Random:产生随机数的类

* 构造方法:
* 		public Random():没有给种子,用的是默认种子,是当前时间的毫秒值,每次产生的随机数不同
*		public Random(long seed):给出指定的种子,每次种子相同,随机数就相同
*
* 成员方法:
* 		public int nextInt():返回的是int范围内的随机数
*		public int nextInt(int n):返回的是[0,n)范围的内随机数
public class RandomDemo {
	public static void main(String[] args) {
		// 创建对象
		// Random r = new Random();
		Random r = new Random(1111);

		for (int x = 0; x < 10; x++) {
			// int num = r.nextInt();
			int num = r.nextInt(100) + 1;
			System.out.println(num);
		}
	}
}

8 System(掌握)

System类包含一些有用的类字段和方法。它不能被实例化

 * 方法:
 * 		public static void gc():运行垃圾回收器。 
 *		public static void exit(int status):终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非 0 的状态码表示异常终止。 
 *		public static long currentTimeMillis():返回以毫秒为单位的当前时间(可以用来统计程序的运行时间)
 *		public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
 *				从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。

举个例子:

// 定义数组
int[] arr = { 11, 22, 33, 44, 55 };
int[] arr2 = { 6, 7, 8, 9, 10 };

// 请大家看这个代码的意思
System.arraycopy(arr, 1, arr2, 2, 2);

System.out.println(Arrays.toString(arr2));
//结果:[6, 7, 22, 33, 10]

9 BigInteger(理解)

BigInteger:可以让超过Integer范围内的数据进行运算

// 通过大整数来创建对象
BigInteger bi = new BigInteger("2147483648");
System.out.println("bi:" + bi);
//一些方法
 * public BigInteger add(BigInteger val):* public BigInteger subtract(BigInteger val):* public BigInteger multiply(BigInteger val):* public BigInteger divide(BigInteger val):* public BigInteger[] divideAndRemainder(BigInteger val):返回商和余数的数组

10 BigDecimal(理解)

由于在运算的时候,float类型和double很容易丢失精度。所以,为了能精确的表示、计算浮点数,Java提供了BigDecimal。
BigDecimal类:不可变的、任意精度的有符号十进制数,可以解决数据丢失问题。

 * 构造方法:
 * public BigDecimal(String val)
 * 
 * public BigDecimal add(BigDecimal augend)
 * public BigDecimal subtract(BigDecimal subtrahend)
 * public BigDecimal multiply(BigDecimal multiplicand)
 * public BigDecimal divide(BigDecimal divisor)
 * public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode):商,几位小数,如何舍取
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值