1 、工具类的设计 一般地,把那些完成 通用功能的方法 分类存放到类中,这些类就叫工具类。
工具类起名: XxxUtil 、 XxxUtils 、 XxxTool 、 XxxTools 等,其中 Xxx 表示一类事物,比如 ArrayUtil 、 StringUtil 、 JdbcUtil 。
工具类存放的包起名: util 、 utils 、 tool 、 tools 等 工具类在开发中的应用场景 :作为工具性质且能高效地重复使用。
工具类如何设计,在开发中有两种设计: 如果工具方法全部使用 public static 修饰 此时只需要使用工具类名调用工具方 此时必须把工具类的构造器私有化,防止创建工具类的对象来调用静态方 如果工具方法没有使用 static修饰 此时必须使用工具类的对象去调用工具方法 此时把必须工具类设计为 单例模式 的 一般的出于简单考虑,首选第一种,如 JDK 中提供的工具 java.util.Arrays 类。
公共静态方法 比如使用公共静态方法的方式,设计一个数组的工具类。
调用者直接使用 工具类名 . 工具方法名称 完成调用:
单例模式(掌握) 设计模式( Design pattern ):是一套被反复使用的代码设计经验总结,专门用于解决特定场景的需求。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
比如使用单例模式的方式,设计一个数组的工具类。
单例设计模式( singleton ):最常用、最简单的设计模式,单例的编写有 N 种写法。
目的:保证在整个应用中某一个类有且只有一个实例(一个类在堆内存只存在一个对象)。
单例设 计模式的好处在于多个模块共享数据和工具方法。
饿汉式 必须在该类中,自己先创建出一个对象 私有化自身的构造器,防止外界通过构造器创建新的工具类对象 向外暴露一个公共的静态方法用于返回自身的对象 单例模式(饿汉式)
创建测试类测试单例设计模式
2.2 懒汉式 ( 自己完成 )
思考:懒汉式和饿汉式单例设计模式的区别?
2.4 枚举法
创建测试类测试单例设计模式
2 、包装类 2.1 基本类型的包装类 int 包装类 IntWrapper 既可以表示 0 ,也可以表示 null 。
所以,在实际开发过程中,我们经常性的会利用 封装思维 把一些数据作为字段封装到类中,并提供方法对这些数据进行操作。
总结: int 包装类 IntWrapper 既可以表示 0 ,也可以表示 null 。
IntWrapper 提供了方法用于对封装的 value 进行进一步的操作 2.2 包装类概述 包装类 就是把基本数据类型( byte short int long char boolean )封装到一个类中,提供便利的方法,让开发者更方便的操作基本类型,包装类的出现不是为了取代基本数据类型。
包装类位于 java.lang 包中, 基本数据类型和包装类对应关系: byteshortintlongfloatdoublecharbooleanByteShortIntegerLongFloatDoubleCharacterBoolean 除了 Integer 和 Character 外,其他都是讲基本类型的首字母大写。
讲课单以 Integer 举例。
2.3 Integer Integer 内部封装了一个 int 类型的基本数据类型 value ,并提供了方法对 int 值进行操作,还提供了 int 值和 String 之间的转换。
创建 Integer 对象 开发者使用 JDK 提供的类,总是从构建该类的对象开始。
2.3.2 常用方法
以上通过通过 Integer 把字符串直接转化成基本数据类型 int 了,也可以通过 Integer 把 int 转化成 String 2.4 Auto-Boxing 和 Auto-UnBoxing 2.4.1 装箱和拆箱 装箱:把基本类型数据转成对应的包装类对象。
拆箱:把包装类对象转成对应的基本数据类型。
装箱操作: 方式一: Integer num1 = new Integer ( 17 ); 方式二: Integer num2 = Integer . valueOf ( 17 ); // 建议 拆箱操作: Integer num3 = Integer . valueOf ( 17 ); // 装箱操作 int val = num3 . intValue (); // 拆箱操作 从 Java5 开始提供了的自动装箱( AutoBoxing )和自动拆箱( AutoUnBoxing )功能: 自动装箱:可把一个基本类型变量直接赋给对应的包装类变量。
自动拆箱:可以把包装类对象直接赋给对应的基本数据类型变量。
Integernum4=17;//装箱操作intval2=num4;//拆箱操作 自动装箱和拆箱,在底层依然是手动装箱和拆箱。
思考 Object obj = 17; 代码正确吗?
为什么?
Integeri=17;//自动装箱操作Objectobj=i;//把子类对象赋给父类变量 2.4.2 缓存设计 从性能上考虑,把常用数据存储到缓存区域,使用时不需要每次都创建新的对象,可以提高性能。
Byte 、 Short 、 Integer 、 Long :缓存范围 [-128 , 127] ; Character :缓存范围 [0 , 127]
如果把上述代码中的 123 换成 250 ,则结果都为 false 。
3 、 BigDecimal float 和 double 都不能表示精确的小数,使用 BigDecimal 类可以解决该问题, BigDecimal 用于处理金钱或任意精度要求高的数据。
使用 double 类型计算 0.01 + 0.09 System . out . println ( 0.09 + 0.01 ); // ? 3.1 基本运算 BigDecimal 不能直接把赋值和运算操作,只能通过构造器传递数据,而且必须使用 字符串类型的构造器 ,操作 BigDecimal 主要是加减乘除四个操作。
使用 BigDecimal 类型 double 类型的构造器: BigDecimal num1 = new BigDecimal ( 0.09 ); BigDecimal num2 = new BigDecimal ( 0.01 ); System . out . println ( num1 . add ( num2 )); // ? 使用 BigDecimal 类型 String 类型的构造器: BigDecimal num3 = new BigDecimal ( "0.09" ); BigDecimal num4 = new BigDecimal ( "0.01" ); System . out . println ( num3 . add ( num4 )); // ? 结果为 0.09999999999999999687749774324174723005853593349456787109375 0.10 3.2 精度控制 和 除不尽问题 public static void main ( String [] args ) { BigDecimal num1 = new BigDecimal ( "10.0" ); BigDecimal num2 = new BigDecimal ( "3.0" ); 保留位数和精度控 RoundingMode 舍入模式 RoundingMode.HALF_UP 四舍五入 ( 常用 ) RoundingMode.HALF_Down 四舍六入 BigDecimal r1 = num1 . multiply ( num2 ). setScale ( 2 , RoundingMode . HALF_UP ); System . out . println ( "r1 = " + r1 ); 2. 除不尽问题 报错原因 : 10.0 / 3.0 除不尽 (3.333333333...333...) BigDecimal r2 = num1 . divide ( num2 , 3 , RoundingMode . HALF_UP ); System . out . println ( "r2 = " + r2 ); } 上述代码分别表示乘法和除法按照四舍五入方式保留两位小数。
4 、 String 字符串(字符序列),表示把多个字符按照一定得顺序连成的字符序列。
字符串的分类(根据同一个对象,内容能不能改变而区分): 不可变的字符串 ——String :当 String 对象创建完毕之后,该对象的内容是不能改变的,一旦内容改变就变成了一个新的对象。
可变的字符串 ——StringBuilder/StringBuffer :当 StringBuilder 对象创建完毕之后,对象的内容可以发生改变,当内容发生改变的时候,对象保持不变。
4.1 String 本质概述 String 类型表示字符串类, 字符串的本质是 char[] , char 表示一个字符, char[] 表示同一种类型的多个字符。
String str = "ABCD" ; 等价于 char [] value = new char []{ 'A' , 'B' , 'C' , 'D' }; 我们可以认为, String 对字符数组的封装 ,并提供很多便利的方法来操作字符数组。
String 对象的创建的两种方式: 1 、直接赋一个字面量 : String str1 = "ABCD" ; // 直接存储在方法区的常量池中 , 节约内存 2 、通过构造器创建 : String str2 = new String ( "ABCD" ); 字符串内存图
通过 字面量创建的字符串分配在常量池 中,所以字面量字符串是常量;它们的值在创建之后不能更改,因为 String 对象是不可变的,所以可以共享
通过 new 操作创建的字符串分配在堆区 String 类,表示不可变的字符串,当 String 对象创建完毕之后,该对象的内容是不能改变的,一旦内容改变就变成了一个新的对象,看下面代码。
String 对象的 " 空 " 值 表示引用为空 ( null ) String str1 = null ; // 没有初始化,没有分配内存空间 . 内容为空字符串 String str2 = "" ; // 已经初始化,分配内存空间,不过没有内容 4.3 字符串常用方法 "ABCD" ['A','B','C,'D'] int length() 返回此字符串的字符个数 char charAt(int index) 返回指定索引位置的字符 int indexOf(String str) 返回指定字符串在此字符串中从左向右第一次出现处的索引位置 boolean equals(Object anObject) 比较内容是否相同 boolean equalsIgnoreCase(String anotherString) 忽略虑大小写,比较内容是否相同 String toUpperCase() 把当前字符串转换为大写 String toLowerCase() 把当前字符串转换为小写 String substring(int beginIndex) :从指定位置开始截取字符串 String substring(int beginIndex, int endIndex) :截取指定区域的字符串 boolean endWith(String suffix) boolean startWith(String prefix) replace(char oldChar, char newChar) 需求:判断字符串非空:字符串不为 null 并且字符内容不能为空字符串 ("") 判断一个字符串非空: public static boolean hasLength ( String str ) { return str != null && ! "" . equals ( str . trim ()); }
