CHAPTER-12 集合泛型实用类

集合泛型实用类



枚举

枚举指由一组固定的常量组成的类型

[Modifier]enum enumName{
    enumContantName1
    [,enumContantName2...[;]]
    //[field,method]
}

-性别枚举

public enum Genders{
    Male,Female
}

-枚举类型的变量

public class Student{
    public Genders sex;
}

特点

类型安全、易于输入、代码清晰

Java API

常用Java API

java.lang ( Enum、包装类、Math、String、StringBuffer、System…)

java.util

java.io

java.sql

包装类

包装类把基本类型数据转换为对象

每个基本类型在java.lang包中都有一个相应的包装类

包装类的作用

提供了一系列使用的方法

集合不允许存放基本数据类型数据,存放数字时,要用包装类型

在这里插入图片描述

包装类的构造方法

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

(1)public Type(type value)

Integer i = new Integer(1);

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

(3)public Type(String value)

Integer i = new Integer("123");
注意事项

1.Boolean类构造方法参数为String类型时,若该字符串内容为true(不考虑大小写),则该Boolean对象表示true,否则表示false

2.当Number包装类构造方法参数为String类型时,字符串不能为null,且该字符串必须可解析为相应的基本数据类型的数据,否则编译不通过,运行时会抛出NumberFormatException异常

常用方法

在这里插入图片描述

XXXValue(): 包装类转换成基本类型
Integer integerID = new Integer(25);
int intID = integerID.intValue();
toString(): 以字符串形式返回包装对象表示的基本类型数据(基本类型->字符串)
String sex = Character.toString('男');
String id = Integer.toString(25);
String sex = '男'+"";
String id = 25+"";
parseXXX(): 把字符串转换为相应的基本数据类型数据(Character除外)(字符串->基本类型)
int num = Integer.parseInt("36");
boolean bool = Boolean.parseBoolean("false");

以上为

public static type parseType(String type)
valueOf()

(1)所有包装类都有如下方法(基本类型->包装类)

public static Type valueOf(type value)

Integer intValue = Integer.valueOf(21);

(2)除Character类外,其他包装类都有如下方法(字符串->包装类)

public static Type valueOf(String s)

Integer intValue = Integer.valueOf("21");
装箱和拆箱

基本类型和包装类的自动转换

Integer intObject = 5;
int intValue = intObject;

装箱:基本类型转换为包装类的对象

拆箱:包装类对象转换为基本类型的值

特点

1.JDK1.5后,允许基本数据类型和包装类型进行混合数学运算

2.包装类并不是用来取代基本数据类型的

在基本数据类型需要用对象表示时使用

Math类

java.lang.Math提供了常用的数学运算方法和两个静态常量E(自然对数的底数)和PI(圆周率)

Math.abs(-3.5); //返回3.5
Math.max(2.5,90.5); //返回90.5
int random = (int)(Math.random()*10); //生成一个0-9之间的随机数

Random类

生成随机数的其他方法

java.util.Random类

Random rand = new Random(); //创建一个Random对象
for(int i = 0;i < 20;i++){
    int num = rand.nextInt(10);//返回下一个伪随机数,整形的
    System.out.println("第"+(i+1)+"个随机数是:"+num);
}

用同一个种子来初始化两个Random对象,然后用每个对象调用相同的方法,得到的随机数也是相同的

String类

生活中的字符串

频繁使用的字符串

​ “欢迎进入”

​ “Hello World”

​ “www.baidu.cn”

使用String对象存储字符串

String s = "Hello World";
String s = new String();
String s = new String("Hell World");

String类位于java.lang包中,具有丰富的方法

计算字符串的长度、比较字符串、连接字符串、提取字符串

length()方法

String类提供了length(),确定字符串的长度

返回字符串中 的字符数

equals()方法

String类提供了equals()方法,比较存储在两个字符串对象的内容是否一致

equals()方法比较原理

equals():检查组成字符串内容的字符是否完全一致

"=="和equals()有什么区别

==:判断两个字符在内存中的地址,即判断是否是同一个字符串对象

字符串比较的其他方法

equalsIgnoreCase()方法

if(password.length() < 7 ) {
			System.out.println("密码长度小于6位数,请重新输入!");
		}
		if(userName.equalsIgnoreCase("Tom") && password.equalsIgnoreCase("1234567")) {
			System.out.println("登陆成功!");
		}else {
			System.out.println("登录失败!");
		}

toLowerCase()

if(password.length() < 7 ) {
			System.out.println("密码长度小于6位数,请重新输入!");
		}
		if(userName.toLowerCase().equals(password) && password.equals("1234567")) {
			System.out.println("登陆成功!");
		}else {
			System.out.println("登录失败!");
		}

toUpperCase()方法

if(password.length() < 7 ) {
			System.out.println("密码长度小于6位数,请重新输入!");
		}
		if(userName.toUpperCase().equals(userName) && password.equals("1234567")) {
			System.out.println("登陆成功!");
		}else {
			System.out.println("登录失败!");
		}

字符串连接

方法一:使用"+"

方法二:使用String类的concat()方法

String s1 = "a"+"b";
s1 = s1.concat("ddd");
System.out.println(s1);
输出结果:
abddd

字符串常用提取方法

方法名说明
public int indexOf(int ch)搜索第一个出现的字符ch(或字符串value),如果没有找到,返回-1
public int indexOf(String value)搜索第一个出现的字符ch(或字符串value),如果没有找到,返回-1
public int lastIndexOf(int ch)搜索最后一个出现的字符ch(或字符串value),如果没有找到,返回-1
public int lastIndexOf(String value)搜索最后一个出现的字符ch(或字符串value),如果没有找到,返回-1
public String substring(int index)提取从位置索引开始的字符串部分
public String substring(int beginindex,int endindex)提取beginindex和endindex之间的字符串部分
public String trim()返回一个前后不含任何空格的调用字符串的副本

Calender类

获取当前日期

java.util.Date类:表示日期和时间

提供操作日期和时间各组成部分的方法

如何格式化日期

java.text.SimpleDateFormat类:用于定制日期时间的格式

//创建日期对象
Date date = new Date();
//定制日期格式
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String now = formater.format(date);
System.out.println(now);

Calendar类

抽象类,java.util.Calendar

用于设置和获得日趋/时间数据的特定部分

Calendar类提供一些方法和静态字段来操作日历

方法或属性说明
int get(int field)返回给定日历字段的值
MONTH指示月
DAY_OF_MONTH指示一个月中的某天
DAY_OF_WEEK指示一个星期中的某天

StringBuffer类

StringBuffer

对字符串频繁修改(如字符串连接)时,使用StringBuffer类可以大大提高程序执行效率

声明

StringBuffer strb = new StringBuffer();
StringBuffer strb = new StringBuffer("aaa");

使用

sb.toString();//转化为String类型
sb.append("**");//追加字符串
sb.insert(1,"**");//插入字符串

String类 VS StringBuffer类

String是不可变对象

1.经常改变内容的字符串最好不要使用String

2.StringBuffer是可变的字符串

3.字符串经常改变的情况可使用StringBuffer,更高效

4.JDK5.0后提供了StringBuilder,等价于StringBuffer



案例

案例一

需求说明:

为大数据岗位课程三个学习阶段定义枚举:L1、L2、L3,分别表示第一、二、三阶段

编程输出每个单元的学习目标

L1:大数据开发工程师

L2:大数据挖掘工程师

L3:大数据架构师

-测试类

package hw1;

public class Test {
	public static void main(String[] args) {
		Course c = Course.L1;
		switch(c) {
			case L1:
				System.out.println("大数据开发工程师");
				break;
			case L2:
				System.out.println("大数据挖掘工程师");
				break;
			case L3:
				System.out.println("大数据架构师");
				break;
		}
	}
}

-枚举类

package hw1;

public enum Course {
	L1,L2,L3
}

案例二

在这里插入图片描述

-测试类

package hw2;

import java.util.*;

public class Test {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入用户名:  ");
		String userName = sc.next();
		System.out.print("请输入密码:  ");
		String password = sc.next();
		if(password.length() < 7 ) {
			System.out.println("密码长度不能小于6位!");
		}else{
			System.out.println("注册成功!");
		}
	}
}

-管理类

package hw2;
/**
 * 管理类
 * @author admin
 *
 */
public class ManagerSys {
	private String userName;//用户名
	private String password;//密码
	public ManagerSys(String userName, String password) {
		super();
		this.userName = userName;
		this.password = password;
	}
	public ManagerSys() {
		super();
		// TODO Auto-generated constructor stub
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "ManagerSys [userName=" + userName + ", password=" + password + "]";
	}

}

案例三

在这里插入图片描述

-测试类

package hw3;

import java.util.*;

public class Test {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入用户名:  ");
		String userName = sc.next();
		System.out.print("请输入密码:  ");
		String password = sc.next();
		if(password.length() < 7 ) {
			System.out.println("密码长度小于6位数,请重新输入!");
		}
		if(userName.equalsIgnoreCase("Tom") && password.equalsIgnoreCase("1234567")) {
			System.out.println("登陆成功!");
		}else {
			System.out.println("登录失败!");
		}
	}
}

-管理类

package hw3;
/**
 * 管理类
 * @author admin
 *
 */
public class ManagerSys {
	private String userName;//用户名
	private String password;//密码
	public ManagerSys(String userName, String password) {
		super();
		this.userName = userName;
		this.password = password;
	}
	public ManagerSys() {
		super();
		// TODO Auto-generated constructor stub
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "ManagerSys [userName=" + userName + ", password=" + password + "]";
	}

}

案例四

在这里插入图片描述

-测试类

package hw4;

import java.util.*;

public class Test {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入用户名:  ");
		String userName = sc.next();
		System.out.print("请输入密码:  ");
		String password = sc.next();
		/**
		 *equalsIgnoreCase()方法 忽略大小写 
		 */
		if(password.length() < 7 ) {
			System.out.println("密码长度小于6位数,请重新输入!");
		}
		if(userName.equalsIgnoreCase("Tom") && password.equalsIgnoreCase("1234567")) {
			System.out.println("登陆成功!");
		}else {
			System.out.println("登录失败!");
		}
		/**
		 * toLowerCase()方法
		 */
		if(password.length() < 7 ) {
			System.out.println("密码长度小于6位数,请重新输入!");
		}
		if(userName.toLowerCase().equals(password) && password.equals("1234567")) {
			System.out.println("登陆成功!");
		}else {
			System.out.println("登录失败!");
		}
		/**
		 * toUpperCase()方法
		 */
		if(password.length() < 7 ) {
			System.out.println("密码长度小于6位数,请重新输入!");
		}
		if(userName.toUpperCase().equals(userName) && password.equals("1234567")) {
			System.out.println("登陆成功!");
		}else {
			System.out.println("登录失败!");
		}
	}
}

-管理类

package hw4;
/**
 * 管理类
 * @author admin
 *
 */
public class ManagerSys {
	private String userName;//用户名
	private String password;//密码
	public ManagerSys(String userName, String password) {
		super();
		this.userName = userName;
		this.password = password;
	}
	public ManagerSys() {
		super();
		// TODO Auto-generated constructor stub
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "ManagerSys [userName=" + userName + ", password=" + password + "]";
	}

}

案例五

在这里插入图片描述

-测试类

package hw5;

import java.util.*;

public class Test {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("**欢迎进入注册系统**");
		System.out.println();
		do{
			System.out.print("请输入用户名:  ");
			String userName = sc.next();
			System.out.print("请输入密码:  ");
			String password = sc.next();
			System.out.print("请再次输入密码: ");
			String pwd = sc.next();
			if(userName.length() <3 || password.length() <6 || pwd.length() < 6) {
				System.out.println("用户名长度不能小于3,密码长度不能小于6!");
			}else if(password.equals(pwd)){
				System.out.println("注册成功!请牢记用户名和密码.");
				break;
			}
			else {
				System.out.println("两次输入的密码不相同!");
			}
		}while(true);
	}
}

-管理类

package hw5;
/**
 * 管理类
 * @author admin
 *
 */
public class ManagerSys {
	private String userName;//用户名
	private String password;//密码
	public ManagerSys(String userName, String password) {
		super();
		this.userName = userName;
		this.password = password;
	}
	public ManagerSys() {
		super();
		// TODO Auto-generated constructor stub
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "ManagerSys [userName=" + userName + ", password=" + password + "]";
	}

}

案例六

在这里插入图片描述

-测试类

package hw6;

import java.util.*;

public class Test {
	public static void main(String[] args) {
		System.out.println("--欢迎进入作业提交系统--");
		Scanner sc = new Scanner(System.in);
		do {
			System.out.print("请输入Java文件名:");
			String fileName = sc.next();
			System.out.print("请输入你的邮箱:");
			String emailAdd = sc.next();
			String suffix = fileName.substring(fileName.length()-5);
			int firstIndex = emailAdd.indexOf("@");
			int secondIndex = emailAdd.indexOf(".");
			if(suffix.equals(".java") && ( secondIndex >firstIndex )) {
				System.out.println("文件名正确,E-mail正确");
				System.out.println("作业提交成功!");
			}else {
				System.out.println("E-mail无效。");
				System.out.println("作业提交失败!");
				
			}
			break;
		}while(true);
		
	}
}

案例七

在这里插入图片描述

-测试类

package hw7;

public class Test {
	public static void main(String[] args) {
		String poem = "长亭外 古道边 芳草碧连天 晚风扶 柳笛声残 夕阳山外山";
		System.out.println("***原歌词格式***");
		System.out.println("长亭外 古道边 芳草碧连天 晚风扶 柳笛声残 夕阳山外山");
		System.out.println();
		System.out.println("***拆分后歌词格式***");
		String[] showPoem = poem.split(" ");//切割
		for(String p : showPoem) {
			System.out.println(p);
		}
	}
}

案例八

在这里插入图片描述

-测试类

package hw8;

import java.util.Scanner;

public class Test {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入一个字符串:");
		String s = sc.next();
		System.out.print("请输入要查找的字符:");
		String check = sc.next();
		int all = 0;
		for(int i = 0,index = 0;i<s.length();i++) {
			index = s.indexOf(check, index);
			if(index == -1) {
				System.out.println("查询失败!");
				break;
			}else if(index >= 0) {
				index +=1;
				all++;
			}
		}
		System.out.println("“"+s+"”"+"中包含"+all+"个“"+check+"”。");
	}
}

案例九

日期操作

需求说明:

1.获取当前时间,使用SimpleDateFormat以"年-月-日"方式显示

2.计算2020年4月6日是一年中的第几星期

package hw9;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Test {
	public static void main(String[] args) {
		Date d = new Date();
		System.out.println(d);
		System.out.println("--------------");
		//获取当前时间,以 年-月-日 显示
		SimpleDateFormat ymd = new SimpleDateFormat("YYYY-MM-dd");
		String s = ymd.format(d);
		System.out.println(s);
		System.out.println("--------------");
		//计算2020年4月6日是一年中的几个星期
		Calendar m = Calendar.getInstance();
		m.set(2020,4,6);
		System.out.println(m.get(Calendar.WEEK_OF_YEAR));
	}
}

check, index);
if(index == -1) {
System.out.println(“查询失败!”);
break;
}else if(index >= 0) {
index +=1;
all++;
}
}
System.out.println("“"+s+"”"+“中包含”+all+“个“”+check+"”。");
}
}




### 案例九

日期操作

需求说明:

1.获取当前时间,使用SimpleDateFormat以"年-月-日"方式显示

2.计算2020年4月6日是一年中的第几星期

```JAVA
package hw9;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Test {
	public static void main(String[] args) {
		Date d = new Date();
		System.out.println(d);
		System.out.println("--------------");
		//获取当前时间,以 年-月-日 显示
		SimpleDateFormat ymd = new SimpleDateFormat("YYYY-MM-dd");
		String s = ymd.format(d);
		System.out.println(s);
		System.out.println("--------------");
		//计算2020年4月6日是一年中的几个星期
		Calendar m = Calendar.getInstance();
		m.set(2020,4,6);
		System.out.println(m.get(Calendar.WEEK_OF_YEAR));
	}
}
Java泛型Java 5引入的新特性,可以提高代码的可读性和安全性,降低代码的耦合度。泛型是将型参数化,实现代码的通用性。 一、泛型的基本语法 在声明、接口、方法时可以使用泛型泛型的声明方式为在名、接口名、方法名后面加上尖括号<>,括号中可以声明一个或多个型参数,多个型参数之间用逗号隔开。例如: ```java public class GenericClass<T> { private T data; public T getData() { return data; } public void setData(T data) { this.data = data; } } public interface GenericInterface<T> { T getData(); void setData(T data); } public <T> void genericMethod(T data) { System.out.println(data); } ``` 其中,`GenericClass`是一个泛型,`GenericInterface`是一个泛型接口,`genericMethod`是一个泛型方法。在这些声明中,`<T>`就是型参数,可以用任何字母代替。 二、泛型的使用 1. 泛型的使用 在使用泛型时,需要在名后面加上尖括号<>,并在括号中指定具体的型参数。例如: ```java GenericClass<String> gc = new GenericClass<>(); gc.setData("Hello World"); String data = gc.getData(); ``` 在这个例子中,`GenericClass`被声明为一个泛型,`<String>`指定了具体的型参数,即`data`字段的型为`String`,`gc`对象被创建时没有指定型参数,因为编译器可以根据上下文自动推断出型参数为`String`。 2. 泛型接口的使用 在使用泛型接口时,也需要在接口名后面加上尖括号<>,并在括号中指定具体的型参数。例如: ```java GenericInterface<String> gi = new GenericInterface<String>() { private String data; @Override public String getData() { return data; } @Override public void setData(String data) { this.data = data; } }; gi.setData("Hello World"); String data = gi.getData(); ``` 在这个例子中,`GenericInterface`被声明为一个泛型接口,`<String>`指定了具体的型参数,匿名内部实现了该接口,并使用`String`作为型参数。 3. 泛型方法的使用 在使用泛型方法时,需要在方法名前面加上尖括号<>,并在括号中指定具体的型参数。例如: ```java genericMethod("Hello World"); ``` 在这个例子中,`genericMethod`被声明为一个泛型方法,`<T>`指定了型参数,`T data`表示一个型为`T`的参数,调用时可以传入任何型的参数。 三、泛型的通配符 有时候,我们不知道泛型的具体型,可以使用通配符`?`。通配符可以作为型参数出现在方法的参数型或返回型中,但不能用于声明泛型泛型接口。例如: ```java public void printList(List<?> list) { for (Object obj : list) { System.out.print(obj + " "); } } ``` 在这个例子中,`printList`方法的参数型为`List<?>`,表示可以接受任何型的`List`,无论是`List<String>`还是`List<Integer>`都可以。在方法内部,使用`Object`型来遍历`List`中的元素。 四、泛型的继承 泛型泛型接口可以继承或实现其他泛型泛型接口,可以使用子或实现型参数来替换父或接口的型参数。例如: ```java public class SubGenericClass<T> extends GenericClass<T> {} public class SubGenericInterface<T> implements GenericInterface<T> { private T data; @Override public T getData() { return data; } @Override public void setData(T data) { this.data = data; } } ``` 在这个例子中,`SubGenericClass`继承了`GenericClass`,并使用了相同的型参数`T`,`SubGenericInterface`实现了`GenericInterface`,也使用了相同的型参数`T`。 五、泛型的限定 有时候,我们需要对泛型型参数进行限定,使其只能是某个或接口的子或实现。可以使用`extends`关键字来限定型参数的上限,或使用`super`关键字来限定型参数的下限。例如: ```java public class GenericClass<T extends Number> { private T data; public T getData() { return data; } public void setData(T data) { this.data = data; } } public interface GenericInterface<T extends Comparable<T>> { T getData(); void setData(T data); } ``` 在这个例子中,`GenericClass`的型参数`T`被限定为`Number`的子,`GenericInterface`的型参数`T`被限定为实现了`Comparable`接口的。 六、泛型的擦除 在Java中,泛型信息只存在于代码编译阶段,在编译后的字节码中会被擦除。在运行时,无法获取泛型的具体型。例如: ```java public void genericMethod(List<String> list) { System.out.println(list.getClass()); } ``` 在这个例子中,`list`的型为`List<String>`,但是在运行时,`getClass`返回的型为`java.util.ArrayList`,因为泛型信息已经被擦除了。 七、泛型型推断 在Java 7中,引入了钻石操作符<>,可以使用它来省略型参数的声明。例如: ```java List<String> list = new ArrayList<>(); ``` 在这个例子中,`ArrayList`的型参数可以被编译器自动推断为`String`。 八、总结 Java泛型是一个强大的特性,可以提高代码的可读性和安全性,降低代码的耦合度。在使用泛型时,需要注意它的基本语法、使用方法、通配符、继承、限定、擦除和型推断等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值