知识点汇总一
一:String是一个final类代表不可变的字符序列
String实现了Serializable接口:表示字符串是支持序列化的s,实现了Comparable接口:表示String可以比较大小。
通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。字符串常量池中是不会存放相同内容的字符串的。
String的实例化方式:
方式一:通过字面量的方式
方式二:通过new+构造器的方式
String s=new String(“hello”)的方式创建对象在内存中创建了两个对象:
一个是堆空间中的new结构另一个是char[]对应的常量池中的数据"hello"。
结论:1常量与常量的拼接结果在常量池中,且常量池中不会存放相同内容的常量。2只有其中有一个是变量,结果就在堆中。
如果拼接的结果调用intern()方法,结果就在常量池中。
代码示例:
public void test1(){
String s1="abc";
String s2="hello";
String s3=s2.replace('h','a');
String s4=new String("hello");
String s55="abcdef";
String s5=s1+"def";
String s6=s5.intern();//返回得到的是常量池中已经存在的
System.out.println(s6==s55);
//String->char[]
String str1="1234354asdfasd";
char[] chars=str1.toCharArray();
for (int i = 0; i < chars.length; i++) {
System.out.println(chars[i]);
}
//char[]->String 调用String的构造器
char[] chars1=new char[]{'q','w','e','r','t','y'};
System.out.println(new String(chars1));
/*
* String 与字节数组byte[]之间的转换
* */
//String->byte[]调用getBytes()方法
String str3="qwe123";
byte[] bytes=str3.getBytes();
System.out.println(Arrays.toString(bytes));
//byte[]->String:调用String的构造器
String str4=new String(bytes);
System.out.println(str4);
}
知识点汇总二
1.StringBuffer:可变的字符序列,线程安全加了synchronized,效率偏低
分析StringBuffer:空参构造器public StringBuffer(){ super(capacity:16); }(空参的具有16个容量),底层创建了一个长度为16的数组。
有参构造器public StringBuffer(String str){ super(capacity:str.length+16);append(str) }
2.StringBuilder:可变的字符序列,jdk5.0新增线程不安全,效率高点
扩容问题:若添加数据盛不下则默认将原有底层数组扩容为原来2倍+2。
代码示例:
public static void main(String[] args) {
//StringBuffer中的常用方法
StringBuffer stringBuffer=new StringBuffer("qwertt");
System.out.println(stringBuffer.append("123"));
stringBuffer.delete(4,6);
stringBuffer.replace(2,4,"ll");
stringBuffer.insert(2,"happy");
stringBuffer.reverse();
stringBuffer.setCharAt(1,'R');
StringBuilder stringBuilder=new StringBuilder("zfg");
stringBuilder.append("uiop");
}
时间API测试代码示例:
public class DateTest {
public static void main(String[] args) throws ParseException {
//jdk8之前的日期时间API
long startTime=System.currentTimeMillis();
//构造器一
Date date=new Date();
System.out.println(date.toString());//显示当前的年月日分秒
date.getTime();//获取当前对象的毫秒数
//构造器二
Date date1=new Date(135435236534L);
//创建java.sql.Date对象
java.sql.Date date2=new java.sql.Date(5623546235L);
//util.Date->sql.Date之间的转换
Date date3=new Date();
java.sql.Date date4=new java.sql.Date(date3.getTime());
/*
* jdk8以前的日期时间的API测试
* java.text.SimpleDateFormat对日期Date类的格式化和解析
*两个操作:格式化:日期-》字符串;解析:格式化的逆过程,字符串-》日期
* */
//实例化SimpleDateFormat
SimpleDateFormat simpleDateFormat=new SimpleDateFormat();
//格式化:日期-》字符串
Date date8=new Date();
System.out.println(date8);
String sdf=simpleDateFormat.format(date);
System.out.println(sdf);
//解析:字符串-》日期
String date7="19-12-18 上午10:34";
Date date6=simpleDateFormat.parse(date7);
System.out.println(date2);
//字符串-》转换为java.sql.Date
String birth="2020-2-18";
SimpleDateFormat simpleDateFormat1=new SimpleDateFormat("yyyy-MM-dd");
Date date9=simpleDateFormat1.parse(birth);
System.out.println(date9);//java.util.Date
java.sql.Date birthDate=new java.sql.Date(date9.getTime());
/*
* Calendar日历类的使用
* */
//实例化
//方式一:创建其子类对象;方式二:调用其静态方法
Calendar calendar=Calendar.getInstance();
//常用方法
calendar.get(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH,22);
calendar.add(Calendar.DAY_OF_MONTH,3);
Date date11=calendar.getTime();
Date date5=new Date();
calendar.setTime(date5);
/*
* jdk8中的时间日期API
* LocalDate ,LocalTime,LocalDateTime
* */
//now():获取当前时间
LocalDate localDate=LocalDate.now();
System.out.println(localDate);
LocalTime localTime=LocalTime.now();
System.out.println(localTime);
LocalDateTime localDateTime=LocalDateTime.now();
System.out.println(localDateTime);
//of()
LocalDateTime localDateTime1=LocalDateTime.of(2020,10,3,12,34);
System.out.println(localDateTime1);
//get()获取相关的属性
System.out.println(localDateTime.getDayOfMonth());
//with体现了不可变性:设置相关的属性
System.out.println(localDate.withDayOfMonth(13));
//plus加上指定的时间
localDateTime.plusDays(3);
//minus减去指定的时间
localDateTime.minusDays(4);
//instant瞬时时间点
//获取本初子午线的时间
Instant instant=Instant.now();
System.out.println(instant);
instant.atOffset(ZoneOffset.ofHours(8));//偏移量
System.out.println(instant.toEpochMilli());//获取对应的毫秒数
}
}
知识点汇总三:
对多个对象进行排序使用两个接口中的任何一个Comparable和Comparator
Comparable接口的使用:
像String,包装类等实现了Comparable接口重写了compareTo()给出了比较两个对象大小,重写compareTo()了之后进行了从小到大的排列。
Comparator接口的使用定制排序。
代码示例:
public class CompareTest {
public static void main(String[] args) {
String[] arr=new String[]{"aa","qq","bb","dd","mm"};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
Arrays.sort(arr, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//按照从大到小的排列
if(o1 instanceof String && o2 instanceof String ){
String s1=(String )o1;
String s2=(String)o2;
return -s1.compareTo(s2);
}
throw new RuntimeException("输入的数据类型不一致");
}
});
}
}
//实现Comparable接口
class Fruit implements Comparable{
private String name;
private double price;
public Fruit() {
}
public Fruit(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
//指明按照什么比较大小
@Override
public int compareTo(Object o) {
if(o instanceof Fruit){
Fruit fruit=(Fruit)o;
if(this.price>fruit.price){
return 1;
}
else if (this.price<fruit.price){
return 0;
}else {
return 0;
}
}
throw new RuntimeException("传入的数据类型不是Fruit");
}
}