2021-05-19_JAVA_常用类

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值