常用类
工具类设计
通常使用XxxUtil、XxxUtils、XxxTool、XxxTools来命名
通常的工具类全部使用public static修饰
通常工具类的构造器都是私有化的
工具类的两种设计方式
-
公共静态方法(所有的方法都用static修饰)
public class ArrayUtil{ private ArrayUtil{} public static void sort(int[] arr){ //... } public static void binarySearch(int[] arr,int key){ //... } }
-
单例设计模式(方法不用static修饰)
public class ArrayUtil{ private ArrayUtil{} private static ArrayUtil instance = new ArrayUtil(); public void sort(int[] arr){ //... } public void binarySearch(int[] arr,int key){ //... } }
基础类型包装类
基础数据类型 | 包装类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
装箱:基础数据类型转包装类型
拆箱:包装类型转基础数据类型
在Java1.5中提供了自动装箱与自动拆箱的功能(实际上)
转换:
String->基础类型:Integer.parseInt("")
String->包装类型:Integer.valueOf("")
包装类型->String:Integer.toString()
包装类型->基础类型:Integer.intValue()
基础类型->String:“”+数据
基础类型->包装类型:Integer.valueOf(数据)
包装类型与基础数据类型的区别
基础数据类型没有null
包装类型有null
缓存设计
Byte、Short、Integer、Long:缓存的范围[-128,127]
Character:缓存的范围[0,127]
因为该封装类型是使用final修饰的,所以数据会存放在方法区,方法区的数据是不会被gc清理的所以再取的时候会取方法区获取
==与equals的区别
可以比较基础数据类型,引用类型里比较的是内存地址
equals不能比较基础数据类型,应用类型里equals要看对象里是否覆盖了equals方法如果覆盖了那么就根据当前对象里的equals方法进行比较,如果没有那么就调用父类的equlas方法比较对象与对象之间的内存地址
BigDecimal
用于表示更加精确的小数,比float、double都要精确
构造方法使用String为参数的不要使用Doubled的因为会让BigDecimal失去精度
public BigDecimal(String val)
public BigDecimal(Double val)
方法
方法 | 作用 |
---|---|
public BigDecimal add(BigDecimal augend) | 增加操作 |
public BigDecimal subtract(BigDecimal subtrahend) | 减少操作 |
public BigDecimal multiply(BigDecimal multiplicand) | 乘法操作 |
public BigDecimal divide(BigDecimal divisor,int scale,RoundingMode roundingMode) | 除法操作(divisor除数;scale位数;RoundingMode小数保留模式) |
Math
方法 | 作用 |
---|---|
public static double abs(double a) | 返回绝对值 |
public static int max(int a,int b) | 返回最大值 |
public static int min(int a,int b) | 返回最小值 |
public static long round(double a) | 四舍五入 |
public static double pow(double a,double b) | 计算一个数的次幂 |
public static double log(double a) | 返回对数 |
public static double sqrt(double a) | 返回平方根 |
String
String有两种创建方式
String str1 = “ABCD”;
String str2 = new String("ABCD");
内存图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DWjO2ETQ-1581423876278)(pic\3.png)]
为什么String的元素会放在方法区呢?
因为String是用final修饰的所以他每次都会存放到常用池中,因为用final修饰所以每次改变后都是新的地址(因为每次都要开辟空间)
字符串的比较:
equals比较内容,==比较地址
常用方法:
方法 | 作用 |
---|---|
public int length() | 获取字符串长度 |
public char charAt(int index) | 获取字符串指定字符 |
public int indexOf(String str) | 找出字符串出现的索引位置没有找到返回-1 |
public boolean equals(Object anObject) | 比较内容是否相等 |
public boolean equalsIgnoreCase(String anotherString) | 忽略大小写比较内容是否相等 |
public String toUpperCase() | 把字符中的小写字母转大写 |
public String toLowerCase() | 把字符中的大写字母转小写 |
public String substring(int beginIndex) | 截取字符串从第beginIndex开始截取 |
public String substring(int beginIndex,int endIndex) | 截取字符串从第beginIndex开始截取截取到endIndex |
public boolean contains(CharSequence s) | 查找字符串中是否有该字符 |
public char[] toCharArray() | 把数组转换成字符数组 |
public String[] split(String regex) | 根据正则表达式进行字符串切割 |
public String trim() | 去除字符串前后的空格 |
public String replace(CharSequence target,CharSequence replacement) | 将字符串中的target内容替换成replacement内容 |
StringBuilder/StringBuffer
StringBuilder与StringBuffer可变字符串,而String是不可变字符串(final修饰)
String、StringBuilder、StringBuffer的区别:
StringBuilder没有使用sychronized修饰,所以线程不安全,性能高
StringBuffer方法使用了sychronized修饰,所以线程安全,但是性能低
String的性能最低,因为他存放在方法区之中,而StringBuilder和StringBuffer是存放在堆中,经常使用String对系统长久来说是不好的,使用StringBuilder和StringBuffer系统长久来说比较好,因为java例有gc的存在可以清走不使用的对象
StringBuilder和StringBuffer在对象创立的时候可以给定长度,若不给定长度系统会默认给16的长度,若长度超过范围内StringBuilder和StringBuffer会以原本长度*2+2的模式进行逐步增长(不可超过int最大值)
常用方法
方法 | 作用 |
---|---|
public StringBuilder reverse() | 内容反转 |
public StringBuilder insert(int offset,String str) | 插入内容从offset开始插入str内容 |
public StringBuilder delete(int start,int end) | 删除内容从start开始删除到end |
public StringBuilder append(String str) | 内容追加 |
Date
new Date();//获取当前的时间
new Date(120,1,7)//从1900年1月1日开始计算 得出结果位2020年2月7日 月份是从0开始的
常用方法
方法 | 作用 |
---|---|
public String toLocaleString() | 本地区域时间风格 |
public long getTime() | 获取1970年1月1日到现在多少毫秒 |
SimpleDateFormat
SimpleDateFormat是日期格式化类
方法 | 作用 |
---|---|
public void applyPattern(String pattern) | 写入格式 |
public Date parse(String source)throws ParseException | 根据类型解析出Date类数据,若转换失败抛出转换异常 |
public final String format(Date date) | 把日期进行格式化返回输出 |
日期格式化的格式
指定 | 格式 |
---|---|
年 | yyyy |
月 | MM |
日 | dd |
时 | HH |
分 | mm |
秒 | ss |
毫秒 | SSS |
Random
随机数类(可以通过种子进行指定特指值,所以他是一个伪随机数),Math类的random也是通过Random类获得的,若不指定种子数系统会根据当时时间进行生成
正常用法
Random r = new Random;
int i = r.nextInt(100);//生成0->100的随机数
UUID
uuid是真真正正的随机数,他是通过电脑的网卡,当地的时间使用算法随机生成,生成的数字是唯一的,不存在重复的,缺点是生成的字符比较长(32位)
UUID.randomUUID();//获取32位随机字符串
UUID也可以当成验证码来生成
UUID.randomUUID().toString.subString(0,4);
Calendar
Calendar是日历类(该类使用了单例设计模式),可以对日期进行加减操作,获取类对象需要使用getInstance来获取
Calendar c = Calendar.getInstance();
//时间的获取操作
c.get(Calendar.YEAR);//获取年
c.get(Calendar.MONTH+1);//获取月
c.get(Calendar.DAT_OF_MONTH);//获取日
c.get(Calendar.HOUR_OF_DAY);//获取时
c.get(Calendar.MINUTE);//获取分
c.get(Calendar.SECOND);//获取秒
//时间的添加删除操作
c.add(Calendar.YEAR,100);
//时间的设置操作
c.set(Calendar.YEAR,1999);//设置年
c.set(Calendar.MONTH,9);//设置月
c.set(Calendar.DAT_OF_MONTH,2);//设置日
c.set(Calendar.HOUR_OF_DAY,10);//设置时
c.set(Calendar.MINUTE,10);//设置分
c.set(Calendar.SECOND,10);//设置秒
c.setTime(new Date);
正则表达式
可以判断字符串是否更具规则输入
规范 | 描述 | 规范 | 描述 | |
---|---|---|---|---|
\\ | 表示反斜线(\)字符 | \t | 表示制表符 | |
\n | 表示换行 | [abc] | 字符a、b、c | |
[^abc] | 除了abc以外的任何字符 | [a-zA-Z0-9] | 表示由字母、数字组成 | |
\d | 表示数字 | \D | 表示非数字 | |
\w | 表示字母,数字,下斜线 | \W | 表示非字母、数字、下斜线 | |
\s | 表示所有空白字符 | \S | 表示所有非空白字符 | |
^ | 行开头 | $ | 行的结尾 | |
. | 匹配除行之外的任何字符 |
规范 | 描述 | 规范 | 描述 | |
---|---|---|---|---|
X | 必须出现一次 | X? | 可以出现0次或1次 | |
X* | 必须出现0次、1次或多次 | X+ | 可以出现1次或n次 | |
X{n} | 必须出现n次 | X{n,} | 必须出现n次以上 | |
X{n,m} | 必须出现n~m次 |
规范 | 描述 | 规范 | 描述 | |
---|---|---|---|---|
XY | X规范后跟着Y规范 | X|Y | X规范或Y规范 | |
(X) | 做为一个捕获组规范 |
使用String.matches(regex)进行判断是否符合标准