Java学习
StringBuffer和StringBuilder
-
StringBuffer
- 可变长字符串,JDK1.0提供,运行效率慢、线程安全
-
StringBuilder
- 可变长字符串,JDK5.0提供,运行效率快,线程不安全
public class Demo05 {
//StringBuffer和StringBuilder
//比String快、节省内存
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
//StringBuilder sb = new StringBuilder();//和StringBuffer结果一样
//append();追加
sb.append("java,");
System.out.println(sb.toString());
sb.append("C++");
System.out.println(sb.toString());
//insert();添加
sb.insert(0,"天下第一语言:");
System.out.println(sb.toString());
//replace();替换
sb.replace(7,11,"Java");//不包括end
System.out.println(sb.toString());
//delete();删除
sb.delete(11,15);//下标
System.out.println(sb.toString());
//reverse();逆置
sb.reverse();
System.out.println(sb.toString());
}
}
public class Demo06 {
//StringBuilder比StringBuffer效率高
public static void main(String[] args) {
//开始时间
long start = System.currentTimeMillis();
// String str = "";
// for (int i = 0; i < 99999; i++) {
// str += i;
// }
// System.out.println(str);//用时:55778
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 99999; i++) {
sb.append(i);
}//用时:7
long end = System.currentTimeMillis();
System.out.println("用时:"+(end-start));
}
}
BigDecimal
- 精确计算浮点数
public class Demo07 {
public static void main(String[] args) {
//double存的是近似值
double d1 = 1.0;
double d2 = 0.9;
System.out.println(d1-d2);//0.09999999999999998
//面试题
double result = (1.4 - 0.5)/0.9;
System.out.println(result);//0.9999999999999999
//BigDecimal,大浮点数精确计算
//本身1.0和0.9就是不精确的,所以用字符串传值
BigDecimal b1 = new BigDecimal("1.0");
BigDecimal b2 = new BigDecimal("0.9");
//运算用方法
BigDecimal ret = b1.subtract(b2);//减法
System.out.println(ret);//0.1
//加法
BigDecimal add = b1.add(b2);
System.out.println(add);
//乘法
BigDecimal multiply = b1.multiply(b2);
System.out.println(multiply);
//除法
BigDecimal divide = b1.divide(b2,3,BigDecimal.ROUND_HALF_UP);//除不尽,保留三位小数,并四舍五入
//scale:精确到小数点后几位
//ROUND_HALF_UP:小数部分四舍五入
System.out.println(divide);
}
}
Data
- Data表示特定的瞬间,精确到毫秒。Data类中的大部分方法都已经被Calendar类中的方法所取代。
- 时间单位
- 1秒=1000毫秒
- 1毫秒=1000微秒
- 1微妙=1000纳秒
import java.util.Date;
public class Demo08 {
public static void main(String[] args) {
//1.创建Data对象
//今天
Date date = new Date();
System.out.println(date.toString());//Thu Jan 28 15:28:13 CST 2021
System.out.println(date.toLocaleString());//2021-1-28 15:28:13
//昨天
Date d1 = new Date(date.getTime()-(60*60*24*1000));//一天有多少毫秒
System.out.println(d1.toLocaleString());
//after和before
boolean b1 = date.after(d1);//true,今天在昨天之后
boolean b2 = date.before(d1);//false,今天不再昨天之前
System.out.println(b1);
System.out.println(b2);
//compareTO();比较
int result = date.compareTo(d1);//1,结果不是差,而是正数或负数
System.out.println(result);
//equals();
boolean b = date.equals(d1);
System.out.println(b);//false
}
Calendar
- Calendar提供了获取或设置各种日历字段的方法
- 构造方法
- protected Calendar():由于修饰符是protected,所以无法直接创建对象。
import java.util.Calendar;
public class Demo09 {
public static void main(String[] args) {
//1.创建Calendar对象
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime().toLocaleString());//2021-1-28 15:44:50
System.out.println(calendar.getTimeInMillis());//1970到现在的毫秒值
//获取时间信息
int year = calendar.get(calendar.YEAR);
int month = calendar.get(calendar.MONTH);
int day = calendar.get(calendar.DAY_OF_MONTH);//Date
int hour = calendar.get(calendar.HOUR_OF_DAY);//24小时制,HOUR12小时制
int second = calendar.get(calendar.SECOND);
System.out.println(year+"年"+month+"月"+day+"日"+hour+":"+second);//月是从0~11
//修改时间
Calendar c2 = Calendar.getInstance();
c2.set(Calendar.DAY_OF_MONTH,13);
System.out.println(c2.getTime().toLocaleString());
//add();
c2.add(Calendar.HOUR,-1);
System.out.println(c2.getTime().toLocaleString());
//获取月的最大最小值
int max = c2.getActualMaximum(Calendar.DAY_OF_MONTH);
int min = c2.getActualMinimum(Calendar.DAY_OF_MONTH);
System.out.println(max);
System.out.println(min);
}
SimpleDateFormat类
- SimpleDateFormat是一个以语言环境有关的方式来格式化和解析日期的具体类
- 格式化(日期->文本),解析(文本->日期)
- 常用时间模式字母
字母 | 日期或时间 |
---|---|
y | 年 |
M | 年中月份 |
d | 月中天数 |
H | 1天中小时数(0-23) |
m | 分钟 |
s | 秒 |
S | 毫秒 |
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo10 {
public static void main(String[] args) {
//创建SimpleDateFormat对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");//格式,分割符自己定义,但字母必须按照这种写
//创建Date
Date date = new Date();
//格式化,把日期转字符串
String str = sdf.format(date);
System.out.println(str);
//解析,把字符串转日期
Date parse = null;
try {
parse = sdf.parse("2000年00月00日 00:00:00");
} catch (ParseException e) {
e.printStackTrace();
}
Date d2 = parse;//
System.out.println(d2);
}
}
System类
- 获取系统的属性数据和其他操作,直接调用
import java.util.Arrays;
public class Demo11 {
public static void main(String[] args) {
//arraycopy:数组复制
//src:原数组
//srcPos:从哪里开始复制
//dest:目标数组
//destPos:目标数组的位置
//length:复制长度
int[] arr = {1,2,3,4,5,6,7,8};
int[] dest = new int[8];
System.arraycopy(arr,4,dest,4,4);
for (int i : dest) {
System.out.println(i);
}
//Arrays.copyOf()用的是System.arraycopy();、
//System.arraycopy()用的JVM,效率高
//计时
long start = System.currentTimeMillis();
for (int i = 0; i < 9999; i++) {
for (int i1 = 0; i1 < 9999; i1++) {
int result = i + i1;
}
}
long end = System.currentTimeMillis();
System.out.println("用时"+(end-start));
//System.gc();回收垃圾
new Person("a",1);
new Person("b",1);
new Person("c",1);
System.gc();//创建了三个对象却没有任何引用,一创建就是垃圾
//退出
System.exit(0);//0正常退出,其他是异常退出
System.out.println("123");//已退出了,无法打印
}
}