JAVA进阶
学习10.0
常用类
字符串相关的类
String
声明为final的,不可继承
实现了Serializable接口:表示字符串是支持序列化的
实现了Comparable接口,表示可以比大小
具有不可变性:
做连接或者是修改字符串都需重新造一个,不能在原有的基础上改
例:String s1=s.replace('a','m');//把字符串s中的a换成m,并且重新造一个赋值;
实例化方式?2种
例:
String s1="abc"
与String s2=new String("abc")
;的区别?
String s2=new String(“abc”)方式创建对象,在内存中创建了几个对象?
两个:一个是堆空间中的new结构;另一个是char[]对应的常量池中的数据:“abc”
不同连接方式的对比?
只有常量与常量的拼接结果在常量池中,且常量池中不会存在相同内容的常量;
只要其中一个是变量(加final不算),结果就在堆中;
如果拼接的结果调用intern()方法,返回值就在常量池中
加final之后是常量,
JVM设计字符串的内存结构
1、HotSpot:
String s的常用方法
s.length();
s.CharAt(0);取数组的指定位置字符
s.isEmpty(); 判断是否为空
s.toLowerCase(); 小写
s.trim(); 去除首尾空格
s.equals(s1);
s.equalsIgnoreCase(s1);忽略大小写时比较
s.concat(s1);将指定字符串连接在此字符串之后,相当于+
s.compareTo(s1);比较两个字符串的大小,涉及到字符串排序
s.substring(2);取字符串第二个开始往后
s.substring(2,5); 取 [2,5)
s.endWith(“abc”); 测试此字符串是否以指定字符结尾
s.startWith(“abc”);测试此字符串是否以指定字符开始
s.startWith(“abc”,4);测试从第4位开始是否以abc开始
s.contains(s1); 判断s里面是否包含s1
s.indexOf(String s1); 返回字符串在s中的位置索引,没有返回-1
s.indexOf(“shf”,5);从第5 位开始找
s.lastIndexOf(s2);从后往前找,返回的还是从前往后的索引
s.lastIndexOf(s2,6);从第6位从后往前找,
什么情况下s.indexOf(String s1)和s.lastIndexOf(s2)返回的一样
要么只有一个,要么没有返回-1
替换
s.replace(char oldchar,char newchar); newchar替换oldchar
s.replace(CharSequence target,CharSequence replacement); 把目标字符串换成别的字符串
s.replaceAll("\d+",",").replaceAll("^,|,$","");把所有的数字都换成逗号,如果开头有逗号,则去掉
匹配
s.matches(String s1);判断是否由s1组成
s.matches("\d+");判断是否全都由数字组成
切片
s.split(String s1); 根据字符切割 s.split("\|");
s.split(String s1,int limit);
String 与其他结构的转换
String------>基本类型、包装类
调用parseXxx(str);
int num=Integer.parseInt(s1);
基本类型、包装类----->String
1、调用valueOf(xxx)
String s1=String.valueOf(num);
2、String s2=num+" "; 堆里
String—>char[]
char[] charArray=s1.toCharArray();
char[]—>String
String s1=new String(arr);
String—>byte[]
调用getBytes();
byte[] bytes=s.getBytes();//使用默认(UTF-8)的字符集进行转换
byte[] bytes1=s.getBytes(“gbk”);使用gbk字符集编码
编码:字符串—>字节
解码:字节—>字符串
byte[]—>String
String s=new String(bytes); //编码集与解码集需一样
常见算法题目?
模拟一个trim,去除两端空格
字符串指定部分反转
获取两个字符串中最大的相同子串
排序比较:Arrays.sort()
获取一个字符串在另一个字符串出现的字符
StringBuffer 和StringBuilder
String、 StringBuffer 和StringBuilder三者异同?
String:不可变; 底层用char[]存
StringBuffer :可变,线程安全,效率低; 底层用char[]存
StringBuilder:可变线程不安全,效率高 jdk5.0新增 底层用char[]存
StringBuffer
StringBuffer sb1=new StringBuffer (); //length=0
StringBuffer sb2=new StringBuffer (“abc”); //length=3
sb1.append(‘a’); 首位置添加a; sb1.append(‘b’); 下一位置添加b;
添加太多的扩容问题?
若不够:(value.length<<1)+2 ,即默认为原来2倍+2,同时将原来字符串复制到新的数组
开发中,建议使用StringBuffer(int capacity);
常用方法
StringBuffer append(xxx); 字符串拼接
StringBuffer delete(int start,int end); [start,end)左闭右开
StringBuffer replace(int start,int end,String s); [start,end)替换成s
StringBuffer insert(int offset,xxx); 指定位置插入
StringBuffer reverse(); 逆转
public int indexOf(String)
public String substring(int start,int end); 返回[start,end)
public int Length()
public char charAt(int n)
public void setCharAt(int n,char ch) 将指定位置改为新的
总结
增:qppend
删:delete
改:setCharAt replace
查:charAt
插:insert
长度:length
StringBuilder
基本与StringBuffer 一样
效率
StringBuilder >StringBuffer >String
API
System类获取时间
jdk8之前
long time =System.currentTimeMillis(); //返回当前时间与1970.1.1.0时0分0秒之间的ms单位的时间差
Data
1、两个构造器的使用
一 :Date date1=new Date();
二 :Date date2=new Date(long time); 创建指定毫秒数的data
2、两个方法的使用
date1.toString(); //显示当前的年月日时分秒
date1.getTime();//返回当前时间与1970.1.1.0时0分0秒之间的ms单位的时间差
3、java.sql.Data
new sql.Date date3=new java.sql.Date(long time);
sql.Date------> util.Date
java.util.Data对象------>java. sql.Data对象 ?
情况一:
Date date4=new java.sql.Date(long time);
java.sql.Date date5=(java.sql,Date) date4;
情况二:
Data data6=new Data();
java.sql.Date date7 =new java.sql.Date(date6.getTime());
SimpleDataFormat
jdk8之前
1、实例化
SimpleDateFormat sdf=new SimpleDateFormat();
2.1、格式化:日期—>字符串
Date date=new Date();
String format=sdf.format(date);
2.2、解析:格式化的逆过程:字符串—>日期
String str=“21-05-20 中午:13:14”; //默认格式
Date date1=sdf.parse(str);
自己定义格式:
SimpleDateFormat sdf1=new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”); 实例化
String format1=sdf1.format(date); 格式化
Date date2=sdf1.parse(“2021-05-21 13:14:00”); 解析
Calendar日历类
jdk8之前
1、实例化
方式一:
创建其子类(GregorianCalendar)的对象
方式二:
调用其静态方法:getInstance()
Calendar calendar=Calendar.getInstance();
calendar.getClass();
2、常用方法
1、get()
int days=calendar.get(Calendar.DAY_OF_WEEK);
2、set()
calendar.set(Calendar.DAY_OF_WEEK,3); 返回void
3、add()
calendar.add(Calendar.DAY_OF_WEEK,3); 当前时间加上3天
4、getTime():日历类—>Data
Date date=calendar.getTime();
5、setTime():Date—>日历类
calendar.setTime(date);
LocalDate,LocalTime,LocalDateTime
1、实例化
方式一:now 获取当前的年月日时分秒
LocalDate localdate=localDate.now();
LocalTime localtime=localTime.now();
LocalDateTime localdatetime=localDateTime.now();
方式二:of 设置指定的年月日时分秒
LocalDateTime localdatetime1=localDateTime.of(2020,12,12,12,30,10);
2、getXxx()
LocalDateTime.getDayOfMonth();
LocalDateTime.getDayOfWeek();
LocalDateTime.getMonth();
LocalDateTime.getMonthValue();
LocalDateTime.getMinute();
3、设置(withXxx()),体现不可变性
LocalDate localdate1=LocalDateTime.withDayOfMonth(22);
LocalDate localdate2=LocalDateTime.plusMonths(2);
LocalDate localdate3=LocalDateTime.minusDays22);
Instant
一个瞬时点,记录时间戳
1、实例化
Instant instant=Instant.now() //获取本初子午线对应的标准时间
OffsetDateTime offsetDateTime=instant.atOffset(ZoneOffset.ofHours(8)); //添加时间的偏移量
long milli=instant.toEpochMilli(); //获取1970\1\1\ 00:00:00开始的毫秒数
Instant instant1=Instant.ofEpochMilli(123434545L);//通过给的毫秒数获取Instant实例
DataTimeFormatter
1、实例化
方式一:预定义的标准格式
DataTimeFormatter formatter=DataTimeFormatter.ISO_LOCAL_DATE_TIME;
方式二:本地方式ofLocalizedDateTime()、ofLocalizedDate(),
DateTimeFormatter formatter1=DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
方式三:自定义 ofPattern(“yyyy-MM-dd hh:mm:ss”)
DateTimeFormatter formatter2=DateTimeFormatter.ofPattern(“yyyy-MM-dd hh:mm:ss”);
2、格式化:日期—>字符串
LocalDateTime localdatetime=localDateTime.now();
String str1=formatter.format(localDateTime);
3、解析:字符串—>日期
formatter.parse(“2019-02-02T15:42:18.797”);
JAVA比较器
方式一:自然排序
Comparable接口的使用
像String,包装类等重写了compareTo(obj);
一般自定义类需重写
方式二:定制排序
Comparator接口的使用
Comparable接口 vs Comparator接口?
System类
方法:
gc()
exit(int i)
getProperty(String key);
Math类
方法
Biglnteger 与 BigDecimal
Biglnteger bi=new Biglnteger (“1323636666373722838”);
Biglnteger bd=new Biglnteger (“13236”);
Biglnteger bd2=new Biglnteger (“11”);
bd.divide(bd2,scale:25,BigDecimal.ROUND_HALF_UP) //支持任意精度
学习11.0
枚举类
枚举类的使用
当需要定义一组常量时
如何使用自定义枚举类
自定义枚举类
1声明Season对象的属性;private final修饰
2私有化构造器
3提供当前类枚举类的多个对象
其他诉求:获取枚举类对象的属性
其他:提供toString对象方法
使用enum关键字
1提供当前类枚举类的多个对象,多个对象用,末尾用;
2声明Season对象的属性;private final修饰
3私有化构造器
其他诉求:获取枚举类对象的属性
其他:提供toString对象方法
enum Season
{
// 1 提供当前类枚举类的多个对象,多个对象用,末尾用;
SPRIN("春天","1"),
SUMMER("夏天","2"),
AUTUMN("秋天","3"),
WINTER("冬天","4");
// 2 声明Season对象的属性;private final修饰
private final String seasonName;
private final String seasonDesc;
// 3 私有化构造器
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//其他诉求:获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
//其他:提供toString对象方法
@Override
public String toString() {
return "Season [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]";
}
}
enum类中的常用方法
toString()
values()
valuesOf(String objname); //返回枚举类中对象名是objname的对象
接口的实现:
情况一:实现接口,使用implements,跟以前一样
情况二:让枚举类的对象分别实现接口中的抽象方法
注解(Annotation)的使用
框架=注解+反射+设计模式
内置的三个基本注解
@Overread
@Deprecated:提示这个方法以及过时
@SuppressWarnings(“unused”);抑制编译器警告
如何自定义注解?(参照@SuppressWarnings)
必须使用反射才有意义
注解声明为 @interface
内部定义成员,通常使用value
可以指定成员的默认值,使用defalut定义
如果自定义注解没有成员,表明是一个标识作用
4个基本的元注解
元注解:对现有的注解进行注解
Retention:用于指定他所修饰的的声明周期
Target:表明可以修饰哪些程序元素
Documented:表示所修饰的注解在java解析的时候被保存下来
Inherited:被修饰的Annotation具有继承性
可重复注解(jdk8新特性)
类型注解
throw和throws的异同?
throw: 生成一个异常对象,并抛出;使用在方法内部—自动抛出异常对象;
throws:处理异常的方式;使用在方法声明处的末尾—try-catch-finally