1.String声明为final的,不可被继承
2.String实现了Serializable接口:表示字符串时支持序列化的,实现了Comparable接口:表示String可以比较大小
3.String内部定义了final char[] value用于存储字符串数据
4.String:代表不可表的字符序列。简称:不可变性,体现:当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
5.通过字面量的方法(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中
6.字符串常量池中是不会存储相同内容的字符串的
String的实例化方式:
方式一:通过字面量定义的方式
方式二:通过new+构造器的方式
String s=new String(“abc”),创建了两个对象,一个是在堆空间中new结构,另一个是char[]对应的查良池中的数据“abc”
结论:1.常量与常量的拼接结果在常量池中。且常量池中不会存在相同内容的常量
2.只要其中有一个是变量,结果就在堆中
3.如果拼接的结果调用intern()方法,返回值就在常量池中
StringBuffer和StringBufferString——>StringBuffer和StringBuffer:调用StringBuffer和StringBuffer的构造器
StringBuffer和StringBuffer——>String:①调用String构造器 ②StringBuffer和StringBuffer的toString()
常用方法:
增:append()
删:delete(int start,int end)
改:setCharAt(int n,char ch)/replace(int start,int end,String str)
查:charAt(int n)
插:insert(int offset,xxx)
长度:length()
2.日期时间API Java.util.Data类-
1.两个构造器的使用
构造器一:Date():创建一个对应当前时间的Date对象
构造器二:创建指定毫秒数的Date对象
-
2.两个方法的使用
toString():显示当前的年月日时分秒
gettime():获取当前Date对象对应的毫秒数(时间戳)
-
3.Java.sql.Date对应着数据库中的日期类型变量
@Test
public void Test2(){
//构造器一:Date():创建一个对应当前时间的Date对象
Date date1 = new Date();
System.out.println(date1.toString());
System.out.println(date1.getTime());//1658560186648
//构造器二:创建指定毫秒数的Date对象
Date date2 = new Date(1658560186648L);
System.out.println(date2);
//创建Java.sql.Date对象
java.sql.Date date3 = new java.sql.Date(1658560186648L);
System.out.println(date3);
System.out.println(date3);
}
//1.System类中的currentTimeMillis()
@Test
public void Test1(){
long time=System.currentTimeMillis();
//返回当前时间与1970年1月1日0时0分0秒以毫秒为单位的时间差(时间戳)
System.out.println(time);//1658560203898
}
SimpleDateFormat对日期Date类的格式化和解析
- 1.格式化:日期–>字符串
- 2.解析:格式化的逆过程–>日期
@Test
public void Test1(){
//实例化SimpleDateFormat
SimpleDateFormat sdf=new SimpleDateFormat();
//格式化:日期-->字符串
Date date=new Date();
System.out.println(date);
String format = sdf.format(date);
System.out.println(format);
//解析:格式化的逆过程
String str ="2022/7/27 下午3:30";
Date date1= null;
try {
date1 = sdf.parse(str);
} catch (ParseException e) {
throw new RuntimeException(e);
}
System.out.println(date1);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//格式化
String format1 = simpleDateFormat.format(date);
System.out.println(format1);
//解析:要求字符串必须是符合SimpleDateFormat识别的格式
Date date2= null;
try {
date2 = simpleDateFormat.parse("2022-08-03 04:54:12");
} catch (ParseException e) {
throw new RuntimeException(e);
}
System.out.println(date2);
}
Calendar对日期Date类的格式化和常用方法
@Test
public void Test2() {
//1.实例化
//方式一:创建其子类对象
//方式二:调用静态方法
Calendar calendar = Calendar.getInstance();
// System.out.println(calendar.getClass());
//2.常用方法
//get()
int days= calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);
System.out.println(calendar.get(Calendar.DAY_OF_YEAR));
//set()
calendar.set(Calendar.DAY_OF_MONTH,22);
int days1= calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days1);
//add()
calendar.add(Calendar.DAY_OF_MONTH,-3);
days=calendar.get(Calendar.DAY_OF_MONTH);
//getTime():日历类-->Date
Date date = calendar.getTime();
System.out.println(date);
//setTime():Date-->日历类
Date date1 = new Date();
calendar.setTime(date1);
days=calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);
}
本地日期、本地时间、本地日期时间的使用:LocalDate、LocalTime、LocalDateTime
@Test
public void Test2(){
//now():获取当前的日期、时间、日期+时间
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDate);
System.out.println(localTime);
System.out.println(localDateTime);
//of():设置指定的年月日时分秒,没有偏差量
LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 6, 13, 23, 45);
System.out.println(localDateTime1);
//getXxx()
System.out.println(localDateTime1.getDayOfMonth());
System.out.println(localDateTime1.getHour());
}
Instant瞬时:时间上的瞬时点,这可能被用来记录应用程序中的时间时间戳。
@Test
public void Test3(){
//now():获取本初子午线对应的标准时间
Instant instant = Instant.now();
System.out.println(instant);//2022-08-02T07:43:34.117771700Z
//添加时间的偏移量
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);//2022-08-02T15:43:34.117771700+08:00
//获取自1970年1月1ri0-0-0开始的毫秒数
long milli = instant.toEpochMilli();
System.out.println(milli);//1659426464243
}
3.Java比较器
自然排序:
1.像String、包装类等实现了Comparable接口,重写了compareTo()方法,给出了比较两个对象大小方式
2.重写compareTo()的规则:
如果当前对象this大于形参对象obj,则返回正整数,
如果当前对象this小于形参对象obj,则返回负整数,
如果当前对象this等于形参对象obj,则返回零。
3.对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写compareTo()方法在方法中指明如何排序
public class Goods implements Comparable{
private String name;
private double price;
@Override
public int compareTo(Object o){
if(o instanceof Goods) {
Goods goods = (Goods) o;
if (this.price > goods.price) {
return 1;
} else if (this.price < goods.price) {
return -1;
} else {
// return 0;
return this.name.compareTo(goods.name);
}
//return Double.compare(this.price,goods.price);
}
throw new RuntimeException("传入的数据类型不一致!");
}
}
//getter、setter、构造器。。。
定制排序:使用Comparator接口
重写compare(Object o1,Object o2)的规则:
如果o1大于o2,则返回正整数,
如果o1小于o2,则返回负整数,
如果o1等于o2,则返回零。
@Test
public void Test4(){
Goods[] arr=new Goods[6];
arr[0]=new Goods("lenovo",34);
arr[1]=new Goods("dell",43);
arr[2]=new Goods("xiaomi",12);
arr[3]=new Goods("huawei",65);
arr[4]=new Goods("microsoft",43);
arr[5]=new Goods("microsoft",33);
Arrays.sort(arr, new Comparator() {
@Override
public int compare(Goods o1, Goods o2) {
if(o1 instanceof Goods && o2 instanceof Goods){
Goods s1 = o1;
Goods s2 = o2;
if(s1.getName().equals(s2.getName())){
return -Double.compare(s1.getPrice(),s2.getPrice());
}else{
return s1.getName().compareTo(s2.getName());
}
}
throw new RuntimeException("输入的市局类型不一致");
}
});
System.out.println(Arrays.toString(arr));
}



