Java08:常用类总结

八 常用类总结

(一)Object类

1 Clone()方法

  1. 作用:

利用clone()方法,可以将对象的所有属性完全复制一份,clone()出来的新对象,有新的首地址以及新的内存空间.

Person p1 = new Person("mujin",23);
Person p3 = p1;//相当于指针p3的首地址指向p1,没有另外存放里面的属性
Person p2 = p1.clone();//有新的栈地址存放对象首地址,和新的存放对象的堆区

//需要注意,使用clone()有相当多的准备工作
  1. 使用步骤:

    1. clone()是Object类的protected方法,想要复制的类,需要先实现Cloneable接口

    2. 重写clone()方法

      @Override    
      public Object clone() throws CloneNotSupportedException {
              ClassName cloned = (ClassName) super.clone();
              return cloned;
          }
      
    3. 在main函数外抛出CloneNotSupportedException异常

      public static void main(String[] args)throws CloneNotSupportedException{
                  
              }
      
    4. 在main函数内,通过对象调用clone()方法

      ClassName ObjectName1 = new ClassName();
      ClassName ObjectName2 = ObjectName1.Clone();
      
  2. 深拷贝与浅拷贝:类中有其他引用类型的情况

    • 深拷贝:
      • 深拷贝指的是,将其他引用类型也另划空间存放的操作
      • 如果类中有其他的引用类型,需要对其中的引用类型也执行上述4步,才能实现深拷贝
    • 浅拷贝:
      • 浅拷贝指的是,类中的引用类型的属性,经过克隆仍然共用同一片存储空间的情况

2 toString()方法

  1. 作用:返回字符串,内容为:类名+at标记符"@"和此对象哈希码的无符号十六进制表示组成.

  2. 使用方法:

public String toString(){
    return getClass().getName() + "@" +Integer.toHexString(hashCode());
}

public static void main(String[] args){
    ClassName o1 = new ClassName();
    System.out.println(o1.toString()); //输出ClassName@HashCode
}

3 getClass()方法

  1. 作用:返回该对象运行时的类的类型
  2. 使用方法:
public static void main(String[] args) {
  Object o = new Object();
  System.out.println(o.getClass());//getClass()不可重写
  //class java.lang.Object
}

4 finalize()方法

  1. 作用:用于释放资源,但很少使用
  2. 使用方法:
protected void finalize() throws Throwable{ }

5 equals()方法

  1. 作用:用来判断调用equals()的对象,和形参传入的对象obj所引用的对象是否为同一对象
  2. 原理:直接判断this和obj本身的值是否相等
  3. 注意事项:equals可以重写为:当属性完全一样时,即使在内存中的位置不同,也视为同一个对象
public boolean equals(Object obj){
	return (this==obj);
}
  1. 使用方法:
    public static void main(String[] args) {
        Student s1 = new Student(4396, "厂长");
        Student s2 = new Student(1357, "宁王");
        Student s3 = s1;
        if(s1.equals(s2)){//false
            System.out.println("s1和s2相等");
        }
        if(s1.equals(s3)){//true
            System.out.println("s1和s3相等");
        }
    }

6 hashCode()方法

  1. 作用:

    • 返回该对象的哈希码值,用于哈希查找.

    • 可以减少在查找中使用equals的次数,重写了equals方法一般都要重写
      hashCode方法。

    • 一般认为: obj1.hash Code() == obj2.hashCode() 和 obj1.equals(obj2)==true等价

  2. 使用方法:

    System.out.println(objectName.hashCode());
    

7 wait()方法(先略过)

  1. 作用:

    • 使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。
      wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,
      如果在规定时间内没有获得锁就返回.

    • 调用该方法后当前线程进入睡眠状态,直到以下事件发生:

      (1)其他线程调用了该对象的notify方法。
      (2)其他线程调用了该对象的notifyAll方法。
      (3)其他线程调用了interrupt中断该线程。
      (4)时间间隔到了。

  2. 使用方法

8 notify()方法(先略过)

  1. 作用:唤醒在该对象上等待的某个进程/所有进程
  2. 原理:
public final native void notify();
public final native void notifyAll();

(二)包装类

1 包装类介绍

  1. 包装类作用:基本数据类型的类,能较方便地转换为String类型.
  2. 包装类的由来:
    1. 由于8种基本类型的数据不具备“对象”的特性——不携带属性、没有方法可调用,导致由此带来了不便。
    2. 为了让8种基本类型的数据具备“对象”的特性,用包装类代替基本数据类型。
  3. 包装类列表:
基本数据类型 对应的包装类
byte Byte
short Short
int Integer
long Long
char Character
float Float
double Double
boolean Boolean

每个包装类的对象可以封装一个相应的基本类型的数据,并提供了其它一些有用的方法。包装类对象一
经创建,其内容(所封装的基本类型数据值)不可改变。

  1. 基本类型和对应的包装类可以相互装换:
  • 由基本类型向对应的包装类转换称为装箱,例如把 int 包装成 Integer 类的对象;
  • 包装类向对应的基本类型转换称为拆箱,例如把 Integer 类的对象重新简化为 int。

2 包装类的应用

1)手动装箱与拆箱

  1. 介绍:通过包装类的构造方法,可以将基本类型装箱,通过包装类的 基本类型Value()方法可以将包装类拆箱
  2. 使用方法:
 int m = 500;double n = 500.5;
  Integer obj = new Integer(m);// 手动装箱
	Double objD = new Double(n);// 手动装箱
  int o = obj.intValue(); // 手动拆箱
  dou p = objD.doubleValue();// 手动拆箱

2)将字符串基本转换为基本类型

  1. 介绍:用包装类中静态的parse包装类() 方法,可以将字符串转换为基本数据类型
  2. 参数列表举例:
public static int parseInt(String s, int radix); //s 为要转换的字符串,radix 为进制,可选,默认为十进制。
  1. 使用方法:
String s = "123";
int i = Integer.parseInt(s,10);//i==123
double j = Double.parseDouble("400.004");//进制不可选

3)将基本类型转换为字符串类型

  1. 介绍:

    1. 包装类有一个静态的 toString() 方法,可以将基本数据类型转换为字符串
    2. 或者定义1个字符串直接在基本数据类型后面加空字符串即可!
  2. 使用方法:

  //方法1
  int m = 500;
  String s = Integer.toString(m);
  //方法2
  String s2 = m+"";
  System.out.println("s = " + s);

3 包装类自动拆箱和装箱

  1. 介绍:

    1. 上面的例子都需要手动实例化一个包装类,称为手动拆箱装箱。
    2. Java 1.5(5.0) 之前必须手动拆箱装箱。
    3. Java 1.5 之后可以自动拆箱装箱,也就是在进行基本数据类型和对应的包装类转换时,系统将自动进
      ,这将大大方便程序员的代码书写。(也就是:对应的基本数据类型和包装类可以相互赋值)
  2. 使用方法:

  int m = 500;
  Integer obj = m; // 自动装箱
  int n = obj; // 自动拆箱
  System.out.println("n = " + n);
  Integer obj1 = 500;
  System.out.println("obj 等价于 obj1?" + obj.equals(obj1));
//结果:
//  n = 500
//  obj 等价于 obj1?true
  1. 原理:

    1. 编译器在编译时期依据所编写的语法,自主地决定是否进行装箱或拆箱动作。
    2. 自动装箱与拆箱的功能是所谓的“编译器蜜糖”(Compiler Sugar),虽然使用这个功能很方便,但在程
      序运行阶段,仍需了解Java的语义。
  2. 注意事项:

    1. NullPointerException:运行时错误

      Integer i = null;
      int j = i;//报错:NullPointerException
      //等价于:int j = i.intValue();
      
      • null 表示i 没有任何的对象实体,它可以合法地指定给对象参考名称。

      • 由于实际上i并没有参考至任何的对象,所以也就不可能操作intValue()方法,这样上面的写法在运行时会出现NullPointerException错误。

(三)Math类

  1. 简介:Math 的方法都被定义为 static 形式,通过 Math 类可以在主函数中直接调用
public final class Math{
  //数学方法
}
  1. 使用方法:
  • 注意参数列表即可
  1. 常用方法:
    1. 常数方法:
      1. Math.PI:记录的圆周率
      2. Math.E:记录e的常量
      3. 其他: Math中还有一些类似的常量,都是一些工程数学常用量,需要使用时查API文档。
    2. Math.abs 求绝对值
    3. 三角函数方法:
      1. Math.sin 正弦函数
      2. Math.asin 反正弦函数
      3. Math.cos 余弦函数
      4. Math.acos 反余弦函数
      5. Math.tan:正切函数
      6. Math.atan 反正切函数
      7. Math.atan2 商的反正切函数
      8. Math.toDegrees 弧度转化为角度
      9. Math.toRadians 角度转化为弧度
    4. 比较大小方法:
      1. Math.ceil 得到不小于某数的最大整数
      2. Math.floor 得到不大于某数的最大整数
      3. Math.IEEEremainder 求余
      4. Math.max 求两数中最大
      5. Math.min 求两数中最小
    5. 次幂操作方法:
      1. Math.sqrt 求开方
      2. Math.pow 求某数的任意次方, 抛出ArithmeticException处理溢出异常
      3. Math.exp 求e的任意次方
      4. Math.log10 以10为底的对数
      5. Math.log 自然对数(以e为底)
    6. 其他方法:
      1. Math.rint 求距离某数最近的整数(可能比某数大,也可能比它小)
      2. Math.round 同上,返回int型或者long型(上一个函数返回double型)
      3. Math.random 返回0,1之间的一个随机数

(四)2种Random类

1.java.lang.Math.Random

  1. 简介:返回带正号的double值,该值大于等于0.0且 小于1.0,即取值范围是
    [0.0,1.0)的左闭右开区间,返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。

  2. 用法:

double num1 = Math.random();

2.java.util.Random

  1. 简介:

    • 创建一个Random对象的时候可以给定任意一个合法的种子数,种子数只是随机算法的起源数字,
      和生成的随机数的区间没有任何关系.
    • 两种构造方法:
      Random():创建一个新的随机数生成器。
      Random(long seed):使用单个 long 种子创建一个新的随机数生成器。
    • 没带参数构造函数生成的Random对象的种子缺省是当前系统时间的毫秒数
  2. 使用方法:

    • 不带参数

      public static void main(String[] args) {
        Random rand =new Random();
        int i=rand.nextInt(100);//参数100是随机数的上限,产生的随机数是0-100的整数,不包括100
        System.out.println(i);
      }
      
    • 带参数:对于种子相同的Random对象,生成的随机数序列是一样的

public static void main(String[] args) {
  Random ran1 = new Random(25);
  System.out.println("使用种子为25的Random对象生成[0,100)内随机整数序列: ");
  for (int i = 0; i < 10; i++) {
    System.out.print(ran1.nextInt(100) + " ");
 }//运行多次,结果均为:81 28 47 38 97 98 95 37 96 54 
}
  1. 方法扩展摘要:
    1. protected int next(int bits):生成下一个伪随机数,不能直接调用,不常用。
    2. boolean nextBoolean():返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的
      boolean值。
    3. void nextBytes(byte[] bytes):生成随机字节并将其置于用户提供的 byte 数组中。
    4. double nextDouble():返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间
      均匀分布的 double值。
    5. float nextFloat():返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分
      布float值。
    6. double nextGaussian():返回下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正
      态”)分布的double值,其平均值是0.0标准差是1.0。
    7. int nextInt():返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。
    8. int nextInt(int n):返回一个伪随机数,它是取自此随机数生成器序列的、在(包括和指定值(不
      包括)之间均匀分布的int值。
    9. long nextLong():返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值。
    10. void setSeed(long seed):使用单个 long 种子设置此随机数生成器的种子。

(五)日期时间类

1、 Date类

  1. 简介:
  • java.util 包提供了 Date 类来封装当前的日期和时间。
  • Date 类提供两个构造函数来实例化 Date 对象。
    • 第一个构造函数使用当前日期和时间来初始化对象。
    • 第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
  1. 常用方法:

image

//使用Date.toString()即可打印当前日期和时间
	// 初始化 Date 对象
   Date date = new Date();
   // 使用 toString() 函数显示日期时间
   System.out.println(date.toString());
   //Sat Apr 27 15:09:43 CST 2019

2、SimpleDateFormat类

  1. 简介:用来选择任何用户自定义日期时间格式,可以理解为Date类的自定义工具
public static void main(String args[]) {
  Date dNow = new Date( );
  SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
  System.out.println("当前时间为: " + ft.format(dNow));
}
  1. 自定义参数:以“-”隔开

image

  1. 使用System.out.printf实现C风格的输出:
    1. %s表示输出字符串
    2. %n换行
    3. %S将字符串大写输出
    4. 1$ 2$ 3$标识变量编号
    5. 格式化整数:
    6. %d十进制整数
    7. %o八进制整数
    8. %x16进制整数
    9. 格式化浮点数:
    10. %e 科学计数法输出浮点数
    11. %f十进制输出浮点数
    12. //格式化日期:
    13. %tY:输出年份
    14. %tB:输出月份完整名
    15. %tD:以月日年格式化日期
    16. %tF:以年月日格式化日期
posted @ 2021-04-28 18:55  程序员不能懒  阅读(82)  评论(0)    收藏  举报