写点什么

Java 常用类大讲解!1️⃣(手写 API、源码必备)

作者:XiaoLin_Java
  • 2022 年 1 月 09 日
  • 本文字数:2663 字

    阅读完需:约 9 分钟

Java常用类大讲解!1️⃣(手写API、源码必备)

一、工具类

1.1、工具类的设计

​ 把很多完成通用功能的方法抽取分类存放到类中,这些类就叫工具类


工具类如何设计(分两种)


  1. 工具方法全部使用 public static 修饰**(常用)**

  2. ​ 此时只需要使用工具类类名调用工具方法,且须把工具类的构造器私有化,防止创建工具类的对象来调用静态方法

  3. 如果工具方法没有使用 static 修饰

  4. ​ 此时必须使用工具类的对象去调用工具类的方法,且必须把工具类设计成单例模式

1.1.1、公共静态方法

需求一:使用公共静态方法的方式,设计一个数组的工具类


ArraysUtils 类


public void ArraysUtils{    //1. 先私有化构造器,防止被实例化对象    private ArraysUtils(){            }        //2.写工具方法    public static void sort(){        System.out.println("我是排序方法")    }     public static void print(){        System.out.println("我是打印方法方法")    }    }
复制代码


TsstDemo 类


public class TsstDemo{    public static void main(String[] args){        ArraysUtils.sort()    } }
复制代码


调用者必须通过工具类名.工具方法名称完成调用

1.2、单例模式

设计模式(Design pattern)


​ 是一套被反复使用的代码设计经验总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性,Java 常用的设计模式有 23 种


单例设计模式(singleton)


​ 最常用、最简单的设计模式,单例模式分为两种:懒汉式和饿汉式


目的


​ 保证在整个应用中某一个类有且只有一个实例


步骤(以饿汉式为例)


  1. 私有化自身构造器,防止外界通过构造器实例化出对象

  2. 在该类中,自己先创建出一个对象

  3. 向外暴露一个公共的静态方法用于返回自身的对象


public class SingletonUtil{        // 1. 先私有化构造器,防止被实例化对象    private SingletonUtil(){            }        //2. 自己创建出一个对象    private static SingletonUtil instance = new SingletonUtil();        //3. 暴露给外界调用方法,返回创建好的对象    public static SingletonUtil getInstance(){        return instance;    }        public void sort() {    System.out.println("排序操作");  }  public void binarySearch() {    System.out.println("二分查找操作");  }      }
复制代码


调用方法:


SingletonUtil.getInstance().sort();
复制代码

二、包装类

​ Java 中的基本数据类型没有方法和属性,而包装类就是为了让这些拥有方法和属性,实现对象化交互,数值型包装类都继承至 Number,而字符型和布尔型继承至 Object


2.1、基本类型的包装类

基本数据类型和包装类对应关系:


2.1.1、Integer

​ Integer 内部封装了 int 类型的基本数据类型 value,并提供了方法对 int 值进行操作和 String 之间进行互换(开发中常用)

2.1.1.1、Integer >> int

  Integer i = new Integer();    int intValue = i.intValue();
复制代码

2.1.1.2、int >> Integer

    int i = 20;    Integer integer = Integer.valueOf(i);
复制代码

2.1.1.3、Integer >>String

  int i = 30;  Stirng value = Integer.valueOf(i);
复制代码

2.1.1.4、String >> Integer

Integer i = Integer.valueOf("3");
复制代码

2.1.1.5、String >> int

  int i = Integer.parseInt("134");
复制代码

2.1.1.6、int >> String

String str = Integer.toString(134);
复制代码

2.2、拆箱和装箱

2.2.1、装箱

​ 把基本数据类型转为对于的包装类对象


  Integer num2 = Integer.valueOf(17);
复制代码

2.2.2、拆箱

​ 把包装类对象转化为对应的基本数据类型


  int val = num3.intValue(); 
复制代码

2.2.3、自动拆箱和装箱

​ 从 JDK5 之后提供了自动装箱和自动拆箱,我们再也不用频繁的去手动拆箱和装箱了


    Integer num4  =  17; //装箱操作    int val2 = num4; //拆箱操作
复制代码

2.3、缓存设计

​ 从性能上考虑,把常用数据存储到缓存区域,使用时不需要每次都创建新的对象,可以提高性能


常用包装类型的缓存范围


  • Byte、Short、Integer、Long:缓存范围[-128,127]

  • Character:缓存范围[0,127]


//第一种Integer i1 = new Integer(123);Integer i2 = new Integer(123);System.out.println(i1 == i2);// false,因为都在堆中new了一个新的对象
//第二种Integer i3 = Integer.valueOf(123);Integer i4 = Integer.valueOf(123);System.out.println(i3 == i4);// true,由于在[-128,127]之间,所以直接在缓存中取,都是同一个对象
//第三种Integer i5 = 123; // 底层等价于第二种Integer i6 = 123;System.out.println(i5 == i6);// true
复制代码


注意


  1. 如果数字都不在缓存范围内,那么返回的结果都是 false

  2. 如果要比较两个对象的数据是否相等,必须使用 equals 方法来判断,==比较的是两个数据的内存空间是否是同一块,equals比较的是存储数据是否相等

  3. int 类型的默认值为 0,Integer 的默认值为 null,在开发中建议使用 Integer,因为 Integer 既可以表示 0,也可以表示 null

2.4、BigDecimal

​ float 和 double 都不能表示精确的小数,使用 BigDecimal 类可以解决该问题,BigDecimal 用于处理金钱或任意精度要求高的数据

2.4.1、基本运算

BigDecimal 不能直接把赋值和运算操作,只能通过构造器传递数据,而且必须使用字符串类型的构造器


    System.out.println(0.09 + 0.01);
复制代码


我们运行这段代码,结果是



他会生成一个无限接近 0.1 的值,说明这个并不适合我们运算


    BigDecimal num1 = new BigDecimal(0.09);    BigDecimal num2 = new BigDecimal(0.01);    System.out.println(num1.add(num2));
复制代码



如果我们不用字符串类型的构造器的话,BigDecimal 无法开启高精度模式


    BigDecimal num3 = new BigDecimal("0.09");    BigDecimal num4 = new BigDecimal("0.01");    System.out.println(num3.add(num4));
复制代码



终于运行处了正确结果,需要注意一定要使用字符串的构造方法,才可以开启高精度计算模式

2.4.2、精度控制

我们在运算的时候需要进行精度控制操作


/*  1. 保留位数和精度控制     RoundingMode 舍入模式     RoundingMode.HALF_UP   四舍五入*/BigDecimal num5 = new BigDecimal("0.987");    BigDecimal bigDecimal = num5.setScale(2, RoundingMode.HALF_UP);    System.out.println(bigDecimal);
复制代码

2.4.3、无理数问题

     /*      java.lang.ArithmeticException     Non-terminating decimal expansion; no exact representable decimal result.     报错原因:除不尽(3.333333333...333...)     */  BigDecimal num1 = new BigDecimal("10.0");    BigDecimal num2 = new BigDecimal("3.0");    BigDecimal r2 = num1.divide(num2,3,RoundingMode.HALF_UP);    System.out.println(r2);
复制代码


用户头像

XiaoLin_Java

关注

问啥啥都会,干啥啥不行。 2021.11.08 加入

问啥啥都会,干啥啥不行。🏆CSDN原力作者🏆,🏆掘金优秀创作者🏆,🏆InfoQ签约作者🏆

评论

发布
暂无评论
Java常用类大讲解!1️⃣(手写API、源码必备)