常用类

53 阅读10分钟

1. 枚举

枚举可以用于规范属性的值,使用enum声明类

package com.qfedu.test1;

public enum Week {
	MON,TUE,WED,THUR,FRI,SAT,SUN
}
package com.qfedu.test1;
/**
 * 	使用枚举作为参数传入switch 实现一周中每天的打印
 * @author WHD
 *
 */
public class TestWeek {
	public static void main(String[] args) {
		Week day = Week.SAT;
		switch (day) {
		case MON:
			System.out.println("周一");
			break;
		case TUE:
			System.out.println("周2");
			break;
		case WED:
			System.out.println("周3");
			break;
		case THUR:
			System.out.println("周4");
			break;
		case FRI:
			System.out.println("周5");
			break;
		case SAT:
			System.out.println("周6");
			break;
		case SUN:
			System.out.println("周日");
			break;
		default:
			System.out.println("一周只有七天");
			break;
		}
		printWeek(Week.MON);
	}
	
	public static void printWeek(Week day) {
		switch (day) {
		case MON:
			System.out.println("周一");
			break;
		case TUE:
			System.out.println("周2");
			break;
		case WED:
			System.out.println("周3");
			break;
		case THUR:
			System.out.println("周4");
			break;
		case FRI:
			System.out.println("周5");
			break;
		case SAT:
			System.out.println("周6");
			break;
		case SUN:
			System.out.println("周日");
			break;
		default:
			System.out.println("一周只有七天");
			break;
		}
	}
}

2. 包装类

每个基本数据类型 都有一个对应的包装类

byte short int long float double boolean char

Byte Short Integer Long Float Double Boolean Character

2.1 包装类构造方法

所有包装类都可将与之对应的基本数据类型作为参数,来构造它们的实例

除Character类外,其他包装类可将一个字符串作为参数构造它们的实例

package com.qfedu.test2;
/**
 * 	每个基本数据类型 都有一个对应的包装类
 * 	byte 	short 	int 	long 	float 	double 	boolean char
 * 	Byte 	Short 	Integer	Long 	Float 	Double 	Boolean Character 
 * @author WHD
 *
 */
public class Test1 {
	public static void main(String[] args) {
		Byte b1 = new Byte((byte)20);
		byte b = 23;
		Byte b2 = new Byte(b);
		Byte b3 = new Byte("120");
		System.out.println(b3);
		
		Short s1 = new Short((short)220);
		Short s2 = new Short("220");
		System.out.println(s1);
		
		Integer i1 = new Integer(200);
		Integer i2 = new Integer("223");
		System.out.println(i2);
		
		Long l1 = new Long(200);
		Long l2 = new Long("220");
		System.out.println(l1);
		
		Float f1 = new Float(3.14F);
		Float f2 = new Float(3.14);
		Float f3 = new Float("3.14");
		System.out.println(f1);
		
		Double d1 = new Double(20);
		Double d2 = new Double("20");
		
		// Boolean类 传入字符串 不区分大小写 如果内容不为true  则为false
		Boolean bl1 = new Boolean(true);
		Boolean bl2 = new Boolean("tRuE");
		Boolean bl3 = new Boolean("abc");
		System.out.println(bl1);
		
		Character ch1 = new Character('A');
		System.out.println(ch1);
	}
}

2.2 包装类转换为基本数据类型

xxxValue() 将包装类转换为基本数据类型

每个包装类都提供了这样的一个方法

Boolean类构造方法参数为String类型时,若该字符串内容为true(不考虑大小写),则该Boolean对象表示true,否则表示false
当Number包装类构造方法参数为String 类型时,字符串不能为null,且该字符串必须可解析为相应的基本数据类型的数据,否则运行不通过,运行时会抛出NumberFormatException异常

package com.qfedu.test3;
/**
 * 	xxxValue() 将包装类转换为基本数据类型
 * 	每个包装类都提供了这样的一个方法 
 * @author WHD
 *
 */
public class Test1 {
	public static void main(String[] args) {
		Byte b1 = new Byte("120");
		byte b = b1.byteValue(); // shift + alt + L 生成对应的变量接收方法返回值
		System.out.println(b);
		
		Short s1 = new Short("200");
		short s2 = s1.shortValue();
		System.out.println(s2);
		
		Integer i1 = new Integer("200");
		int i2 = i1.intValue();
		System.out.println(i2);
		
		Long l1 = new Long(200);
		long l2 = l1.longValue();
		System.out.println(l2);
		
		Float f1 = new Float(3.14F);
		float f2 = f1.floatValue();
		System.out.println(f2);
		
		Double d1 = new Double(200);
		double d2 = d1.doubleValue();
		System.out.println(d2);
		
		Boolean bl1 = new Boolean(false);
		boolean bl2 = bl1.booleanValue();
		System.out.println(bl2);
		
		Character ch1 = new Character('A');
		char ch2 = ch1.charValue();
		System.out.println(ch2);
	}
}

2.3 基本数据类型转换为包装类

valueOf()  每个包装类都提供了valueOf方法 用于将基本数据类型转换为包装类

package com.qfedu.test3;
/**
 * 	valueOf()  每个包装类都提供了valueOf方法 用于将基本数据类型转换为包装类
 * 
 * @author WHD
 *
 */
public class Test2 {
	public static void main(String[] args) {
		Byte b1 = Byte.valueOf((byte)20);
		Byte b2 = Byte.valueOf("20");
		System.out.println(b1 + "---" + b2);
		
		Short s1 = Short.valueOf((short)200);
		System.out.println(s1);
		
		Short s2 = Short.valueOf("200");
		System.out.println(s2);
		
		Integer i1 = Integer.valueOf(200);
		Integer i2 = Integer.valueOf("230");
		
		System.out.println(i1);
		System.out.println(i2);
		
		Long l1 = Long.valueOf(200);
		Long l2 = Long.valueOf("230");
		System.out.println(l1);
		System.out.println(l2);
		
		Float f1 = Float.valueOf(3.14F);
		System.out.println(f1);
		Float f2 = Float.valueOf("20.3");
		System.out.println(f2);
		
		Double d1 = Double.valueOf(200);
		Double d2 =Double.valueOf("2300");
		
		System.out.println(d1 + "---" + d2);
		
		Character ch1 = Character.valueOf('A');
		System.out.println(ch1);

		Boolean bl1 = Boolean.valueOf(false);
		System.out.println(bl1);
		
		Boolean bl2 = Boolean.valueOf("abc");
		System.out.println(bl2);
	}
}

2.4 基本类型转为字符串

toString():以字符串形式返回包装对象表示的基本类型数据(基本类型->字符串)

package com.qfedu.test4;
/**
 * 	toString():以字符串形式返回包装对象表示的基本类型数据(基本类型->字符串)
 * @author WHD
 *
 */
public class Test1 {
	public static void main(String[] args) {
		int a = 20;
		System.out.println( a +  "");
		
		String str1 = Byte.toString((byte)20);
		System.out.println(str1.length());
		
		String str2 = Short.toString((short)200);
		System.out.println(str2);
		
		String str3 = Integer.toString(200);
		System.out.println(str3);
		
		String str4 = Long.toString(200);
		System.out.println(str4);
		
		String str5 = Float.toString(3.14F);
		System.out.println(str5.length());
		
		String str6 = Double.toString(3200);
		System.out.println(str6);
		
		String str7 = Boolean.toString(false);
		System.out.println(str7);
		
		String str8 = Character.toString('A');
		System.out.println(str8);
	}
}

2.5 字符串转换为基本数据类型

parseXXX():把字符串转换为相应的基本数据类型数据(Character除外)

字符串->基本类型)

package com.qfedu.test4;
/**
 * 	parseXXX():把字符串转换为相应的基本数据类型数据(Character除外)
 * 	字符串->基本类型)
 * @author WHD
 *
 */
public class Test2 {
	public static void main(String[] args) {
		byte b1 = Byte.parseByte("23");
		System.out.println(b1);
		
		short s1 = Short.parseShort("230");
		System.out.println(s1);
		
		int i1 = Integer.parseInt("200");
		System.out.println(i1);
		
		long l1 = Long.parseLong("2300");
		System.out.println(l1);
		
		float f1 = Float.parseFloat("23.2");
		System.out.println(f1);
		
		double d1 = Double.parseDouble("231");
		System.out.println(d1);
		
		boolean bl1 = Boolean.parseBoolean("truE");
		System.out.println(bl1);
	}
}

2.6 自动装箱和拆箱

装箱和拆箱 : 从JDK1.5 开始 允许包装类和基本数据类型 混合使用

装箱:将基本数据类型自动转换为包装类型

拆箱:将包装类型自动转换为基本数据类型

package com.qfedu.test5;
/**
 * 	装箱和拆箱 : 从JDK1.5 开始 允许包装类和基本数据类型 混合使用
 * 	装箱:将基本数据类型自动转换为包装类型
 * 	拆箱:将包装类型自动转换为基本数据类型
 * @author WHD
 *
 */
public class Test1 {
	public static void main(String[] args) {
		Integer i1 = Integer.valueOf(20);
		int i2 = i1.intValue();
		
		Integer i4 = new Integer(20);
		Integer i3 = 20; // 装箱
		
		int i5 = i3; // 拆箱
		
		Byte b1 = 20;
		
		byte b2 = b1;
	}
}

3. Math类

Math类 数学工具类  提供了常用的数学计算方法 和 两个静态常量  E   PI

package com.qfedu.test6;
/**
 * 	Math类 数学工具类  提供了常用的数学计算方法 和 两个静态常量  E   PI
 * @author WHD
 *
 */
public class TestMath {
	public static void main(String[] args) {
		System.out.println(Math.E);//固定值
		System.out.println(Math.PI);//圆周率Π
		
		System.out.println(Math.max(20, 30));//最大值
		System.out.println(Math.min(33, 44));//最小值
		// 面试题笔试题经常出现
		System.out.println(Math.ceil(3.1));//向上取整
		System.out.println(Math.floor(3.6));//向下取整
		System.out.println(Math.round(3.5));//四舍五入
		System.out.println(Math.round(3.4));//四舍五入
		
		System.out.println((int )(Math.random() * 100));//0-100的随机整数,强转为int类型
		
		System.out.println((int )(Math.random() * 50));
		
		System.out.println((int )(Math.random() * 13));
		
		System.out.println((int )(Math.random() * 7));
	}
}

4.Random类

Random类 提供了更为丰富的类型的随机数的获取方式

package com.qfedu.test6;

import java.util.Random;

/**
 * 	Random类 提供了更为丰富的类型的随机数的获取方式
 * @author WHD
 *
 */
public class TestRandom {
	public static void main(String[] args) {
		Random ran1 = new Random();
		System.out.println(ran1.nextBoolean());//随机获得一个布尔类型的值
		System.out.println(ran1.nextDouble());//随机获得double类型的数值
		System.out.println(ran1.nextFloat());//随机获得float类型的数值
		System.out.println(ran1.nextLong());//随机获得long类型的数值
		System.out.println(ran1.nextInt());//随机获得int类型的数值
		System.out.println(ran1.nextInt(55));//随机获得int类型55一下的数值
		
		// 用同一个种子值来初始化两个Random 对象,
		// 然后用每个对象调用相同的方法,得到的随机数也是相同的

		Random ran2 = new Random(11);
		Random ran3 = new Random(11);
		
		System.out.println(ran2.nextInt());
		System.out.println(ran3.nextInt());
	}
}

5.String类常用方法

length() :长度

equals():比较内容

equalsIgnoreCase():忽略大小写比较

toLowerCase():转换为小写

toUpperCase():转换为大写

concat():拼接字符串

indexOf():搜索第一个出现的字符ch(或字符串value),如果没有找到,返回-1

lastIndexOf():搜索最后一个出现的字符ch(或字符串value),如果没有找到,返回-1

substring(int index)提取从位置索引开始的字符串部分

substring(int beginindex, int endindex)提取beginindex和endindex之间的字符串部分

trim()返回一个前后不含任何空格的调用字符串的副本

split()拆分字符串

endsWith() 判断字符串是否以某一个字符串结尾

startsWith()判断字符串是否以某一个字符串开头

replace()替换字符串

6.String类相关面试题

1.1 String底层 实现

String类的底层实现

通过观察源代码,我们发现,String类底层维护的是一个char数组

并且这个数组是使用final修饰的,所以String类的对象是不可变的

也就是说,字符串内容一旦确定是不能发生改变的,任何对字符串改变 的操作都将产生新的字符串

通过以上分析,我们发现,不能对一个字符串内容进行频繁的改动,因为这样会产生很多的字符串

对象,这些对象将占用内存空间

1.2 StringBuffer和StringBuilder区别

StringBuffer  和   StringBuilder的区别?

这两个依然属于字符串对象,只不过内容是可变的

StringBuffer是线程安全的 源自于JDK1.0

StringBuilder线程不安全 源自于 JDK1.5

1.3 为什么不能使用==比较String对象 ?

使用==比较 不能保证内容相同  结果为true

因为如果直接使用=号赋值 字符串对象将存放在 常量池中

第二次赋值相同的内容 会先去常量池中查找是否有相同的内容

如果有 则将之前的地址重新赋值给当前变量  所以使用== 比较为true

如果没有 则将当前内容存放在常量池中

使用new关键字创建字符串对象 每一次都将开辟新的空间 所以使用==比较一定为false

所以推荐使用equals比较字符串  因为equals比较内容

package com.qfedu.test1;
/**
 * 	String类的底层实现
 * 	通过观察源代码,我们发现,String类底层维护的是一个char数组
 * 	并且这个数组是使用final修饰的,所以String类的对象是不可变的
 * 	也就是说,字符串内容一旦确定是不能发生改变的,任何对字符串改变 的操作都将产生新的字符串
 * 
 * 	通过以上分析,我们发现,不能对一个字符串内容进行频繁的改动,因为这样会产生很多的字符串
 * 	对象,这些对象将占用内容空间
 * 
 * 	场景:比如你在电商网站搜索产品
 * 
 * 	StringBuffer  和   StringBuilder的区别?
 * 		这两个依然属于字符串对象,只不过内容是可变的
 * 		StringBuffer是线程安全的 源自于JDK1.0
 * 		tringBuilder线程不安全 源自于 JDK1.5
 * 
 * 
 * 	为什么不能使用==比较String对象 ?
 * 	使用==比较 不能保证内容相同  结果为true
 * 		因为如果直接使用=号赋值 字符串对象将存放在 常量池中
 * 		第二次赋值相同的内容 会先去常量池中查找是否有相同的内容 
 * 		如果有 则将之前的地址重新赋值给当前变量  所以使用== 比较为true
 * 		如果没有 则将当前内容存放在常量池中
 * 
 * 		使用new关键字创建字符串对象 每一次都将开辟新的空间 所以使用==比较一定为false
 * 
 * 		所以使用equals比较字符串  因为equals比较内容
 * @author WHD
 *
 */
public class TestString {
	public static void main(String[] args) {
		String a = "abc";
		String b = "abcd";
		String f = "abcd";
		System.out.println(a == b);
		
		String c = new String("abc");
		String d = new String("abc");
		System.out.println(c == d);
        
		System.out.println("-------------------------------");
		
		String str1 = "abc";
		str1 += "hello";
		str1 += "hhh";
		str1 += "jjj";
		str1 += "kkk";
		
		StringBuilder sb1 = new StringBuilder();
		sb1.append(true);
		sb1.append('a');
		sb1.append(200);
		
		System.out.println(sb1);
		System.out.println(sb1.length());
		
		System.out.println(sb1.indexOf("r"));
		
		System.out.println(sb1.delete(0, 3)); // 包前不包后
		
		sb1.insert(0, false);
		
		System.out.println(sb1);
	}
}

7.包装类面试题

==和equals的区别?

==比较基本数据类型 比较值

==比较引用数据类型  比较地址

equals也是比较地址

Short Integer Long Character 包装类直接使用=号赋值

取值范围在-128 ~ 127 以内 不会产生新对象 == 为true

超出范围 会new新的对象 == 为false

package com.qfedu.test1;
/**
 * 	==和equals的区别?
 * 	==比较引用数据类型  比较地址 
 * 
 * 	Short Integer Long Character 包装类直接使用=号赋值
 * 	取值范围在-128 ~ 127 以内 不会产生新对象 == 为true
 * 	超出范围 会new新的对象 == 为false
 * @author WHD
 *
 */
public class Test1 {
	public static void main(String[] args) {
		Integer i1 = 200; // new Integer(200);
		Integer i2 = 200; // new Integer(200);
		System.out.println(i1 == i2); // false
		
		Integer i3 = 127;
		Integer i4 = 127;
		System.out.println(i3 == i4); // true
		// 当直接使用等号给包装类对象赋值,取值范围在 byte的取值范围的时候  
		// 两个对象 值相同 ==比较为true,超过这个范围为false
		// 当你直接使用=号给包装类赋值 如果取值范围在-128 ~ 127 将从缓存数组中取值对应的元素
		// 不会new新的对象 如果超出这个范围 将new新的对象 
		
		Integer i5 = new Integer(100);
		Integer i6 = new Integer(100);
		System.out.println(i5 == i6); // false
		
		Short s1 = 120;
		Short s2 = 120;
		System.out.println(s1 == s2);
		
		Short s3 = 220;
		Short s4 = 220;
		System.out.println(s3 == s4);
		
		Long l1 = 120L;
		Long l2 = 120L;
		System.out.println(l1 == l2);
		
		Character ch1 = 100;
		Character ch2 = 100;
		System.out.println(ch1 == ch2);
		
		Character ch3 = 200;
		Character ch4 = 200;
		System.out.println(ch3 == ch4);
	}
}