Java基础第二遍-15-常用对象2
常用对象
StringBuffer(线程安全,做了线程同步)
介绍
- 字符串的组成原理就是通过该类实现的
- StringBuffer可以对字符串内容进行增删
- StringBuffer是一个容器(字符串缓冲区)
- 很多方法于String相同
- StringBuffer是可变长度(初始默认长度为16个字符,超过的也可以存储)
基本操作
-
添加,可以是任意类型的数据,byte和short可以自动转型为int
-
插入
-
删除
-
修改
-
package com.bixiangdong.api; public class StringBuffer1 { public static void main(String[] args) { testAppend(); testInsert(); testReplace(); testDelete(); } public static void testAppend(){ //创建缓冲区对象 StringBuffer sb = new StringBuffer(); //执行添加方法 sb.append(3); sb.append("fdsa"); System.out.println(sb); } public static void testInsert(){ //创建缓冲区对象 StringBuffer sb = new StringBuffer(); //执行插入 sb.append("3fdsafd"); sb.insert(1,"fdsa");//从插入到下标为1的地方 System.out.println(sb); } public static void testDelete(){ //创建缓冲区对象 StringBuffer sb = new StringBuffer(); //执行删除方法 sb.append("fdsafsda"); sb.delete(1,3);//包含头不包含尾 //清空 sb=new StringBuffer(); sb.delete(0,sb.length()); System.out.println(sb); } public static void testReplace(){ //创建缓冲区对象 StringBuffer sb = new StringBuffer(); //执行替换方法 sb.append("fdsafdsa"); sb.replace(1,3,"fdsafds");//替换一个区域 sb.setCharAt(1,'d');//替换单个位置 System.out.println(sb); } }
StringBuilder(线程不安全,没有做同步)
-
不保证同步,线程不安全
-
功能于StringBuffer一模一样
-
因为是线程不同步的,不需要判断锁,那么其执行速度一定比StringBuffer快
-
//模拟StringBuffer添加同步 class StringBuffer{ Object lock; public StringBuffer append(int x){ synchronized (lock){ } return null; } public StringBuffer delete(int x){ synchronized (lock){ } return null; } }
练习
- 下面哪种方式好?
- 使用StringBuilder要更好一些,因为是同一个对象可变长操作,而String操作的话就会在String常量池中产生很多字符串,很浪费空间
package com.bixiangdong.api;
public class Demo03 {
public static void main(String[] args) {
char[] arr = {'a','j','y','g','s','f','3'};
System.out.println(transString(arr));
System.out.println(transString1(arr));
}
//将字符数组转换为字符串-StringBuilder
static String transString(char[] arr){
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]);
}
sb.append("]");
return sb.toString();
}
//将字符数组转换为字符串-String
static String transString1(char[] arr){
String str = "[";
for (int i = 0; i < arr.length; i++) {
str=str+arr[i];
}
str=str+"]";
return str;
}
}
System类
- err //标准错误流
- in //标准输入流
- out //标准输出流
- currentTimeMillis(); //返回当前时间毫秒值
- getProperties(); //获取当前系统属性,返回一个properties集合
- setProperty(); //给系统设置一些属性,是全局的,其他的程序也可以获取到
Runtime类
- 没有构造方法摘要,说明不能创建对象
- 单例设计模式
Math类
- ceil();//返回大于参数的最小整数
- floor();//返回小于参数的最大整数
- round();//返回四舍五入的整数
- pow(a,b);//a的b次幂
- random();//返回一个double随机数(伪随机,具有一定规律)
Date类
- setTime();//设置毫秒值
- getTime();//获取毫秒值
- 毫秒值的作用,用于时间运算
DateFormat日期格式转换
-
对日期进行格式化
//DateFormat提供的默认的日期实例 DateFormat dateInstance = DateFormat.getDateInstance(); DateFormat dateInstance2 = DateFormat.getDateInstance(DateFormat.FULL); //DateFormat的子类-自定义日期风格 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
-
字符串转换为日期对象
//DateFormat的子类-自定义日期风格 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); String str = "2021--10--10"; Date parse = dateFormat.parse(str);
-
练习
package com.bixiangdong.api; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; //练习:计算两个时间之间相差多少天 public class Demo04 { public static void main(String[] args) throws ParseException { String str1="2021-10-10"; String str2="2021-10-11"; //像将其转为日期对象 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date parse = simpleDateFormat.parse(str1); Date parse1 = simpleDateFormat.parse(str2); //获取其毫秒值 long time = parse.getTime(); long time1 = parse1.getTime(); //计算两毫秒值的差值 long x = time-time1; //计算多少天 int day = getDay(x); System.out.println(day); } public static int getDay(long x) { return (int)(Math.abs(x)/1000/60/24/60); } }
Calendar类
-
练习:打印一个年的2月的最后一天
public class Demo05 { public static void main(String[] args) { DateFormat dateInstance = DateFormat.getDateInstance(); System.out.println(dateInstance.format(get2LastDay(2021))); } public static Date get2LastDay(int year) { Calendar calendar = Calendar.getInstance(); calendar.set(year,2,1); //将月向前偏移一天,就是2月的最后一天 calendar.add(Calendar.DAY_OF_MONTH,-1); return calendar.getTime(); } }