Java 常用类

156 阅读6分钟

包装类 

       我们前面学习的八种基本数据类型并不是对象,为了将基本类型数据和对象之间实现互相转化,Java为每个基本数据类型提供了相应的包装类。

       Java是面向对象的语言,但并不是 “纯面向对象”的,因为我们经常用到的基本数据类型就不是对象。但是我们在实际应用中经常需要将基本类型转化成对象,以便于操作。

        比如:将基本数据类型存储到Object[] 数组中或集合中的操作等。

        为了解决这个不足,Java 在设计类时为每个基本数据类型 设计了一个对应的类进行代表,这样八个和基本数据类型对映的类统称为“包装类(Wrapper Class)”。

         包装类位于java.lang包,八种包装类和基本数据类型的对应关系:

  •   byte  -->   Byte

  •   boolean  --> Boolean

  •   short --> Short

  •   char --> Character

  •    int  --> Integer

  •    long --> Long

  •    float --> Float

  •    double --> Double

Number 类

     Number 类时一个抽象类,因此它的抽象方法,所有子类都需要提供实现 。 

     Number 类提供了抽象方法: intValue(),longValue(), floatValue(),DoubleValue(),意味着所有的“数字型”包装类都能互相转型。

public static void main(String[] args) {
 Integer a = new Integer(100); // Java9 开始被废弃 
 Integer j = Integer.valueOf(100); // 官方推荐 
 int aa = j.intValue(); 
 double bb = j.doubleValue(); // 把字符串转成数字 
 Integer n = Integer.valueOf("4444");
}

包装类的用途

对于包装类来说,这些类的用途主要包含两种:

  1. 作为和基本数据类型对应的类型存在,方便涉及到对象的操作买入Object[] 、集合等的操作;

  2. 包含每种基本类型的相关属性,如最大值、最小值等以及相关的操作方法(这些操作方法的作用是在基本数据类型,包装类对象、字符串之间提供相互之间的转化);

自动装箱和拆箱

将基本数据类型和包装类自动转换

自动装箱

基本类型的数据处于需要对象的环境中时,会自动转为“对象”。 Integer i = 5; 编译器会自动转成: Integer i = Integer.vlaueOf(5), 这就是Java的自动装箱。

自动拆箱

每当需要一个值时,对象会自动转成基本数据类型,没必要再显式调用intValue() 等方法; Integer i = Integer.vlaueOf(5) int j = i; 编译器会自动转成: int i = i.intValue();这样的过程就是自动拆箱。

本质: 自动拆装箱时编译器来帮忙,在编译时依据您所编写的语法,决定是否进行;

包装类的缓存

整型、char类型所对应的包装类,在自动装箱时,对于-128~127之间的值会进行缓存,其目的是提高效率;

缓存原理: 如果数据在-128~127 这个区间,并将这256个对象存放在一个名为cache的数组中。每当自动装箱过程发生时 (或手动调用valueOf时),先判断数据是否在该区间,如果在则直接获取数组中对应的包装类对象的引用,如果不再区间,则会通过new 调用包装类的构造方法来创建对象。

字符串相关类

String 类代表不可变的字符序列

StringBuilder 类和StringBuffer类代表可变字符序列;

这三个类在笔试面试以及实际开发中经常用到,必须掌握好;

String 类源码分析

String 类对象代表不可变的Unicode字符序列,一次我们可以将String对象称为“不可变对象”。指的是对象内部的成员变量的值无法再改变;

public static void main(String[] args) { 
   String str1 = "hello"+"java";
   String str2 = "hellojava"; // 编译器做了优化直接在编译的时候将字符串进行拼接
   System.out.println(str1 == str2); // true
   String str3 = "hello";
   String str4 = "java"; // 编译时不知道变量中存储的是什么,所以没办法在编译的时候优化; 
   String str5 = str3 + str4; 
   System.out.println(str2 == str5); // false 
} 

StringBuffer 和 StringBuilder 可变字符序列

  1. StringBuffer 线程安全,做线程同步检查,效率较低;

  2. StringBuilder 线程不安全,不做线程同步检查,因此效率较高 (建议采用);

常用方法列表

  1. 重载的public StringBuilder append 可以为该 StringBuilder 对象添加字符序列。仍然返回自身对象

  2. 方法 public StringBuilder delete(int start,int end), 可以删除从start开始到end-1 为止的一段字符序列,仍然返回自身对象

  3. 方法 public StringBuilder deleteCharAt(int index),移除此序列指定位置上的char,返回自身对象。

  4. 重载的 public StringBuilder insert ,可以为该对象在指定位置插入字符序列,返回自身对象

  5. public StringBuilder reverse,用于将字符序列逆序。

如果有字符串拼接的功能养成习惯使用 StringBuilder。

public static void main(String[] args) { 
    String str = "";
    long num1 = Runtime.getRuntime().freeMemory(); // 系统剩余内存空间
    long time1 = System.currentTimeMillis(); 
    for (int i = 0; i < 5000; i++) { 
       str = str + i; 
    } 
    long num2 = Runtime.getRuntime().freeMemory(); // 系统剩余内存空间
    long time2 = System.currentTimeMillis();
    System.out.println(num2 - num1); 
    System.out.println(time2 - time1); 
    System.out.println(str);
    StringBuilder str2 = new StringBuilder(""); 
    long num3 = Runtime.getRuntime().freeMemory(); // 系统剩余内存空间
    long time3 = System.currentTimeMillis();
    for (int i = 0; i < 5000; i++) { 
       str2.append(i);
    }
    long num4 = Runtime.getRuntime().freeMemory(); // 系统剩余内存空间 
    long time4 = System.currentTimeMillis(); 
    System.out.println(num4 - num3); 
    System.out.println(time4 - time3); 
    System.out.println(str2);
 }

时间处理相关类

基准时间 1970-01-01 00:00:00 > long 类型的变量来表示时间

时间类 (java.util.Date)

在标准Java类库中包含一个Date类。它的对象表示一个特定的瞬间,精确到毫秒。

Date() 分配一个Date对象,并初始化此对象为系统当前的日期和时间,可以精确到毫秒

Date(long date) 分配Date 对象并初始化此对象,以表示自从标准基准时间以来的毫秒数;

boolean equals(Object obj) 比较两个日期的相等性

long getTime() 返回毫秒数

String toString() 把此Date对象转换为以下形式的String

dow mon dd hh:mm:ss zzz yyyy 之中dow是一周中的某一天

DateFormat类和SimpleDateFormat类

把时间对象转化成指定格式的字符串。 反之,把指定格式的字符串转化成时间对象。

DateFormat 是一个抽象类,一般使用它的子类SimpleDateFormat类实现。

Calendar日历类

Calendar 是一个抽象类,为我们提供了关于日期计算的功能,比如年、月、日、时、分、秒的展示和计算 。

GregorianCalendar 是Calendar 的子类,表示公历;

Math 类

abs 绝对值

acos,asin,atan,cos,sin,tan 三角函数

sqrt 平方根

pow(double a,double b) a 的 b 次幂

max(double a,double b) 取大值

min(double a,double b) 取小值

ceil(double a) 大于a的最小整数

floor(double a) 小于a的最大整数

random() 返回0.0 到 1.0 的随机数

long round(double a) double型的数据转换为long (四舍五入)

toDegrees(double angrad) 弧度 -> 角度

toRadians(double angdeg) 角度 -> 弧度

File 类

java.io.File : 代表文件和目录,用于:读取文件,创建文件,删除文件,修改文件;

File类常见的构造方法public File(String pathname)

以pathname为路径创建File对象,如果pathname是相对路径,则默认的当前路径系统属性user.dir中存储 。

通过File对象创建空文件或目录

1 .createNewFile() 创建新文件

  1. delete() 删除file对应的文件

  2. mkdir() 创建一个目录,中间某个目录缺失,创建失败 ;

  3. mkdirs() 创建多个目录,中间某个目录缺失,则创建该缺失目录

枚举

JDK1.5 引入了枚举类型,定义包括枚举声明和枚举体:

enum 枚举名 { 枚举体(常量列表) }

枚举体就是放置一些常量。

所有的枚举类型隐性的继承自 java.lang.Enum。 枚举实质上还是类,而每个被枚举的成员实质上就是一个枚举类型的实例,它们默认都是public static final修饰的。可以直接通过枚举名使用它们;

注意:

  1. 当你需要定义一组常量时,可以使用枚举类型。

  2. 尽量不要使用枚举的高级特性,事实上高级特性都可以使用普通类实现,没有必要。