实训篇:第十三天
程序员文章站
2022-03-16 21:34:35
...
1.字符串常量池
编辑,编译,运行
编译过程中会对字符串进行优化(目的是运行速度更快、节约空间):
把相同内容的字符串字面量放到字符串常量池中且只存放一份
package com.hpe.test.test1;
public class Test4 {
public static void main(String[] args) {
/*
* ==:
* 基本数据类型:值相等
* 引用数据类型:两个对象的地址是否相等
* Object:
* == 和 equals()作用相同
* String:
* == 判断两个对象的地址是否相等
* equals() 判断内容是否相同
*/
//常量池是放在静态全局区的,现在来看运行时分配的内存总共有堆栈全局区三部分
String str1 = "helloworld";
String str2 = "helloworld";
String str3 = "hello" + "world";
String str4 = new String("helloworld");
String str5 = "hello" + new String("world");
//程序一加载,hellworld只放一份到池中,一份hello,一份world,暂时可以把它们当做static的
System.out.println(str1 == str2);//true
//hello 和 world是两个常量,常量在编译时会计算它们的值,str1和str3的值相同,且str1对应的字面量已经存储在池中,故还是只放一份
System.out.println(str1 == str3);//true
//new出来的区域在堆上,如果发现常量池中有对应字面量,会在堆上创建一个String,然后让这个String存储的地址为池中的字面量存储的地址
System.out.println(str1 == str4);//false
//也new出来了一部分,这个new的部分最后也是指向了同一个字符串常量的位置
System.out.println(str1 == str5);//false
//不推荐new,直接赋值创建比较好
//字符串长度不可改变
str1 = "aaaa";
//不是说helloworld->aaaa,而是str1重新存储地址为aaaa的地址,而不再存储helloworld的地址,并没有改变helloworld的地址
}
}
2.StringBuffer,StringBuilder
大量字符串拼接用+非常消耗内存空间(堆上new很多String)
StringBuffer:
构造:
StringBuffer()
StringBuffer(int size)
StringBuffer(String str)
添加:
StringBuffer append(String str)
转换为String:
String toString()
StringBuilder:
和StringBuffer类似,但StringBuffer是线程同步的,StringBuilder是线程不同步(不安全)的
3.时间日期相关类
很多编程语言中起始时间为1970年1月1日00:00:00(从起始时间-现在经过的ms数)
java.util.Date表示特定的瞬间,精确到ms,该类中很多方法都已弃用
创建:
Date date = new Date();
Date date = new Date([从1970年1月1日00:00:00至今经历的ms数,是一个long类型变量]);
其他主要方法:
boolean after(Date anotherDate):测试此日期是否在指定日期之后
boolean before(Date anotherDate):测试此日期是否在指定日期之前
int compareTo(Date anotherDate):比较两个日期的顺序
long getTime():返回从1970-01-01 00:00:00至今的ms数返回
void setTime(long time)
String toString():默认打印时间格式是:星期 月份 年份 时间 CST ...
如何以特定的格式打印时间:
SimpleDateFormat-格式化日期
//一般常用于存储精确时间至数据库中以及从数据库中精确时间转为特定格式时间的显示,其中mysql有个时间戳类型是用来存储从1970-01-01 00:00:00至今的毫秒值
Date date = new Date();
SimpleDateFormat smt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//填一个pattern,java.text.SimpleDateFormat
System.out.println(date);
System.out.println(date.getTime());
//格式化日期
String dataStr= smt.format(date);//返回字符串,即按照"yyyy-MM-dd HH:mm:ss"显示的时间,其中y,M,d等不能大小写混写,大小写有特殊含义,见api
System.out.println(dataStr);
//解析特定格式的字符串->date 且进行异常的处理
Date date2 = smt.parse("2008-08-08 08:08:08");//传特定格式的字符串sourc
e,之后它就会转换为Date对象,其中给定字符串要符合最上面pattern的格式
System.out.println(date2);
4.Calendar :日历类,Date类的进阶
public static void main(String[] args) {
//创建Calendar
//get()方法获取
Calendar cal = Calendar.getInstance();
System.out.println(cal.get(Calendar.YEAR));
System.out.println(cal.get(Calendar.MONTH));//MONTH从0开始
System.out.println(cal.get(Calendar.DAY_OF_MONTH));
System.out.println(cal.get(Calendar.DAY_OF_WEEK));//外国从星期天作为第1天,所以星期一返回2
//set()
/*
* 如何确定某个月的第一天是周几
* 获取一个Calendar,该Calendar能表示某个月的第一天,然后get它的DAY_OF_WEEK就知道了那一天是星期几
*
*
*/
Calendar cal1 = Calendar.getInstance();
cal1.set(Calendar.YEAR, 2020);//设置2020年
cal1.set(Calendar.MONTH, 0);//设置1月
cal1.set(Calendar.DAY_OF_MONTH, 1);//设置1日
System.out.println(cal1.get(Calendar.DAY_OF_WEEK));//从星期天开始计数
//打印任意月份的万年历
}
//打印万年历
package com.hpe.test.test2;
import java.util.Calendar;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
/* 打印任意月份的万年历
* 1.这个月一共有几天
* 2.这个月的1号的周几
*/
Scanner sc = new Scanner(System.in);
System.out.println("请输入年:");
int year = sc.nextInt();
System.out.println("请输入月:");
int month = sc.nextInt();
int days = 0;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
case 4:
case 6:
case 9:
case 11:
days = 30;
case 2://能被4但不能被100整除或能被400整除
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
days = 29;
} else {
days = 28;
}
break;
default:
break;
}
//确定第一天是周几
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2020);
cal.set(Calendar.MONTH, month - 1);
cal.set(Calendar.DAY_OF_MONTH, 1);
int weekNum = cal.get(Calendar.DAY_OF_WEEK);
//打印万年历
System.out.println("日\t一\t二\t三\t四\t五\t六");
/*打印日期
* 1.1号之前的空格
* 2.1~...
* 3.每七天换行-计数器
*/
int count = 0;
//打印空格
for (int i = 1; i < weekNum; i++) {
System.out.print("\t");
count++;
}
//打印真正的日期
for (int i = 1; i <= days; i++) {
System.out.print(i+"\t");
count++;
if (count % 7 == 0) {
System.out.println();
}
}
}
}
5.