日期时间类
Date类
- 概述
- 常用方法:
- Date中的大多数方法都已经过时,常用的方法有:
public long getTime()
把日期对象转换为对应的时间毫秒值。
- Date中的大多数方法都已经过时,常用的方法有:
- DateFormat类
- 格式规则:常用的格式规则为:
标识字母(区分大小写) | 含义 |
---|---|
y | 年 |
M | 月 |
d | 日 |
H | 时 |
m | 分 |
s | 秒 |
- 创建SimpleDateFormat对象的代码如:
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo04 {
public static void main(String[] args) {
DateFormat fm = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
System.out.println(fm);
}
}
- 常用方法:
public String format(Date date)
:将Date对象格式化为字符串public Date parse(String source)
:将字符串解析为字符串对象
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
//1.将Date对象格式化为字符串
public class Demo04 {
public static void main(String[] args) {
DateFormat fm = new SimpleDateFormat("yyyy年MM月dd HH:mm:ss");
System.out.println(fm);
Date date = new Date();
String str = fm.format(date);
System.out.println(str);
}
}
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
//2.将字符串解析为字符串对象
public class Demo04 {
public static void main(String[] args) throws ParseException {
DateFormat fm = new SimpleDateFormat("yyyy年MM月dd HH:mm:ss");
System.out.println(fm);
Date date = new Date();
String str = fm.format(date);
Date date1 = fm.parse(str);
System.out.println(date1);
}
}
- Calendar类
- 概念:
java.util.Calendar
是日历类,在Date后出现,替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量,方便获取。日历类就是方便获取各个时间属性的。 - 获取方式:Calendar为抽象类,由于语言敏感性,Calendar类在创建对象时并直接创建,而实通过静态方法创建,返回子类对象,如下:
- Calendar静态方法
public static CalendargetInstance()
:使用默认时区和语言环境获得一个日历
- 例如:
- 概念:
public class Demo06 {
public static void main(String[] args) {
//获取Calender的对象
Calendar ca = Calendar.getInstance();
}
}
-
常用方法:
-
上述方法的示例:
import java.util.Calendar;
import java.util.Date;
public class Demo06 {
public static void main(String[] args) {
//获取Calender的对象
Calendar ca = Calendar.getInstance();
//返回日历给定字段的值
int a = ca.get(Calendar.YEAR);
int b = ca.get(Calendar.MONTH)+1;
int c = ca.get(Calendar.DAY_OF_MONTH);
int d = ca.get(Calendar.DAY_OF_WEEK)-1;
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println("=============================");
//将给定的日历字段设置为给定的值
ca.set(Calendar.YEAR,2022);
ca.set(Calendar.MONTH,7);
System.out.println(ca.get(Calendar.YEAR));
System.out.println(ca.get(Calendar.MONTH));
System.out.println("=============================");
//根据日历的规则,为给定的日历字段添加或减去指定的时间量
ca.add(Calendar.YEAR,-3);
ca.add(Calendar.DAY_OF_MONTH,3);
System.out.println(ca.get(Calendar.YEAR));
System.out.println(ca.get(Calendar.MONTH));
System.out.println("=============================");
//返回一个表示此Calendar时间值,(从历元到现在的毫秒偏移量)的Date对象
Date date = ca.getTime();
System.out.println(date);
}
}
System类
- currentTimeMillis方法:
- 实际上currentTimeMillis方法就是获取当前系统时间与1970年01月01日00:00点之间的毫秒差值。
import java.util.Date;
public class Demo07 {
public static void main(String[] args) {
//获取当前毫秒时间值
System.out.println(System.currentTimeMillis());
Date date = new Date();
System.out.println(date.getTime());
}
}
- 练习:验证for循环打印数字1-10000000所需要使用的时间(毫秒)
public class Demo08 {
public static void main(String[] args) {
long begin = System.currentTimeMillis();
print();
long end = System.currentTimeMillis();
System.out.println(end - begin);
}
public static void print() {
for (int i = 0;i<10000000;i++) {
}
}
}
- arraycode方法
- 练习:
import java.util.Arrays;
public class Demo09 {
public static void main(String[] args) {
int[] arr1 = new int[]{10,20,30,40,50,60,70,80,90};
int[] arr2 = new int[9];
System.arraycopy(arr1,0,arr2,0,7);
System.out.println(Arrays.toString(arr2));
printArray(arr2);
}
public static void printArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
StringBuilder类
- 字符串拼接问题
-
在API中对String类有这样的描述:字符串是常量,它们的值在创建后不能被更改。
-
根据这句话分析我们的代码,其实总共产生了三个字符串,即
"Hello"
、"World"
和"HelloWorld"
。引用变量s首先指向Hello对象,最终指向拼接出来的新字符串对象,即HelloWord
。 -
如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。为了解决这一问题,可以使用
java.lang.StringBuilder
类。
-
StringBulider概述
-
查阅
java.lang.StringBuilder
的API,StringBuilder
又称为可变字符序列,它是一个类似于 String 的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容。 -
原来
StringBuilder
是个字符串的缓冲区,即它是一个容器,容器中可以装很多字符串。并且能够对其中的字符串进行各种操作。 -
它的内部拥有一个数组用来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容。
StringBuilder
会自动维护数组的扩容。(默认16字符空间,超过自动扩充)
-
-
构造方法
- 根据StringBuilder的API文档,常用构造方法有2个:
public StirngBuilder()
:构造一个空的StringBuilder容器。public StirngBuilder(String str)
:构造一个空的StringBuilder容器,并将字符串添加进去。
public class Demo11 {
public static void main(String[] args) {
StringBuilder str = new StringBuilder();
System.out.println(str);//空白
StringBuilder str1 = new StringBuilder("9527");
System.out.println(str1);//9527
}
}
- 常用方法
- StringBuilder常用的方法有两个:
- public StringBuilder append(…):添加任意类型数据的字符串形式,并返回当前对象自身。
- public String toString():将当前StringBuilder对象转换为String对象。
- StringBuilder常用的方法有两个:
public class Demo10 {
public static void main(String[] args) {
long begin = System.currentTimeMillis();
stringTest();
long end = System.currentTimeMillis();
System.out.println(end - begin);
begin = System.currentTimeMillis();
stringBuilder();
end = System.currentTimeMillis();
System.out.println(end - begin);
begin = System.currentTimeMillis();
stringBuffer();
end = System.currentTimeMillis();
System.out.println(end - begin);
}
public static void stringTest() {
String str = "";
for (int i = 0;i<100000;i++) {
str+=i+"";
}
System.out.println(str);
}
public static void stringBuilder() {
StringBuilder str = new StringBuilder();
for (int i = 0;i<100000;i++) {
str.append(i);
}
System.out.println(str);
}
public static void stringBuffer() {
StringBuffer str = new StringBuffer();
for (int i = 0;i<100000;i++) {
str.append(i);
}
System.out.println(str);
}
}
- toString方法
- 通过toString方法,StringBuilder对象将会转换为不可变的String对象。如:
public class Demo12 {
public static void main(String[] args) {
StringBuilder str = new StringBuilder("Hello").append("world").append("Java");
String str1 = str.toString();
System.out.println(str);
}
}
- String、StringBuffer、StringBuilder的区别
- StringBuffer、StringBuilder和String一样,也用来代表字符串。String类是不可变类,任何对String的改变都 会引发新的String对象的生成;StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象。既然可变和不可变都有了,为何还有一个StringBuilder呢?相信初期的你,在进行append时,一般都会选择StringBuffer吧!
- 先说一下集合的故事,HashTable是线程安全的,很多方法都是synchronized方法,而HashMap不是线程安全的,但其在单线程程序中的性能比HashTable要高。
- StringBuffer和StringBuilder类的区别也是如此,他们的原理和操作基本相同,区别在于StringBufferd支持并发操作,线性安全的,适 合多线程中使用。StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。