StringBuffer类
用于频繁修改的字符串(大部分情况还是用String)
StringBuild类
StringBuilder类和StringBuffer一样,只不过是所有方法是异步的,而StringBuffer所有方法是同步的,加了synchronized修饰
(考虑多线程安全用StringBuffer,单线程用StringBuilder效率更高一点)
(通常使用字符串的情况还是选择常用的String类)
Runtime类
用于启动新的进程和运行时环境的相关操作,例如获取内存空间,释放垃圾空间等
(该类使用单例模式,用getRuntime()获取该类对象)
Runtime runtime=Runtime.getRuntime();
//最大可用内存,正常可用内存,当前空余内存,垃圾回收,调用画板进程并在2秒后关闭
System.out.println(runtime.maxMemory());
System.out.println(runtime.totalMemory());
System.out.println(runtime.freeMemory());
runtime.gc();
Process process=runtime.exec("mspaint.exe");
Thread.sleep(2000);
process.destroy();
设置初始化内存空间
每一块内存存在内存伸缩区,当内存不足就会动态开辟
totalMemory+内存伸缩区=maxMemory
可以通过启动参数设置初始化内存空间:-Xms初始内存,-Xmx最大内存,-Xmn年轻代堆内存
(在开发环境的VM ararguments中设置)
垃圾回收
GC垃圾收集器会不定期回收,也可以手动回收 runtime.gc(),是一种对内存空间释放的方式
垃圾回收主要针对新生代和旧生代进行回收(Young/Old Generation)
新生代内存空间存放刚产生的对象,经过若干次回收还未被回收的对象移动到旧生代
对新生代进行MinorGC(从垃圾回收),对旧生代进行MajorGC(主垃圾回收),两者互不干涉
Full GC完全回收是对新生代,旧生代同时回收,runtime.gc()就属于完全回收
垃圾回收采取分代回收策略,较高频率对新生代内存回收,较低频率对旧生代内存回收
java对象创建之后先存放在新生代,新生代内存不够则MinorGC,要是内存还是不够则则存入旧生代,旧生代内存不足进行MajorGC回收,如果旧生代底下的Tenured区(永久代)内存不够则Full GC,如果此时内存还是不够则内存溢出"OutOfMemoryError",程序中断
System类
提供系统的一些支持操作:数组复制,取得当前时间,垃圾回收等
//数组复制
String[] a={"zhangs","lisi"};
String[] b=new String[10];
System.arraycopy(a, 0, b, 0, 2);
System.out.println(b[0]);
//获取时间
long time1=System.currentTimeMillis();
for(int i=0;i<2;i++){
Thread.sleep(100);
}
long time2=System.currentTimeMillis();
System.out.println(time1+" "+time2);
//垃圾回收
System.gc();
System.gc()间接调用Runtime.gc(),两者作用相同
finalize()方法:回收前的收尾工作
可以在类中覆写该方法,会在该类被回收前调用
@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub
System.out.println("这是该类的对象被回收前的操作");
}
clone()方法:对象的克隆
类中覆写clone()方法
public class Animal {
private String a;
public Animal(String a) {
super();
this.a = a;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
Animal animal=new Animal("Cat");
Animal animal2=(Animal) animal.clone();
Math类
数学计算操作类
常用的有四舍五入round()方法
Math.round(f);
利用round()实现向上取整
(int) Math.round((f+0.5));
保留小数位的四舍五入
public static double round(double num,int scale){
return Math.round(num*Math.pow(10.0, scale))/Math.pow(10.0, scale);
}
Random类:随机数类
Random生成伪随机数,是根据种子数生成的随机数,知道种子数的情况下就能知道后续随机数的值
Random random=new Random() 无参构造会默认设置一个无法预测的种子数,这样具有更强的随机性
也可以手动设置种子Random random=new Random(long seed) ;种子数相同,生成的随机数序列也相同
Random random=new Random();
for(int i=0;i<10;i++){
System.out.println(random.nextInt(10));
}
BigInteger,BigDecimal:大整数操作类,大小数操作类
可以操作无限大的整型数据,可以操作无限大的小数
(这两个用到的比较少,请自行百度)
Date类:获取日期,操作日期
java.util.Date和java.sql.Date
java.sql.Date为java.util.Date的子类,用于JDBC的日期操作,平时都用java.util.Date
Date date=new Date();
System.out.println(date);
//当前日期的long型
System.out.println(date.getTime());
SimpleDateFormat日期格式化类
yyyy年,MM月,dd日,HH时,mm分,ss秒,SSS毫秒
//日期转String
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date date=new Date();
String s=simpleDateFormat.format(date);
System.out.println(s);
//String转Date
String dateString="2018-12-06 6:6:6.6";
Date date2=simpleDateFormat.parse(dateString);
System.out.println(date2);
(如果String设置了错误的日期会采取自动日期进位)
Calendar类:日期操作类,可以精确到毫秒
Calendar和Date相比更加强大,当然实现也更复杂
Calendar本身为抽象类,Calendar calendar=Calendar.getInstance()获取实例;
Calendar calendar=Calendar.getInstance();
System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.MONTH)+1);
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
System.out.println(calendar.get(Calendar.MINUTE));
System.out.println(calendar.get(Calendar.SECOND));
System.out.println(calendar.get(Calendar.MILLISECOND));
这里注意月份,月份起始从0开始,所以后面要+1显示
Arrays类:数组操作类
判断两个数组是否相等,数组内容填充,数组排序,数组二分查找,数组转字符串
int[] a=new int[]{1,2,3,7,8,9};
int[] b=new int[]{7,55,3,4,1,99,5};
//数组排序
Arrays.sort(b);
System.out.println(Arrays.toString(b));
//二分查找
System.out.println(Arrays.binarySearch(b, 3));
//数组填充
Arrays.fill(a, 11);
System.out.println(Arrays.toString(a));
//数组比较
System.out.println(Arrays.equals(new int[]{1, 2,3},new int[]{1, 2,3}));
数组二分查找之前必须先完成排序
比较器接口:Comparable
普通数组可以通过Arrays类来进行比较,排序等操作
而对象数组就必须实现比较器接口来进行比较,排序等操作,例:Apple[] apples=new Apple[10];
public interface Comparable<T> {
public int compareTo(T o);
}
三种返回值1,-1,0
本类大于另一个类返回1,小于返回-1,等于返回0
挽救比较器接口:Comparator
如果一个类在编写的时候没有考虑要排序,也没有实现比较器
之后使用的时候又想加上比较器的时候就使用挽救比较器接口:Comparator
public class AnimalComparator implements Comparator<Animal>{
@Override
public int compare(Animal o1, Animal o2) {
// TODO Auto-generated method stub
return 0;
}
}
Animal[] animals=new Animal[]{new Animal("1"),new Animal("2")};
Arrays.sort(animals,new AnimalComparator());
正则表达式
一种字符串操作的语法规则,主要用于格式验证
正则标记:http://www.runoob.com/regexp/regexp-metachar.html
Android 手机号格式验证(正则):https://blog.csdn.net/yh18668197127/article/details/85629597
Android 密码格式验证(正则):https://blog.csdn.net/yh18668197127/article/details/85633256
Pattern,Matcher类用于正则操作:是否匹配,根据正则匹配替换字符,根据正则进行字符串拆分等
//判断输入的格式是否为手机号
public boolean isPhone(String phone){
String regex="^1[3456789]\\d{9}$";
Pattern p=Pattern.compile(regex);
Matcher m=p.matcher(phone);
boolean isMatch=m.matches();
Log.i(TAG, "isPhone: 是否正则匹配"+isMatch);
return isMatch;
}
}
String类也有方法支持正则(功能和上面2个类一样,具体自行百度)
反射机制
https://blog.csdn.net/yh18668197127/article/details/86131365
国际化Locale类和ResourceBundle类
Locale(language,country),构造方法设置语言和国家编码
Locale.getDefault()获取当前语言环境的Locale对象
zh表示中文,CN表示中国
ResourceBundle类根据不同语言,国家环境获取不同的资源文件,因为基本不用所以这里不做介绍