第九章 常用类
Arrays类,操作数组
String类,字符串
Scanner类,输入
System类,访问系统
9.1 Object类
9.1.1 Object类
是Java中所有类的父类
public class 类名 extends Object(默认存在,可以不写) {
类体
}
9.1.2 Object类的方法
1)protected clone():克隆,创建并返回对象的一个副本
对object类的重写
2)equals()指示其他某个对象是否与此对象“相等”
比较两个对象是不是指向同一个内存空间,相当于“==”
3)hashCode():返回对象的哈希码
- toString():试图将对象转为字符串的操作,都会调用这个方法
5)notify(), notifyAll(), wait()是在多线程中使用
9.2 包装类
Java是99%的面向对象的编程语言
而另外的1%就是基本数据类型
包装类实际上就是基本数据类型的面向对象的表示方式
8种基本数据类型对应8个包装类
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
除了基本数据类似之外的都是引用数据类型,用一个类来描述。
所有引用数据类型的默认值是null。
虽然基本数据类型和包装数据类型互相转换有装箱和拆箱的过程,但是我们平时使用的时候
就把包装数据类型当成基本数据类型来使用就可以。
9.2.1 装箱和拆箱
装箱:基本数据类型可以自动转换成包装类型
int i = 10;
Integer j = i;//自动装箱
拆箱:包装类型也可以自动转换成相应的基本数据类型
Integer j = 10;
int i = j;//自动拆箱
基本数据类型和包装类型的运算操作都是一样的
但也有例外,比如“==”运算符
为什么要使用包装类
Byte b; //表示-128~127这256个值
Byte B; //表示-128~127这256个值,还可以是null
例如:表示一个人的体重
如果使用基本数据类型,当一个人没有上报体重时,设置成任何值都是不合适的
如果使用包装类型,就可以简单的设置成null
1.2.2 类型的转换
基本数据类型/包装类型与字符串之间的转换
例如:
包装数据类型最主要使用:包装数据类型和字符串之间的转换
1、把基本数据类型转换成字符串
(1)基本数据类型+“” :String str = 12 + “”; // “12”
(2)基本数据类型的包装类.toString()
String str1 = Integer.toString(3);
String str2 = Double.toString(3.14);
2、把字符串转换成基本数据类型(从网页的输入框中得到的都是字符串)
(1) Integer.parseInt(String str); // “23” “3.14”
Double.parseDouble(String str);
Boolean.parseBoolean(String str);
XXXX.parseXXXX(String str);
(2)new对象:Integer integer = new Integer(String str);
Integer interger = new Integer(“4”);
int i = integer.intValue();
9.3 字符串
9.3.1 String类
String类代表字符串。Java程序中的所有字符串字面值(如“abc”)都作为此类的实例(对象)实现
都Java中只要是“”包起来的东西,都会在内存中创建出一个String类型的对象保存它
9.3.2 字符串对象的创建
9.3.3 字符串是常量
它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为String对象是不可变的,所以可以共享
老版本中,常量池在方法区中
新版本中,常量池在堆中
1.8常量池是放在堆里面
public void test1() {
// "abc"双引号括起来的字符串:常量字符串,他也是一个对象
// 1.8之后常量池放到堆,在常量池里面找有没有这个"abc"对象,
// 如果常量池里面没有这个字符串对象,java就帮你在常量池里面new一个"abc"字符串对象。
// 如果常量池里面有这个字符串,就把这个字符串的地址赋给这个变量。
String str1 = "abc";
String str2 = new String("abc");
String str3 = "abc";
// ==比较的是变量指向的对象的地址值
System.out.println(str1 == str2);// false
System.out.println(str1 == str3);// true
System.out.println(str2 == str3);// false
// 比较字符串的内容是不是相等使用equals()
// 表str1这个字符串和str2这个字符串的内容是不是相等
System.out.println(str1.equals(str2));// true
System.out.println(str1.equals(str3));// true
System.out.println(str2.equals(str3));// true
}
9.3.4 字符串的常用操作
1.获取
2.判断
1)字符串的拼接:+
9.3.5 可变字符串
字符串是常量
因此,所有对字符串的操作中,只要是试图改变字符串内容的操作,都会创建一个新的字符串对象
如果在代码中需要对字符串进行频繁的改变字符串的操作,就会不同的创建新的对象,申请内存,消耗时间和内存资源
如果需要对字符串进行频繁的改变操作,这事情使用可变字符串提升效率
StringBuffer类 是一个可变字符串
创建一个StringBuffer类的对象
delete(start,end):将可变字符串中的指定区域删除掉
insert():在指定位置插入一个新的内容
replace():将指定区域的内容替换成新的字符串
subString():截取字符串
StringBuider类
这个类也是一个可变字符串,使用与StringBuffer基本一样
区别:
- StringBuffer线程不安全的,
- StringBuider效率更高
推荐尽量使用StringBuider
String、StringBuffer、StringBuilder异同点:
相同点:都是final类,都不能被继承。
不同点:
1、String长度是不可改变的(String类里有final char[] value;),StringBuffer、StringBuilder长度是可变的。
2、StringBuffer是线程安全(需要加锁,效率低)、StringBuilder是线程不安全(没有加锁,效率高)。
如果对这段代码加锁,就可以实现每次只有一个用户能进入这段代码,当执行完了之后,释放这个锁,另一个用户才能进来。
synchronize : 同步 asynchronize : 异步
if (money>1000) {
money = money - 1000;
}
常量字符串的拼接,编译器会做优化,使用String就可以:
String str = “Java” + “PHP” + “Python” + “C”;
final修饰变量、修饰方法、修饰类有什么特点:
1、final修饰变量,就变成常量
2、final修饰方法,这个方法不能被重写
3、final修饰类,这个类不能被继承
9.4 时间日期类
9.4.1 java.util.Date类
Date类的对象,用来表示一个时间点,精确到毫秒的
创建对象
9.4.2 日期的格式化
DateFormat抽象类
格式化:将Date对象转换成字符串表示
解析:将一个字符串转换成Date对象
SimpleDateFormat类
2022年6月20日 15:24:20
模式:yyyy(或yy,只表示后两位)年MM月dd日 HH:mm:ss SSS
9.4.3 java.sql.Date类
是java.util.Date类的子类
是为了兼容SQL中的Date类型
9.4.4 java.sql.TimeStamp类
是java.util.Date类的子类,精确到纳秒
为了兼容SQL中的TimeStamp类型
9.5 Math类
提供了常用的数学运算的方法
四舍五入round():结果为整数,加上1/2 即:(long)Math.floor(a+0.5d)
随机数random():返回一个大于等于0.0且小于1.0的伪随机带正号double值
Random类