注意:1. String表示字符串类型,属于 引用数据类型
,不属于基本数据类型。
2. 在java中随便使用 双引号括起来
的都是String对象。
例如:“abc”,“def”,“hello world!”,这是3个String对象
1.字符串是常量,在创建之后不能更改
其实就是说一旦这个字符串确定了,那么就会在内存区域中就生成了这个字符串。字符串本身不能改变,但str变量中记录的地址值是可以改变的。
2.源码分析,String类底层采用的是字符数组:
private final char value[]
private 修饰说明value只能在String类内部使用,而且又没有提供get方法,所以外部无法获取value数组,就无法改变数组中元素的值。
final修饰说明value是常量,一旦创建,就不能被改变,value一旦被初始化成某个数组,将永远指向这个数组,不可能再指向其它的数组了。
1. 一切都是对象,字符串事物 "" 也是对象。
2.类是描述事物,String类,描述字符串对象的类。
3.所有的 "" 都是String类的对象。
4.字符串是一个常量,一旦创建,不能改变。
例题:
public class StringDemo {
public static void main(String[] args) {
//引用变量str执行内存变化
//定义好的字符串对象,不变
String str = "abc";
System.out.println(str);
str = "edf";
System.out.println(str);
}
}
创建对象的数量比较
String s3 = “abc”;
在内存中只有一个对象。这个对象在字符串常量池中
String s4 = new String(“abc”);
在内存中有两个对象。一个new的对象在堆中,一个字符串本身对象,在字符串常量池中
例题:
public class StringDemo2 {
public static void main(String[] args) {
//字符串定义方式2个, 直接= 使用String类的构造方法
String str1 = new String("abc");
String str2 = "abc";
System.out.println(str1);
System.out.println(str2);
System.out.println(str1==str2);//引用数据类型,比较对象的地址 false
System.out.println(str1.equals(str2));//true
}
}
public String():-------空构造
public String(byte[] bytes):-------把字节数组转成字符串
public String(byte[] bytes,int index,int length):-------把字节数组的一部分转成字符串
public String(String original):-------把字符串常量值转成字符串
例题:
class StringTest{
public static void main(String[] args) {
//最常用的方式
String s1 = "我爱你中国";
System.out.println(s1);//我爱你中国
String s2 = new String("我爱你中国");
System.out.println(s2);//我爱你中国
char[] c = {'我' , '爱', '你', '中', '国'};
String s3 = new String(c);
System.out.println(s3);//我爱你中国
String s4 = new String(c, 2, 3);
System.out.println(s4);//你中国
byte[] b = {65, 66 ,67, 68};
String s5 = new String(b);
System.out.println(s5);//ABCD
String s6 = new String(b, 1, 2);
System.out.println(s6);//BC
StringBuffer sb1 = new StringBuffer("我和我的祖国");
String s7 = new String(sb1);
System.out.println(s7);//我和我的祖国
StringBuilder sb2 = new StringBuilder("我和我的家乡");
String s8 = new String(sb2);
System.out.println(s8);//我和我的家乡
}
}
int length(): 返回字符串的长度。
String substring(int beginIndex,int endIndex): 获取字符串的一部分。
String substring(int beginIndex): 获取字符串的一部分。
boolean startsWith(String prefix): 判断一个字符串是不是另一个字符串的前缀,开头。
boolean endsWith(String prefix): 判断一个字符串是不是另一个字符串的后缀,结尾。
boolean contains (String s): 判断一个字符串中,是否包含另一个字符串。
int indexOf(char ch): 查找一个字符,在字符串中第一次出现的索引,被查找的字符不存在,返回-1。
byte[] getBytes(): 将字符串转成字节数组,此功能和String构造方法相反,byte数组相关的功能,查询编码表。
char[] toCharArray(): 将字符串转成字符数组,功能和构造方法相反。
boolean equals(Object obj): 方法传递字符串,判断字符串中的字符是否完全相同,如果完全相同返回true。
boolean equalsIgnoreCase(String s): 传递字符串,判断字符串中的字符是否相同,忽略大小写。
例题:
class StringTest{
public static void main(String[] args) {
String s1 = "hello world";
System.out.println(s1.charAt(6));//w
String s2 = "abc";
String s3 = "xyz";
String s4 = "xyz";
System.out.println(s2.compareTo(s3));//-23
System.out.println(s3.compareTo(s4));//0
System.out.println(s4.compareTo(s1));//16
System.out.println(s2.equals(s3));//false
System.out.println(s1.endsWith("world"));//true
System.out.println(s1.endsWith("t"));//false
String s5 = "HELLO worLD";
System.out.println(s1.equalsIgnoreCase(s5));//true
byte[] b = s1.getBytes();
System.out.println(Arrays.toString(b));//[104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]
System.out.println(s1.indexOf("world"));//6
System.out.println(s1.indexOf("h"));//0
System.out.println(s1.isEmpty());//false
System.out.println(s1.length());//11
String s6 = "javapythonc++cphpjavapython";
System.out.println(s6.lastIndexOf("java"));//17
System.out.println(s6.lastIndexOf("h"));//24
String s7 = "name=zhangsan&age=18&sex=男";
String newS7 = s7.replace("&", ";");
System.out.println(newS7);//name=zhangsan;age=18;sex=男
String[] splitS7 = s7.split("&");
System.out.println(Arrays.toString(splitS7));//[name=zhangsan, age=18, sex=男]
System.out.println(s6.startsWith("java"));//true
System.out.println(s6.startsWith("python"));//false
System.out.println(s6.substring(10));//c++cphpjavapython
System.out.println(s6.substring(10, 13));//c++
char[] charS6 = s6.toCharArray();
System.out.println(Arrays.toString(charS6));//[j, a, v, a, p, y, t, h, o, n, c, +, +, c, p, h, p, j, a, v, a, p, y, t, h, o, n]
System.out.println(s6.toUpperCase());//JAVAPYTHONC++CPHPJAVAPYTHON
System.out.println(s5.toLowerCase());//hello world
String s8 = " 你 好 世 界 ";
System.out.println(s8.trim());//你 好 世 界
System.out.println("------------------------------");
System.out.println(String.valueOf(123));//123
System.out.println(String.valueOf(3.14));//3.14
System.out.println(String.valueOf(true));//true
System.out.println(String.valueOf(new Object()));//java.lang.Object@4554617c
//valueOf会自动调用toString()方法
}
}
Date 对象表示时间的默认顺序是星期、月、日、小时、分、秒、年。
Date():此种形式表示分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒),使用该构造方法创建的对象可以获取本地的当前时间。
Date(long date):此种形式表示从 GMT 时间(格林尼治时间)1970 年 1 月 1 日 0 时 0 分 0 秒开始经过参数 date 指定的毫秒数。
例题:
Date date1 = new Date(); // 调用无参数构造函数
System.out.println(date1.toString()); // 输出:Wed May 18 21:24:40 CST 2016
Date date2 = new Date(60000); // 调用含有一个long类型参数的构造函数
System.out.println(date2); // 输出:Thu Jan 0108:01:00 CST 1970
方法 | 描述 |
---|---|
boolean after(Date when) | 判断此日期是否在指定日期之后 |
boolean before(Date when) | 判断此日期是否在指定日期之前 |
int compareTo(Date anotherDate) | 比较两个日期的顺序 |
boolean equals(Object obj) | 比较两个日期的相等性 |
long getTime() | 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来,此 Date 对象表示的毫秒数 |
String toString() | 把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy。 其中 dow 是一周中的某一天(Sun、Mon、Tue、Wed、Thu、Fri 及 Sat) |
例题1:
例 题2:
假设,某一天特定时间要去做一件事,而且那个时间已经过去一分钟之后才想起来这件事还没有办,这时系统将会提示已经过去了多 长时间。具体的代码如下:
import java.util.Date;
import java.util.Scanner;
public class Test11 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入要做的事情:");
String title = input.next();
Date date1 = new Date(); // 获取当前日期
System.out.println("[" + title + "] 这件事发生时间为:" + date1);
try {
Thread.sleep(60000);// 暂停 1 分钟
} catch (InterruptedException e) {
e.printStackTrace();
}
Date date2 = new Date();
System.out.println("现在时间为:" + date2);
if (date2.before(date1)) {
System.out.println("你还有 " + (date2.getTime() - date1.getTime()) / 1000 + " 秒需要去完成【" + title + "】这件事!");
} else {
System.out.println("【" + title + "】事情已经过去了 " + (date2.getTime() - date1.getTime()) / 1000 + " 秒");
}
}
}
1. 在Java中,如果我们想获取当前时间,一般会使用Date类的无参构造函数,如下所示,我们获取到当前时间并输出:
|
|
此时我们会发现, 输出的格式并不是我们预期的格式,一般情况下,我们希望的格式都是类似于2019-02-18,2019-02-18 10:24:30,2019/02/18这样的,此时我们就需要用到java.text.SimpleDateFormat来自定义格式。
2.它是DateFormat类的直接子类,继承DateFormat类。
使用format()方法,我们可以将日期类型转换为自己自定义的字符串格式,如2019-02-18,2019/02/18,2019-02-18 10:24:30等,自定义格式如下表所示:
格式 | 释义 | 举例 |
---|---|---|
yyyy | 年 | 2019 |
MM | 月 | 02 |
dd | 日 | 18 |
HH | 小时(24小时制) | 13,下午一点 |
mm | 分钟 | 53 |
ss | 秒 | 42 |
SSS | 毫秒 | 629 |
例题1:
例题2:
package com.zwwhnly.springbootdemo;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo {
public static void main(String[] args) {
Date currentTime = new Date();
System.out.println(currentTime); // Mon Feb 18 13:53:50 CST 2019
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat simpleDateFormat3 = new SimpleDateFormat("yyyy/MM/dd");
System.out.println(simpleDateFormat1.format(currentTime)); // 输出2019-02-18 13:53:50.629
System.out.println(simpleDateFormat2.format(currentTime)); // 输出2019-02-18
System.out.println(simpleDateFormat3.format(currentTime)); // 输出2019/02/18
}
}
1. Calendar 类是一个抽象类。
它为“特定瞬间”与一组诸如 “YEAR”、“MONTH”、“DAY_OF_MONTH”、“HOUR ”等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
2. Calendar类在创建对象时并非直接创建,而是通过静态方法创建,将语言敏感内容处理好,再返回子类对象。
例题:
package com.hp.date;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class CalendarDemo{
public static void main(String[] args) throws Exception {
//获取获取系统的当前日历对象
Calendar instance = Calendar.getInstance();
//1、获取今天是周几
int weekDay = instance.get(Calendar.DAY_OF_WEEK);
System.out.println("今天是周:" + (weekDay - 1));
//2、获取系统当前年
int year = instance.get(Calendar.YEAR);
System.out.println("今年是:" + year + "年");
//3、获取系统当前月
int month = instance.get(Calendar.MONTH);
System.out.println("本月是:" + (month + 1) + "月");
//4、获取系统当前日
int day = instance.get(Calendar.DATE);
System.out.println("今天是" + day + "号");
//5、获取上午跟下午
int am_pm = instance.get(Calendar.AM_PM);
if (am_pm == 0)
System.out.println("是上午");
else
System.out.println("是下午");
//6、获取当前的系统时间[date-->String]的过程
Date time = instance.getTime();//获取的是当前系统的时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
String showTime = format.format(time);
System.out.println("当前系统时间为:" + showTime);
//7、自定义日历的时间
String strTime = "2021-07-07";
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(strTime);
instance.setTime(date);//将时间对象data设置为新的日历
System.out.println("修改后的系统时间为:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(instance.getTime()));
}
System.out.println("------------Calendar和Date转换------------");
Date now = calendar.getTime();
calendar.setTime(now);
System.out.println("------------Calendar日期计算以及判断------------");
calendar = new GregorianCalendar();
Calendar calendar2 = new GregorianCalendar();
calendar2.set(Calendar.YEAR, 2800);
//是否在某个时间(calendar2)之后
System.out.println(calendar.after(calendar2));
//是否在某个时间(calendar2)之前
System.out.println(calendar.before(calendar2));
//增加多少年年,月日以及时分秒同理
calendar.add(Calendar.YEAR, -10);
}
}
Calendar calendar = Calendar.getInstance();
// 从一个 Calendar 对象中获取 Date 对象
Date date = calendar.getTime();
// 将 Date 对象反应到一个 Calendar 对象中,
// Calendar/GregorianCalendar 没有构造函数可以接受 Date 对象
// 所以我们必需先获得一个实例,然后设置 Date 对象
calendar.setTime(date);
例题: