实用类
常使用,性价比高的类
1.掌握枚举类型的使用
switch中支持的一种表达式类型
引用数据类型中的一种
1.1需求
编写一个学生类,要求存储姓名、性别、年龄,并进行测试
public class Student{
private String name;
private String gender;
private int age;
}
Student stu = new Student();
stu.setName("雷锋");
stu.setGender("女");
stu.setAge(23);
// stu.setGender("人妖");
// stu.setAge(-1);
sout(stu);
问题分析:在年龄方面为了保证年龄信息的合理性,我们借助以前的封装技术实现了在对应的setter方法中添加逻辑控制语句,性别方面虽然也可以采用上述方式,但是较之年龄,性别的可选择范围仅仅只有两种可能。
1.2枚举的使用
枚举就是某些有穷序列的集合,例如:星期 就是一种枚举
1.将性别单独定义为一种类型
public enum Gender {
男,女
}
2.完善Student类
public class Student{
private String name;
// 原写法:private String gender;
private Gender gender;
private int age;
}
3.测试使用
Student stu = new Student();
stu.setName("雷锋");
stu.setAge(23);
// 原写法:stu.setGender("女");
stu.setGender(Gender.女);
sout(stu);
1.3枚举的原理
- 枚举其实就是一种普通类型,只不过是提前由Java帮你选定了父类
2. 因为枚举已经自动继承自Enum类型,所以它无法再继承其他类,但是可以进行接口实现
- 枚举内的常量其实都是一个个Gender类型的对象,底层是靠数组来存储这些对象信息的
1.4枚举练习
需求:周一至周五 好好学习,周六周日 好好休息
public enum Week {
星期一,星期二,星期三,星期四,星期五,星期六,星期日
}
public class DoWeek {
public void doWhat(Week day) {
switch (day) {
case 星期一:
case 星期二:
case 星期三:
case 星期四:
case 星期五:
System.out.println("好好学习!");
break;
case 星期六:
case 星期日:
System.out.println("好好休息!");
break;
default:
break;
}
}
public static void main(String[] args) {
DoWeek doWeek = new DoWeek();
doWeek.doWhat(Week.星期一);
// doWeek.doWhat(Week.星期二);
// ……
}
}
2.掌握包装类及装箱和拆箱的概念
集合的泛型中学习到。
java.lang:无需导包即可使用 System、String
java.util:工具类包 Arrays Collections 集合…
javax.sql:数据库相关API
java.net:网络编程相关API
java.io:IO流相关API
…
byte → Byte
short → Short
int → Integer
long → Long
float → Float
double → Double
char → Character
boolean → Boolean
2.1为什么需要包装类
为什么在拥有了基本数据类型之后还要产生对应的包装类型?【面试题】
Java是一个面向对象的语言,而基本数据类型不具备面向对象的特性
我们在Java中存储一些单一的数据 都是用基本数据类型存储的,它们在使用中非常方便,但如果涉及到需要对这些单一数据进行一些处理,(例如:将数字转换为字符串、将字符串转换为数字……)基本类型无法直接转换,因为基本数据类型不是类,不存在方法和属性,所以诞生了包装类
2.2包装类介绍
2.3包装类的常用方法
构造方法:(JDK10已经将构造进行了废弃)
- Integer(int value);
- Integer(String value);
- ……
常用方法:
-
基本数据类型 <-> 引用数据类型(包装类)
-
包装类型 → 字符串
- 通过+号拼接""
- String toString();
- static String toString(基本类型值);
// 创建包装类对象 Integer num1 = new Integer(10); int num2 = 10; // 转换为字符串 String num1Str = num1.toString(); sout(num1Str); String num2Str = Integer.toString(num2); sout(num2Str);
-
字符串 → 包装类型
- Double valueOf(String value)
- Long valueOf(String value)
- int parseInt(String value)
- double parseDouble(String value)
- …
String num1 = "10"; int parseInt = Integer.parseInt(num1); Integer valueOf = Integer.valueOf(num1);
2.4装箱和拆箱
装箱:将基本数据类型转换为包装类型的过程就是装箱。
拆箱:将包装类型转换为基本数据类型的过程就是拆箱。
Java提供了自动装箱和拆箱!
包装类型和基本数据类型在使用上可以混用!
// 参考:String s = ""; String s = new String("xx");
// 装箱
Integer num1 = 10;
// 拆箱
int num2 = num1;
String s = "10";
int num1 = Integer.parseInt(s);
Integer num2 = Integer.parseInt(s);
// Integer num2 = Integer.valueOf(s);
3.掌握Math类进行数学运算
Math是Java提供的数学工具类
-
生成[0.0,1.0)之间的随机小数:double random = Math.random();
-
生成指定范围的随机数:int random = (int)(Math.random()*(max - min) + min);
// 绝对值(absolute)
int abs = Math.abs(-7);
sout(abs); // 7
// 获取最大值
int max = Math.max(34,55);
sout(max); // 55
// 获取最小值 同上
// 幂运算
double pow = Math.pow(2,3);
sout(pow); // 8 2的3次方
// 开平方根
double sqrt = Math.sqrt(4);
sout(sqrt); // 2
// 三角函数
Math.sin(a);
Math.cos(a);
Math.tan(a);
// 四舍五入
long round = Math.round(10.5);
sout(round); // 11
// 向上取整
double ceil = Math.ceil(10.2);
sout(ceil); // 11
// 向下取整
double floor = Math.floor(10.7);
sout(floor); // 10
// 派
double pi = Math.PI;
sout(pi); // 3.141592653……一般计算不采用 通常使用自己定义的常量3.14
【面试题】
long round = Math.round(-1.5);
sout(round); // -1
4.掌握Random类进行随机数使用
Random是Java提供给我们的 用于随机数生成的工具类。
// seed 种子数 理解为随机数的基数
// 世界上本没有随机数 规则诞生之后就拥有了相对的随机效果
// 如果两个随机数的种子数都是一致的 且执行相同的随机范围 则结果不变(相同)
Random ran1 = new Random(10);
Random ran2 = new Random(10);
int num1 = ran1.nextInt(10);
int num2 = ran2.nextInt(10);
sout(num1);
sout(num2);
// 本质上 它其实是将纳秒值作为了种子数中的要素之一
new Random();
5.掌握String类的常用API
字符串类,引用数据类型,无法被继承,重写了equals()方法,底层是char数组。
5.1构造方法
String类的构造方法非常丰富。
5.2常用方法
-
int length():获取字符串长度
-
boolean equals(String ano):判断字符串是否相同
-
boolean equalsIgnoreCase(String ano) :忽略大小写进行字符串内容比较
-
String toUpperCase():转换为大写字母
-
String toLowerCase():转换为小写字母
-
String concat(String ano):拼接字符串 当然也可以使用+号拼接
-
String trim():去除字符串两端的空格
-
char charAt(int index):获取指定索引的字符 索引从0开始
-
boolean endsWith(String str):判断是否是以指定的字符串结尾的
-
boolean startsWith(String str):判断是否是以指定的字符串开头的
-
byte[] getBytes():将字符串转换为字节数组
- byte[] getBytes(字符编码):将字符串以指定的编码转换为字节数组
-
int indexOf(String str); 获取指定字符串在字符串中第一次出现的位置 索引从0开始
- int indexOf(String str,int fromIndex) 可以指定开始查找的索引位置
-
int lastIndexOf(String str) 同上 从右向左找
-
String replace(String old,String new) 字符串替换
-
String[] split(String regex) 按照指定的正则来进行切分 切分为字符串数组
-
char[] toCharArray() 将字符串转换为字符数组
-
String substring(int beginIndex) 从指定索引开始截取子串
- String substring(int beginIndex,int endIndex) 从指定索引开始到指定索引结束截取子串
-
String format(String format, Object… args):格式化字符串
String name = "雷锋"; int age = 23; double money = 77.777; sout("姓名:"+name+"年龄:"+age); // 类似于占位符 // %s表示字符串 %d表示数值 // %f表示浮点数 String format = String.format("姓名:%s 年龄:%d 余额:%.2f", name,age,money); sout(format);
5.3可变参数
public static String format(String format, Object... args) {
return new Formatter().format(format, args).toString();
}
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
可变参数是用来解决在实现某些方法时参数数量不固定的场景。
public void printName(String name){
sout(name)
}
public void printName(String[] names){
// sout(name)
// 数组遍历
}
public void printName(String... names){
// 本质上是个数组
}
public static void main(String[] args) {
printName();
printName("雷锋");
printName("雷锋","七条");
printName("雷锋","七条","甘油三酯");
}
public static void printName(String... names){
for (String name : names) {
sout(name+" ");
}
sout(); // 换行
}
6.掌握StringBuffer的使用
StringBuffer:字符串缓冲区
我们做程序到了一定规模一定要考虑性能问题。
StringBuffer可以提升字符串拼接效率。
String和StringBuffer区别:
-
String 是final修饰的类,内置中拥有一个final修饰的常量char数组,所以严格来讲每一个String都是不可变的,当每创建或拼接一个字符串,它们都会产生新的内存区域。
String str1 = “123”;
String str2 = “123”;
str1 == str2
会涉及到常量池的复用。
-
所以为了提升了字符串拼接效率,我们提出了缓冲区(缓存)的概念
思路:将所有要拼接的内容先暂时存储在一个区域,最终你要使用字符串时,才将其进行拼接转换。
// 开始时间 long startTime1 = System.nanoTime(); String str1 = "Hello"; String str2 = "World"; /*String concat = str1.concat(str2); System.out.println(concat);*/ String str3 = str1+str2; System.out.println(str3); // 结束时间 long endTime1 = System.nanoTime(); System.out.println("拼接花费时间:"+(endTime1 - startTime1)); // 280138 纳秒 // 开始时间 long startTime2 = System.nanoTime(); // StringBuffer() StringBuffer(String xxx) StringBuffer sb = new StringBuffer(); // 向缓冲区存储数据 sb.append("Hello"); sb.append("World"); // 将字符串缓冲区转换为字符串 String string = sb.toString(); System.out.println(string); // 结束时间 long endTime2 = System.nanoTime(); System.out.println("拼接花费时间:"+(endTime2 - startTime2)); // 76641 纳秒 // 向指定位置插入值(任何类型) sb.insert(1, ","); System.out.println(sb);
常用方法:
- append(任何类型数据); 向字符串缓冲区追加内容
- toString(); 将字符串缓冲区内容转换为字符串
- insert(int index,任何类型数据); 向字符串缓冲区的指定位置插入数据
练习: 一串数字123456789,现在需要每隔三位添加一个逗号,最终效果为123,456,789
利用StringBuffer实现
Scanner input = new Scanner(System.in);
System.out.print("请输入一串数字:");
// int num = input.nextInt(); 考虑长度问题 用String
String num = input.next();
// 创建StringBuffer
StringBuffer sb = new StringBuffer(num);
// 拼接逗号
for(int i = sb.length() - 3; i > 0; i -= 3) {
sb.insert(i, ",");
}
System.out.println("转换后为:"+sb);
7.掌握Date和Calendar类的使用
Java提供的日期类型
java.util.Date
java.util.Calendar
Goods goods = new Goods();
goods.setId("future777");
goods.setName("初见");
goods.setPrice(77.77);
// this(System.currentTimeMillis())
goods.setCreateTime(new Date());
// 【废弃】
// toLocaleString → 转换为本地时间格式
// 被DateFormat中的format方法替代了
// String localeString = goods.getCreateTime().toLocaleString();
// 【废弃】
// 单个获取时间信息
// goods.getCreateTime().getDate();
// goods.getCreateTime().getDay();
// 创建对象
Calendar calendar = Calendar.getInstance();
// System.out.println(calendar);
// 根据时间元素编号 获取时间信息
// Calendar.get(Calendar.DAY_OF_WEEK);
// int year = calendar.get(1); 魔法值
// 修复魔法值
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int date = calendar.get(Calendar.DATE);
System.out.println(year+"-"+month+"-"+date);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
System.out.println(hour+":"+minute+":"+second);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
System.out.println("星期"+dayOfWeek);
8.掌握SimpleDateFormat类格式化日期
Date date = new Date();
// 进行日期格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 将日期转换为字符串
String format = sdf.format(date);
System.out.println(format);
// 将字符串转换为日期
String str = "2018年11月11日 11时11分11秒";
Date parse = sdf.parse(str);
System.out.println(parse);
ndar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
System.out.println(hour+":"+minute+":"+second);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
System.out.println("星期"+dayOfWeek);
8.掌握SimpleDateFormat类格式化日期
Date date = new Date();
// 进行日期格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 将日期转换为字符串
String format = sdf.format(date);
System.out.println(format);
// 将字符串转换为日期
String str = "2018年11月11日 11时11分11秒";
Date parse = sdf.parse(str);
System.out.println(parse);
注:笔记思想来自查老师!