文章目录
前言
把常用算法封装到一个类中,这样之后想用常用的算法时,就不用自己写算法,直接调用类中的方法就OK,不懂就查API,多翻翻,但用IDEA会有提示,方法名都差不多见名知意,不用刻意记方法(像字典一样多谁记得住),用多就记住了一>工具类的设计
把一些通用的方法分类存入类中,这些类就叫工具类
自己写工具类:
第一种:私有化构造器;方法用public static修饰
第二种:私有化构造器;在类的内部创建对象(保证应用在某个类中只有一个实例),再由对象去调用方法(单例模式)
单例模式又分三种:饿汉模式,懒汉模式;枚举
饿汉模式(JVM加载类就创建了对象)
public class Demo_01 {
//私有化构造器
private Demo_01(){}
//创建对象
private static Demo_01 instance = new Demo_01();
//通过方法取得对象
public static Demo_01 getInstance(){
return instance;
}
//下面就哗啦啦写自己的方法,用的时候就Demo_01.getInstance.xx
}
懒汉模式(用的时候才创建对象,这样可以节省点heap空间)
public class Demo_01 {
private Demo_01(){}
private static Demo_01 instance = null;
public static Demo_01 getInstrance(){
if (null == instance){
return new Demo_01();
}
return instance;
}
//下面就哗啦啦写自己的方法
}
枚举
这个在设置枚举值的时候就创建对象了,也就是枚举值本身,也私有化了构造器了
二>包装类
因为八大基本数据类型已经不能适用业务场景(如int id = 0不知道表示id是0还是不存在这个id);然后就封装一些类即持有数据又封装了好多方法给我们用,这些类就叫包装类.如Integer,Character,…
Integer:就提供对int类型数据的处理
常用于int跟String的转换
//String 变 int
int a = Integer.parseInt("123");
int b = Integer.valueof("123);
//int 变 String
String string = Integer.toString(123);
其他的类都差不多这样子,查阅JDK的API就好了0.0
还有自动装箱自动拆箱的骚操作:就是int跟Integer的转变,可以直接赋值(其实就是语法糖)
Integer num = 17; //装箱操作
int a = num; //拆箱操作
注意Integer缓存区对自动装箱后的判断,缓存范围[-127,128]
三 >Bigdicimal
一位浮点数的加减乘除运算会有计算机计算误差,然后就出现BigDecimal工具类了,这个需要使用构造构造对象才能用
(可以试下输出0.01+0.09就不等于0.1啦)
BigDecimal num1 = new BigDecimal(0.09);
BigDecimal num2 = new BigDecimal(0.01);
System.out.print(num1.add(num2));
四 >String类
JAVA程序的字面,都是以String的形式存在,String是以字符数组的形式存在常量池,而且常量池的值都是唯一的,再搞个相同的String时会指向已有的常量,不过new 一个对象就不一样了,在heap中创建对象是指向对象地址的,每个对象地址都不同,以下代码测试:
内存图不会就增加理解难度
public class Demo_01 {
public static void main(String[] args) {
String str1 = new String("123");
String str2 = new String("123");
String str3 = "123";
String str4 = "123";
System.out.println(str1==str2);//false
System.out.println(str3==str4);//true
}
}
之后就String的一些方法了,基本想对String怎么操作在API的方法都有吧,空字符表示用"“表示,不存在用null;
toCharArray()将此字符串转换为一个新的字符数组;
spilt(”")字符串分隔;
字符串陷阱:思考"A" + “B” + “C” 创建了几个字符串?
五>Stringbuffe和Stringbuilder
Stringbuffe和Stringbuilder一样的,区别就是线程安全问题上,Stringbuffe线程安全,因为里面封装的方法都用synchronized修饰给方法上同步锁了;分析一下线程状态图就知道单线程用Stringbuilder快一丢丢;
因为String装的字符串像数组一样是不能够改它的长度的,然后StringBuffer 就登场了;
它可以看成一个包装类,包装了一个字符数组,并提供了对该字符数组进行增(append/insert)、删(delete)、改(replace)、查(length/capacity)的方法。StringBuffer其实也是一个"容器",可以自动拓容.
六>Math
就简单的数学方法
Math.ceil(数值);向上取整
Math.floor(数值);向下取整
Math.max/min(数值,数值);求最值
Math.random()返回[0,1)的随机数
返回[m,n]区间的随机整数
(int)(Math.random()*(n-m+1)) + m;//这个还挺实用的
其中又定义一个Random类,用来操作随机数的
之后又封装Random类来操作随机数
其中nextInt(int n) 返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值。
补充一个UUID类
randomUUID() : 产生一个随机的唯一标识符,格式:678f9568-8967-4637-a48e-f0eae30faf43
七>date SimpleDateFormat Calendar
这三个都是对日期进行操作的类
date主要是创建date对象,gettime()获取时间戳;
SimpleDateFormat设置时间格式用的,用对象调用方法;
applyPattern(pattern)应用pattern样式;
format()Date进行格式化,把date类型转换为String类型,一般之前先设置样式再格式化;
parse()对String进行解析成date;
Calendar用来对日期做相(add)减,获取(get),重新设置(set)日期时间功能。
getInstance() 使用默认时区和语言环境获得一个日历对象。