JavaSE学习笔记 Day16
个人整理非商业用途,欢迎探讨与指正!!
<< 上一篇
文章目录
- [JavaSE学习笔记 Day16](#JavaSE学习笔记 Day16)
···
13.4java.sql.Date类型
java.util.Date的子类
常用于JDBC中
java
package com.qf.test;
//import java.sql.Date;
public class Demo02 {
public static void main(String[] args) {
// 没有空的构造方法
// System.currentTimeMillis() 获取当前系统时间的毫秒数
java.sql.Date date = new java.sql.Date(System.currentTimeMillis());
System.out.println(date);
// 同名类的引入
java.sql.Date date2 = new java.sql.Date(new java.util.Date()/*使用全限定名的形式引入*/.getTime());
System.out.println(date2);
java.util.Date d3 = new java.util.Date();
java.sql.Date d4 = new java.sql.Date(10000);
}
}
13.5SimpleDateFormat类
日期格式化,将日期和字符串之间进行转换
java.util.Date和String类型
java
public class Demo03 {
// 日期转换为字符串
public static void main(String[] args) {
// 日期格式化对象
SimpleDateFormat sdf = new SimpleDateFormat();
// 日期对象
Date d1 = new Date();
// 将日期进行转换(按照默认格式,例如:23-12-12 上午9:08)
String format = sdf.format(d1);
System.out.println(format);
System.out.println("---------------------------------");
// yyyy年 MM月份 dd日期 HH小时 mm分钟 ss秒
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
format = sdf.format(d1);
System.out.println(format);
System.out.println("---------------------------------");
// yyyy年 MM月份 dd日期 HH小时 mm分钟 ss秒
sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
format = sdf.format(d1);
System.out.println(format);
System.out.println("---------------------------------");
// yyyy年 MM月份 dd日期 HH小时 mm分钟 ss秒
sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
format = sdf.format(d1);
System.out.println(format);
}
}
java
public class Demo04 {
// 将字符串转换为日期类型
public static void main(String[] args) {
// 按照默认格式进行String to Date
SimpleDateFormat sdf = new SimpleDateFormat();
String format = "23-12-12 上午9:11";
try {
Date d = sdf.parse(format);//当前方法存在异常,必须处理的
System.out.println(d);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("--------------------------------");
// 按照指定的格式进行转换为日期
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
format = "2023-12-12 09:25:20";
try {
Date d = sdf.parse(format);
System.out.println(d);
} catch (ParseException e/*编译期异常*/) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
13.6Calendar类
日历类,官方提出代理java.util.Date的方案
一个抽象类
java
public class Demo05 {
// 日历类
public static void main(String[] args) {
// 内部提供了一个获取当前实例的方法
Calendar c = Calendar.getInstance();
// 有对象实例就可以调用内部的方法
// get方法:取值
System.out.println(c.get(Calendar.YEAR));
System.out.println(c.get(Calendar.MONTH) + 1 );//从0开始的
System.out.println(c.get(Calendar.DATE));
System.out.println(c.get(Calendar.DAY_OF_MONTH));
System.out.println(c.get(Calendar.DAY_OF_WEEK));//周日开始
System.out.println(c.get(Calendar.DAY_OF_WEEK_IN_MONTH));//当前周是这个月的第几周
System.out.println(c.get(Calendar.HOUR_OF_DAY));//24进制的
System.out.println(c.get(Calendar.HOUR));//12进制的
System.out.println(c.get(Calendar.DAY_OF_YEAR));
System.out.println(c.get(Calendar.SECOND));
// set方法:赋值
c.set(Calendar.MONTH, 1);
c.set(Calendar.DAY_OF_WEEK, 3);
System.out.println(c);
// add方法:添加
c.add(Calendar.YEAR, 1);
System.out.println(c);
c.add(Calendar.YEAR, -2);
System.out.println(c);
}
}
java
public class Test01 {
// 方法定义:传入年和月,打印对应的日历
// 星期日 星期一 星期二 星期三 星期四 星期五 星期六
public static void print(int year,int month) {
// 获取当前的系统时间
Calendar c = Calendar.getInstance();
// 通过year和month来创建对应年的 指定月份的1号
c.set(year, month - 1, 1);
// System.out.println(c);
System.out.println(year+"年"+month+"月的日历如下:");
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t");
// 获取1号的位置 需要确定1号以前的空格数
int weekDay = c.get(Calendar.DAY_OF_WEEK);
// System.out.println(weekDay);
// 1号以前的空格
for(int i = 1;i<weekDay;i++) {
System.out.print("\t");
}
// 获取当前的月份
int mm = c.get(Calendar.MONTH);
// 自增的月份==当前需要打印的月
while(mm == month - 1) {
// 获取天数
int day = c.get(Calendar.DATE);
System.out.print(day + "\t");
// 换行
weekDay = c.get(Calendar.DAY_OF_WEEK);
// 若当前的日期和星期六一致,就换行
if(weekDay == Calendar.SATURDAY) {
System.out.println();
}
// 循环变化
c.add(Calendar.DATE, 1);
// 重新获取月份
mm = c.get(Calendar.MONTH);
}
}
public static void main(String[] args) {
print(2023, 12);
}
}
13.7System类
系统类
java
public class Demo06 {
public static void main(String[] args) {
// 获取当前系统时间毫秒数
long start = System.currentTimeMillis();
for(int i = 1;i<=100000000;i++);
long end = System.currentTimeMillis();
System.out.println("100000000次循环的执行时间为:"+(end - start)+"毫秒");
// 终止虚拟机 在开发过程中禁止使用,一般在测试工作中可以使用
// 0表示虚拟机正常终止 非0表示异常终止
System.exit(0);
System.out.println("我还能执行到吗?");
}
}
13.8Math类
数学类,内部都静态成员
java
public class Demo07 {
public static void main(String[] args) {
// 参数1的参数2次方
System.out.println(Math.pow(2, 2));
System.out.println(Math.pow(2, 4));
System.out.println(Math.pow(2, 3.5));
// 开平方
System.out.println(Math.sqrt(4));
System.out.println(Math.sqrt(-1));//i
// 开三次方
System.out.println(Math.cbrt(27));
System.out.println(Math.max(10, 20));
System.out.println(Math.min(10, 20));
// 向上取整
System.out.println(Math.ceil(10.01));
// 向下取整
System.out.println(Math.floor(10.01));
// 四舍五人
System.out.println(Math.round(10.5));
System.out.println(Math.round(10.4));
}
}
13.9Random类
随机类
java
public class Demo08 {
public static void main(String[] args) {
Random r = new Random();
boolean b = r.nextBoolean();//true false的随机
System.out.println(b);
double d = r.nextDouble();//double范围内的随机
System.out.println(d);
int i = r.nextInt();//int范围内随机
System.out.println(i);
i = r.nextInt(10);//生成0~9的随机数
System.out.println(i);
}
}
13.10BigDecimal类
java中最大的数值类型,更精准的浮点数
java
public class Demo09 {
public static void main(String[] args) {
double a = 0.1;
double b = 0.2;
System.out.println(a + b);
// 更精准的浮点数,java中最大的数值类型
BigDecimal b1 = new BigDecimal("0.1");
BigDecimal b2 = new BigDecimal("0.2");
// 加法
System.out.println(b1.add(b2));
// 减法
System.out.println(b1.subtract(b2));
// 乘法
System.out.println(b1.multiply(b2));
// 除法
System.out.println(b1.divide(b2));
}
}
十四、字符串
java中提供两种字符串:定长字符串,变长字符串
定长:String
变长:StringBuffer,StringBuilder
java中的字符串都是有final修饰的类
14.1String
14.1.1String的不可变性
String类表示字符串,java中所有的字符串都是它的实例
String类由final修饰,不可以被继承
String的内容是不可以被修改的
底层是private final char value[];final修饰的数组,String中的所有构造方法都为value进行赋值,因为是final修饰的,所以String不可以被修改
在jdk1.9时改为private final byte value[];
java
public class Demo01 {
public static void main(String[] args) {
// 基本类型和String进行方法内部无论怎么进行变化,都对外部没有影响
String str = "hello";
// 进行字符串拼接
str.concat("world");
System.out.println(str);
// 使用变量的重新赋值
str = str.concat("world");
System.out.println(str);
str = "你好世界";//在String的底层中使用final修饰,final变量不可改变
test(str);
System.out.println(str);
}
public static void test(String str) {
str = "helloworld";
}
}
14.1.2String对象的创建
1.使用""直接赋值
java中的基本类型和String,这些类型为了在程序中更快的使用,更节省内存,java中提供常量池的概念
常量池中的内容都是唯一的
2.使用new创建对象
new出来的对象都在堆中
java
public class Demo02 {
public static void main(String[] args) {
// 1.使用=""赋值
String name1 = "bmh";
String name2 = "bmh";
//都来自于常量池中
System.out.println(name1 == name2);//比较地址
System.out.println(name1.equals(name2));
// 2.new对象的形式
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2);//一个new一个地址
System.out.println(str1.equals(str2));
}
}
14.1.3String的构造方法
java
public class Demo03 {
public static void main(String[] args) {
// 1.空构造
String str1 = new String();
System.out.println(str1);
System.out.println(str1.equals(""));//""不是null
System.out.println(str1.equals(null));
// 任何由null进行调用都会抛出NPE异常(NullPointerException)
str1 = null;
// System.out.println(str1.equals(""));
System.out.println("".equals(str1));//将一定不为空的值做为调用者
// 2.使用char[]进行字符串的创建
char[] cs = {'a','b','c','d','e'};
String str2 = new String(cs);
System.out.println(str2);
// 从下标1开始,长度为2
str2 = new String(cs,1,2);
System.out.println(str2);
// 字符串的下标同样从0开始,若越界StringIndexOutOfBoundsException
/*str2 = new String(cs,5,1);
System.out.println(str2);*/
// 3.通过byte[]数组创建
byte[] bs = {95,96,97,98,99};
String str3 = new String(bs);
System.out.println(str3);
str3 = new String(bs,1,2);
System.out.println(str3);
}
}
14.1.4String的方法
java
String str = "abcdefghaijk";
// 返回字符串指定下标的内容
System.out.println(str.charAt(0));
// System.out.println(str.charAt(-1));
// 找到参数在字符串中的位置
System.out.println(str.indexOf('a'));
System.out.println(str.indexOf('z'));
System.out.println(str.indexOf(97));//ascII做为参数
System.out.println(str.indexOf("a"));
System.out.println(str.indexOf("a", 5));//从下标5开始,去找a
System.out.println(str.lastIndexOf("a"));//从后向前第一次遇见的a
System.out.println(str.length());
System.out.println("-------------------------");
// 比较方法
System.out.println("abc".equals("abc"));
System.out.println("abc".equalsIgnoreCase("ABC"));//忽略大小写
System.out.println("".isEmpty());//判断是否为空串
System.out.println("abc".endsWith("bc"));
System.out.println("abc".startsWith("a"));
System.out.println("abc".contains("b"));//是否包含某个字符,调用的是indexOf
// 设置方法
System.out.println("hello".concat("world"));//字符串拼接
System.out.println("helloworld".replace("ll", "*****"));//替换
System.out.println("helloworld".substring(2));//字符串截取,从某个位置开始截取到结尾
System.out.println("helloworld".substring(2,6));//字符串截取,从某个位置开始截取到某个位置,长度为参数2-参数1
System.out.println("--------------------------------");
String str = "zs,ls,ww,zl";
String[] split = str.split(",");//按照,进行裁剪
for (String string : split) {
System.out.println(string);
}
split = str.split("");//按照""进行裁剪
for (String string : split) {
System.out.println(string);
}
System.out.println("--------------------------------");
System.out.println(" tom ".trim().length());//去除前后空格
char[] charArray = "helloworld".toCharArray();//将字符串转换为char[]
for (char c : charArray) {
System.out.println(c);
}
byte[] bytes = "helloworld".getBytes();
System.out.println(Arrays.toString(bytes));
System.out.println("helloworld".toUpperCase());
System.out.println("HELLOWORLD".toLowerCase());
// 其他类型转换为字符串
System.out.println(10 + "");
System.out.println(String.valueOf(new Integer(10)) + 10);
System.out.println(new Integer(10).toString() + 10);
String str1 = "hello";
String str2 = new String("hello");
String str3 = str2.intern();//返回字符串的常量池地址
System.out.println(str1 == str3);
// 字符串使用+进行拼接时,会将两个串转换为StringBuilder之后进行append,拼接完成后再转换回到String类型
// +的效率是非常低
String str4 = "h";
String str5 = "ello";
String str6 = str4 + str5;//由StringBuilder转换而得的 str6不直接在常量池中
System.out.println(str1 == str6.intern());
14.2StringBuilder和StringBuffer
可变字符串
java
public class Demo07 {
public static void main(String[] args) {
// 创建sb对象
StringBuilder sb = new StringBuilder();//堆中的
System.out.println(sb);
System.out.println(sb.length());//返回sb的有效长度
// 追加方法
sb.append("hello");
// append可以链式调用
sb.append("world").append("你好").append("世界");
System.out.println(sb);
// 删除方法
sb.delete(2, 4);//从2开始,长度为4-2
System.out.println(sb);
// 添加
sb.insert(1, "嘿嘿");
System.out.println(sb);
// 字符串反转
sb.reverse();
System.out.println(sb);
// 转换为String类型
System.out.println(sb.toString() + 1);
}
}
14.3String,StringBuilder,StringBuffer的区别
都是字符串
String类是字符串常量,一旦创建不可以改变
StringBuilder,StringBuffer是可变字符串,自带缓冲区的,缓冲区默认大小为16个字符
StringBuffer线程安全的,效率低
StringBuilder线程不安全的,效率高
总结:若有大量的字符串拼接,使用StringBuilder或者StringBuffer拼接之后在转String。不考虑,线程时使用StringBuilder,否则StringBuffer
java
public class Demo09 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
String str = "";
for(int i = 0;i<10000;i++) {
str += "a";
}
long end = System.currentTimeMillis();
System.out.println("String拼接耗时:"+(end-start));
System.out.println("----------------");
start = System.currentTimeMillis();
StringBuilder sb1 = new StringBuilder();
for(int i = 0;i<10000;i++) {
sb1.append("a");
}
end = System.currentTimeMillis();
System.out.println("String拼接耗时:"+(end-start));
System.out.println("----------------");
start = System.currentTimeMillis();
StringBuffer sb2 = new StringBuffer();
for(int i = 0;i<10000;i++) {
sb2.append("a");
}
end = System.currentTimeMillis();
System.out.println("String拼接耗时:"+(end-start));
}
}