04 常用类
Object
Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入;Object类是所有Java类的根基类,如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类
包装类
JAVA并不是纯面向对象的语言。Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的。但是我们在实际使用中经常需要将基本数据转化成对象,便于操作。比如:集合的操作中。例如使用Map对象要操作put()方法时,需要传入的参数是对象而不是基本数据类型。为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为 包装类(Wrapper Class) 。
基本数据类型 | 包装类 |
---|---|
byte | Byte |
boolean | Boolean |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
自动装箱和自动拆箱
基本类型和包装类进行自动的互相转换
自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类 型的包装中。
自动拆箱的过程:每当需要一个值时,被装箱对象中的值就被自动地提取出来,没必要再 去调用intValue()和doubleValue()方法。
常量池
常量池大体可以分为:静态常量池,运行时常量池。
- 静态常量池 存在于class文件中,比如经常使用的javap -verbose中,常量池总是在最前面把?
- 运行时常量池呢,就是在class文件被加载进了内存之后,常量池保存在了方法区中,通常说的常量池 值的是运行时常量池。所以呢,讨论的都是运行时常量池
初窥常量池:已经提前创建好一些特殊属性的值。需要时直接给。
在常量池里就直接用,不在就要新建一个。
例如:一个班级里有张三,当外界需要这个班级的张三就直接调用。
若这个班没张三就去创建一个张三。
字符串相关类
String类 对象的创建
每一次赋值都是新建对象。 字符串拼接需要2n-1次对象的创建。
常用操作
String类的下述方法能创建并返回一个新的String对象:
concat, replace, substring, toLowerCase, toUpperCase, trim
提供查找功能的有关方法: endsWith, startsWith, indexOf,,lastIndexOf
提供比较功能的方法: equals, equalsIgnoreCase, compareTo
其它方法:
charAt ,length
public static String valueOf(…) 可以将基本类型数据转换为字符串
String与StringBuffer 与StringBuilder
StringBuffer 和StringBuilder非常类似,均代表可变的字符序列,而且方法也一样。
(StringBuilder被设计用作 StringBuffer 的一个简易替换,建议优先采用该类,因为
在大多数实现中,它比 StringBuffer 要快。)
这三个类的主要区别在两个方面:运算速度(运算性能或执行效率)和线程安全性。
String 是字符串常量,每次赋值地址都会改变。final修饰的类
StringBuffer与StringBuilder:是字符串变量,每次赋值地址不会改变,改变的是指向的内容。
运算速度:StringBuilder > StringBuffer > String
String str = "abc";
System.out.println(str);
str = str + "de";
System.out.println(str);
String str = "abc" + "de";
StringBuilder stringBuilder = new StringBuilder().append("abc").append("de");
System.out.println(str);
System.out.println(stringBuilder.toString());
StringBuffer s=new StringBuffer("ppl");
s.append(1);
System.out.println(s.toString());
线程安全性:StringBuffer String
而StringBuilder的方法没有该关键字修饰,所以不能保证线程安全性。是JDK1.5新增的,该类提供一个与StringBuffer兼容的 API,但不能保证同步,所以在性能上较高。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
线程不安全:StringBuilder
StringBuffer中大部分方法由synchronized关键字修饰,在必要时可对方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致,所以是线程安全的。类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
总结
-
String:适用于少量的字符串操作。
-
StringBuilder:适用于单线程下在字符串缓冲区进行大量操作。
-
StringBuffer:适用于多线程下在字符串缓冲区进行大量操作。
时间处理相关类
作为与我们息息相关的日期,在开发中也是很常见的。在程序中,日期的存储也是个数字,是个长整型的数字。0代表1970年1月1日 00:00:00,而我们处于东八区,所以为1970年1月1日 08:00:0 ,往前推,负数表示之前的时间,往后算正数表示之后的时间。
java 8之前的常用时间相关类
Date
类 | 常见方法 |
---|---|
System 系统类 | currentTimeMillis(): 当前时间 |
Date 日期类 | new Date() :当前时间 new Date(指定时间):指定时间 getTime(): 获取时间 setTime(指定时间):设置指定时间 |
SimpleDateFormat | new SimpleDateFormat(模板) format() : 格式化为字符串 parse():转成日期 |
Date date=new Date();
System.out.println(date);
System.out.println(System.currentTimeMillis());
SimpleDateFormat format=new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
System.out.println(format.format(date));
Date parse = format.parse("2020-11-11 11:12:11"); //这里有异常
System.out.println(parse);
java 8 日期相关的api
JDK8的日期|时间 只是为我们提供了更加简便的操作,里面的对象是不可变的。单独给了年, 月 , 日期,时间,日期和时间的类,有一些方法of() 方法可以很方便地指定日期还提供了对两个日期|时间 的计算。
-
LocalTime:代表时间,可以通过时、分、秒来构造
-
LocalDate:代表日期,可以通过年、月、日构造,并且年/月/日的值都是符合日常使用习惯的
-
LocalDateTime:表示日期和时间,可以通过年、月、日、时、分、秒来构造,也可以通过一个LocalDate和LocalTime来构造。可以调用with、plus、minus方法来修改LocalDateTime对象,但是修改后原对象的值不变,会返回一个新的对象
格式化:
DateTimeFormatter 类,它的使用也非常简单,调用静态方法ofPattern 生成指定匹配格式的实例;调用实例的 format 方法可以将TemporalAccessor 对象转换成指定格式的日期时间字符串,实际上这个TemporalAccessor 是个接口,前面介绍的LocalTime/LocalDate/LocalDateTime 都间接实现了这个接口;调用实例的parse 方法可以将时间日期字符串转换为 TemporalAccessor 对象,进而得到对应的 LocalTime/LocalDate/LocalDateTime 对象
java 8 的时间相关类
将时间分割封装成类,有year,month,day,hour,minute,seconds类等。
也可以转化成时,分,秒,天。计数单位,从而简便的比价日期前后。不需要考虑特殊的时段,大月小月,以及闰年 平年。
也增加Zoned(时区)
类 | 类中方法 |
---|---|
LocalDate | LocalDate 是一个不可变的日期时间对象,表示日期,通常被视为年月日。 也可以访问其他日期字段,例如日期,星期几和星期。 例如,值“2007年10月2日”可存储在LocalDate 。 |
LocalDateTime | LocalDateTime 是一个不可变的日期时间对象,代表日期时间,通常被视为年 - 月 - 日 - 时 - 分 - 秒。 也可以访问其他日期和时间字段,例如日期,星期几和星期。 时间表示为纳秒精度。 例如,值“2007年10月2日在13:45.30.123456789”可以存储在LocalDateTime 。 |
Period | 这个类以年,月和日为单位建立数量或时间量。请参阅Duration 的等效于此类的时间。可以求两个时间的差值。 |
Duration | 该类以秒和纳秒为单位建立数量或时间量。 它可以使用其他基于持续时间的单位进行访问,例如分钟和小时。 此外, DAYS 单位可以使用,并被视为完全等于24小时,因此忽略了夏令时效应。 请参阅Period 相当于此类的日期。 |
ChronoUnit | 这组单位提供基于单位的访问来操纵日期,时间或日期时间。 可以通过实施TemporalUnit 扩展标准的单位。 |
老哥去看API吧,上面几个类,比较像工具类。
public class Test {
public static void main(String[] args) {
LocalDateTime now=LocalDateTime.now();
System.out.println(now);
//牛啊,串行修改属性。
LocalDateTime time=now.withSecond(50).withMinute(20).withHour(11).withDayOfMonth(12).withMonth(12).withYear(2000);
System.out.println(time);
//判断时间前后
System.out.println(time.isBefore(now));
System.out.println(time.isAfter(now));
//时间差值
Period period = Period.between(time.toLocalDate(),now.toLocalDate());
System.out.println(period);
Duration between1 = Duration.between(time, now);
System.out.println(between1);
System.out.println(between1.toDays());
//与时间做单位
long between = ChronoUnit.DAYS.between(time, now);
System.out.println(between);
}
}
Math类
java.lang.Math 提供了一系列静态方法用于科学计算;其方法的参数和返回值类型一般为 double 型。
System.out.println(Math.abs(-10)); //10 获取-10的绝对值
System.out.println(Math.pow(3, 2)); //9.0 3的平方
System.out.println(Math.max(21, 12));//21 大数
System.out.println(Math.sqrt(9)); //3.0 开方
System.out.println(Math.ceil(15.2)); //16.0 向上取整
System.out.println(Math.floor(9.9)); //9.0 向下取整
System.out.println(Math.ceil(-15.2)); //-15.0
System.out.println(Math.floor(-9.9)); //-10.0
System.out.println(Math.round(1.3)); // 1 四舍五入
File类
java.io.File类:文件和目录路径名的抽象表示形式。
File 类的常见构造方法: public File(String pathname)
以 pathname 为路径创建 File 对象,如果 pathname 是相对路径,则默认的当前路径在系 统属性 user.dir 中存储。 File 的静态属性 separator 存储了当前系统的路径分隔符。
文件夹 与文件 都抽象为File,构建 File 的方式**
-
File(String pathname) ; 可以是绝对路径,也可以是相对路径(盘符)
-
File(File parent, String child)
-
File(String parent, String child) ; 抽象一个指定路径下的 文件
分割符:静态常量
-
路径分隔符: ; pathSeparator
-
目录分隔符: \ / separator
常见方法
public boolean canRead()//可读
public boolean canWrite()//可写
public boolean exists() //测试此抽象路径名表示的文件或目录是否存在。
public boolean isDirectory()//测试此抽象路径名表示的文件是否为目录。
public boolean isFile()//测试此抽象路径名表示的文件是否为普通文件。
public boolean isHidden()//测试此抽象路径名命名的文件是否为隐藏文件。
public long lastModified()//返回此抽象路径名表示的文件上次修改的时间。
public long length() //返回由此抽象路径名表示的文件的长度。
public String getName()//返回由此抽象路径名表示的文件或目录的名称。
public String getPath()//将此抽象路径名转换为路径名字符串。
public String getAbsolutePath()//返回此抽象路径名的绝对形式。
public boolean createNewFile() //当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。
public boolean mkdir() //创建由此抽象路径名命名的目录。
public boolean mkdirs() //创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。
public boolean delete()//删除