1.作业
2.StringBuffer和StringBuilder
3.包装类
4.数学类
5.日期类
6.随机数类
7.系统类
object类有什么作用
- 是所有类的父类(超类super class)
- 提供了一些方法,供子类重写
- ? 深层次的自己去理解,假设不要Object,整个jdk生态该怎么设计?
equals什么作用
- 比较两个对象是否相等
- 但是Object类的equals方法是使用==判断对象地址是否相等
- 没意义,每个子类重写以判断对象内容(属性)
String声明的字符串能不能变
- 不能改变
写出String方法名
- 获得字符串长度 int length()
- 判断字符串是否相等 boolean equlas(Object obj)
- 将任何数据类型转成字符串 static String valueOf(参数)
- 按照指定开始,结束下标截取字符串 String substring(int beginIndex,int endIndex)
String类代表的字符串不能更改
字符串缓冲区允许字符串更改 —>StringBuffer和StringBuilder就是字符串缓冲区
StringBuffer字符串缓冲区,StringBuilder是它"升级版"
- 代表字符串
- 可变字符串
- 线程安全(线程同步)
- 提供很多方法,允许改变字符串内容
- append() 追加内容到末尾
- insert() 插入内容到指定位置
- delete* () 删除内容
- setCharAt() 修改内容
- 其他方法基本上与String一致
- 还需要掌握: String <–> StringBuffer之间相互转换的方法
public static void main(String[] args) {
// 通过构造方法创建StringBuffer
// 其实也是将String变为StringBuffer的
StringBuffer sb = new StringBuffer("java");
System.out.println(sb );
// 改变字符串,append,追加
// 提供了很多重载的方法,允许追加各种类型数据到字符中
sb.append(666);
System.out.println(sb );
// 改变字符串,insert(),插入
sb.insert(4,"-");
System.out.println(sb );
// 将StringBuffer变为String
String s = sb.toString( );
String s1 = String.valueOf(sb);
}
StringBuilder的API几乎完全和StringBuffer一致,设计该类的目的就是为了在单线程情况下替换StringBuffer,因为不保证线程安全的话,执行速度快
// 演示略
String | StringBuffer | StringBuilder | |
---|---|---|---|
字符改变 | 不能更改 | 可以 | 可以 |
线程是否安全 | 安全 | 安全 | 不安全 |
拼接效率 | 极低 | 较快 | 最快 |
出现版本 | 1.0 | 1.0 | 1.5 |
即以后如果只是表示字符串,用String
如果要频繁大量拼接字符串,建议使用StringBuilder
除非特别说明要保证线程安全,这样才使用StringBuffer
System 系统类,java.lang包下
- 系统类提供的 正常输出 System.out.println()
- 系统类提供的 错误输出 System.err.println()
- System.currentTimeMillis() 获得当前系统时间毫秒值
- 程序中时间的起始点是1970-01-01 00:00:00
- System.arraycopy() 数组拷贝
- System.exit(0) 0是正常退出(直接停止jvm)
public static void main(String[] args) {
// - 系统类提供的 正常输出 System.out.println()
// - 系统类提供的 错误输出 System.err.println()
System.err.println("Exception in thread \"mian\" NullPointerException" );
long l = System.currentTimeMillis( );
System.out.println(l );
}
Math类提供了一些操作数学运算的方法
方法都是静态的,通过类名调用
public static void main(String[] args) {
double pi = Math.PI;// 圆周率π
System.out.println(pi );
// 绝对值
System.out.println(Math.abs(3000 - 5000) );
// 开几次幂
System.out.println(Math.pow(2,3) );
System.out.println(Math.pow(4,0.5) );
// 四舍五入(取整)
System.out.println(Math.round(5.5) );
System.out.println(Math.round(-5.4) );
// 随机数(0-1之间)
System.out.println(Math.random() );
// 向上取整(向上取最小整数)
System.out.println(Math.ceil(13.2) );
// 向下取整
System.out.println(Math.floor(13.2) );
}
包装类是对一系列包装成类的那些类的统称
主要是: 基本数据类型8个包装成8个引用类型中的类
int a = 1; // 基本类型数据只能代表一个数据,可以做简单数学运算
Integer a = 1;// 将其包装成类,那就是对象,其中就有属性和方法可以使用
包装类有什么好处? 自己想
经验告诉我们,包装类主要用在一个地方: 基本数据类型和String之间的转换
基本类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
Float | |
double | Double |
boolean | Boolean |
char | Character |
ps: 虽然有8个基本数据类型,我们只学习2个(Integer,Character)
public static void main(String[] args) {
// 没有无参构造
// 基本类型当参数创建包装类
Integer i1 = new Integer(1);
// 字符串String当参数创建包装类
Integer i2 = new Integer("1");
System.out.println(i1 );
System.out.println(i2 );
// 包装类获得基本类型
int i3 = i1.intValue( );
// 其他类型变成包装类
Integer i4 = Integer.valueOf(1);
Integer i5 = Integer.valueOf("1");
// [[非常重要]]的方法
// int parseInt(String s)
int i6 = Integer.parseInt("1");
}
装箱: 将基本类型包装成类的过程
拆箱: 将包装类中的基本类型取出
自动拆箱装箱就是,不需要再调用方法完成这个功能,自动可以进行
// 自动装箱(基本类型直接赋值给包装类)
Integer i = 1;
// 拆箱(直接取值)
int a = i;
“12” --> 12
“12” --> char无法转型
Character包装类作用不是为了和String转换的,主要目的是提供了一些方法可以操作字符
- 判断是否是大小写 isLowerCase isUpperCase
- 判断是否是字母 isLetter
- 判断是否是数字 idDigit
- 转换大小写 toLowerCase toUpperCase
包装类最重要的类是Integer,Integer最重要方法
将日期数据封装成对象来表示
Date类表示某一瞬间,该类有很多方法表示日期时间或者指定日期时间
ps1: Date类中有很多方法都过时了,不建议用,而是建议使用Calendar使用
ps2: JDK8新特性,日期有新的API
public class Demo5_Date {
public static void main(String[] args) {
// 默认创建的是当前时间
Date date = new Date( );
System.out.println(date );
// 可以指定年月日创建时间(了解,已经过时)
// 月份从0开始 0-11
// 年份-1900
Date date2 = new Date(100, 0, 1);
System.out.println(date2 );
// 没过时的方法
// 获得从1970-01-01 00:00:00 距date的毫秒值
long time = date.getTime( );
System.out.println(time );
// 练习: 计算你出生了多少天?
// 设置毫秒值(改时间)
date.setTime(1*1000*60*60*24*365L);
System.out.println(date );
//=============== Date的应用 ============
Student student = new Student( );
student.setAge(18);
student.setName("ELK");
student.setBirthday(new Date(105,1,1 ));
System.out.println(student );
}
}
总结: 大部分方法都过时了,所以只需要记住
- 空参构造,创建当前时间
- setTime() 指定毫秒值
- getTime() 获得毫秒值
另外记住应用: 一般都是用来描述时间类型数据的,类似
SimpleDateFormat该类主要用来
- 格式化日期: 将日期对象变为日期字符串
- 将日期对象按照指定模板变成字符串,目的就是方便阅读/查看
- 方法名: String format(Date d)
- 解析日期: 将日期字符串变为日期对象
- 将日期字符串按照模板变成日期对象,目的方便调用日期api
- 方法名: Date parse(String s)
日期模板(模式)怎么写?
- y 年,M月,d 天 H(h)时 m分 s 秒
- 常见模板
- yyyy/MM/dd 2020/01/01
- yyyy年MM月dd日 HH:mm:ss 2020年01月01日 15:26:03
这个模版是用在构造方法内,即通过模板创建对象
再通过对象调用方法完成格式化/解析时已经是有固定的格式
// throws ParseException 这个就是抛出异常
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
// 格式化(日期 --> 字符串)
String str = sdf.format(new Date( ));
System.out.println(str );
// 解析(字符串 --> 日期)
// [[特别注意: 只能按照模板解析]]
String s = "1990年01月01日 12:01:03";
Date date = sdf.parse(s);// ps: 记得抛出异常
System.out.println(date );
}
Calendar日历类,主要是两个方法
- set(日历字段,值) 根据指定字段设置值
- get(日历字段) 得到指定日历字段的值
日历字段是Calendar类提供的静态属性,YEAR MONTH DAY_OF_MONTH HOURS MINUTE SECONDS
另外,Calendar是抽象类
public static void main(String[] args) {
// 因为是抽象类,不能直接new
// 但是提供静态方法,调用可以获得对象
// 默认当前时间
Calendar rightNow = Calendar.getInstance();
System.out.println(rightNow );
int year = rightNow.get(Calendar.YEAR);
int month = rightNow.get(Calendar.MONTH);
int day = rightNow.get(Calendar.DAY_OF_MONTH);
int hour = rightNow.get(Calendar.HOUR_OF_DAY);
int minute = rightNow.get(Calendar.MINUTE);
int second = rightNow.get(Calendar.SECOND);
int week = rightNow.get(Calendar.DAY_OF_WEEK);// 周
// 周是周日是1 ~ 周六是7
System.out.println(year );
System.out.println(month );// 月份从0开始
System.out.println(day );
System.out.println(hour );
System.out.println(minute );
System.out.println(second );
System.out.println(week );
System.out.println("---------------" );
rightNow.set(Calendar.YEAR,2000);// 按照字段设置值
System.out.println(rightNow.get(Calendar.YEAR) );
rightNow.set(1990,1,1);// 直接设置年月日
System.out.println(rightNow.get(Calendar.YEAR) );
System.out.println(rightNow.get(Calendar.MONTH) );
System.out.println(rightNow.get(Calendar.DAY_OF_MONTH) );
}
Random类,该类的方法可以产生随机数
- nextInt(int n) 随机产生0~n之间(但不包含n的数)
public static void main(String[] args) {
// 创建对象
Random random = new Random( );
// 调用方法
int nextInt = random.nextInt(10 );
System.out.println(nextInt );
System.out.println("---------" );
// 摇骰子
System.out.println(random.nextInt( 6 )+1 );
// 产生6位数验证码
// 思路是: 每次产生1位数,拼接
Random r1 = new Random( );
StringBuilder sb = new StringBuilder( );
for (int i = 0; i < 6; i++) {
int n = r1.nextInt(10);
sb.append(n);
}
System.out.println("验证码:"+sb );
}