String类:
1、String声明为final,表示不可被继承;
2、String实现了Serializable接口,表示可以被序列化;实现了Comparable接口,表示可以相互比较大小。
3、String内部定义了final byte[] values属性来存储字符串数据(jdk1.8及以前String使用的是char数组,jdk1.9及以后使用的是byte数组);
4、通过字面量的方式新建字符串,变量直接指向字符串常量池。字符串数据存储在常量池中,且常量池中不会存在相同的字符串数据,即相同字符串数据相同的两个变量地址相同,可以用“==”比较。
通过new的方式新建字符串,变量地址指向堆空间中,但是堆空间中对象的values属性的指向看构造参数:
1、如果构造参数为byte[]或char[],则指向堆中。
2、如果构造参数为String,则value还是指向字符串常量池
字符串拼接:
如果其中有一个是变量,但被定义为final,那么拼接后的数据还是存储在常量池中。
总结:常+常=池;常+变=堆;常+final变=池。
5、String有不可变性:对字符串重新赋值,或对现有字符串进行拼接,或用String类的replace()方法对现有字符串进行修改替换时,都不会对原有字符串数据改动,都会重新开辟常量池的新空间。
6、String类的常用方法:
7、String类的转换
String和包装类、基本数据类型的转换:见面向对象
String和 char[]的转换:
String→char[]:调用String的toCharArray()方法。
char[]→String:直接new String(char[])
String和 byte[]的转换:
String→byte[]:调用String的getBytes()方法。
byte[]→String:直接new String(byte[])
▲注意:从字符串→字节数组是编码(从能看懂的到看不懂的),从字节数组→字符串是解码。编码和解码要基于同一种字符集(UTF-8、GBK等等)。
String、StringBuffer和StringBuilder:
String(JDK1.0出现):不可变字符序列、底层使用byte[]存储。
StringBuffer(JDK1.0出现):效率低、线程安全、可变字符序列、底层使用byte[]存储、不能用字面量创建
StringBuilder(JDK 5.0出现):效率高、线程不安全、可变字符序列、底层使用byte[]存储、不能用字面量创建
▲使用效率:StringBuilder>StringBuffer>String
▲注意:String具有不可变性,任何对变量的操作不会改变原有字符串的值;但是StringBuffer和StringBuilder会改变原有字符串的值。
StringBuffer/StringBuilder的构造器:
StringBuffer/StringBuilder():在底层初始化byte[],其初始长度为16个byte。
StringBuffer/StringBuilder(CharSequence seq):在底层初始化byte[],它包含与指定的 CharSequence相同的字符。
StringBuffer/StringBuilder(int capacity):在底层初始化byte[]为具有指定初始长度的数组。
StringBuffer/StringBuilder(String str):构造一个StringBuffer对象,并将其内容初始化为指定的字符串内容。在底层初始化byte[]为当前byte长度+16。
当StringBuffer对象增加字符串,底层byte[]容量不够时启用扩容机制:
在JDK1.8及以前,扩容是将value长度先乘以2再加2;
StringBuffer/StringBuilder的常用方法:
上述这些方法支持方法链操作,因为append()方法返回调用这些方法的StringBuffer的本身对象。
▲注意append(null)等价于append("null")
public String toString():返回一个内容相同的字符串。
日期时间相关类:
System类:
方法:public static long currentTimeMillis():返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
Date类:
构造器:1、new Date():创建一个对应于当前时间的对象;2、new Date(long date):创建一个对应于指定毫秒数的对象
方法:1、getTime():返回自1970 年1 月1 日00:00:00 GMT以来距离此Date 对象表示的毫数。
2、toString():把此Date对象转换为标准形式(年月日时分秒)的String。
SimpleDateFormat类:
构造器:1、new SimpleDateFormat(String类型的自定格式,通常用:"yyyy-MM-dd hh-mm-ss")
方法:1、格式化:public String format(Date date):格式化Date对象date。
2、解析:public Date parse(String source):从给定字符串的开始解析文本,以生成一个日期。
▲注意:格式化和解析的格式应该满足构造器形参自定格式。
Calendar(日历类)类:
它是一个抽象类,不能直接造对象。
创建实例的方法:1、使用public static Calendar getInstance()方法;2、调用它的子类GregorianCalendar的构造器。
方法:
1、public int get(int field):获取相关字段天数的值;
2、public void set(int field,int value):设置相关字段天数的值,在原有对象上改;
3、public void add(int field,int amount):添加相关字段天数的值,在原有对象上改;
4、public final Date getTime():将上述操作过的Calendar对象返回成Date类;
5、public final void setTime(Date date):将一个Date类对象返回成Calendar类。
▲Calendar类具有可变性。
新时间日期API:
LocalDate、LocalTime、LocalDateTime类:
以LocalDateTime 类为例,其构造器是private,不能通过构造器新建对象,只能调用now或of方法新建对象。
方法:
1、public static LocalDateTime now():创建当前日期和时间的对象。
2、public static LocalDateTime of(int year,int month,int dayOfMonth,int hour,int minute,int second):创建指定年月日时分秒的对象。
3、public int getXxxxx():返回对象的日期或时间相关信息。
4、public LocalDateTime withXxxxx(参数):将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象。
5、public LocalDateTime plusXxxxx(参数):向当前对象添加几天、几周、几个月、几年、几小时等等并返回新的对象。
6、public LocalDateTime minusXxxxx(参数):向当前对象减去几天、几周、几个月、几年、几小时等等并返回新的对象。
▲LocalDate、LocalTime、LocalDateTime类具有不可变性。
Instant类:
其构造器是private,不能通过构造器新建对象,只能调用方法新建对象
方法:
1、public static Instant now():创建当前UTC时区的日期和时间对象。
2、public static Instant ofEpochMilli(long epochMilli):静态方法,返回在1970-01-0100:00:00基础上加上指定毫秒数之后的Instant类的对象。
3、public long toEpochMilli():返回自1970 年1 月1 日00:00:00 GMT以来距离此Instant对象表示的毫秒数。
DateTimeFormatter类:
实例化:1、调用静态初始化器:如ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
格式化:public String format(TemporalAccessor temporal),此处TemporalAccessor 类形参要和初始化器类型一致。
解析:public TemporalAccessor parse(CharSequence text),此处的形参格式要和格式化后的一致。
实例化:2、调用静态方法本地化相关格式:如ofLocalizedDateTime(FormatStyle.LONG/SHORT/MEDIUM);ofLocalizedDate(FormatStyle.LONG/SHORT/MEDIUM/FULL);ofLocalizedTime(FormatStyle.LONG/SHORT/MEDIUM/FULL)
格式化:public String format(TemporalAccessor temporal),此处TemporalAccessor 类形参要和上面静态方法相一致(一般都用LocalDateTime类形参就行)。
解析:public TemporalAccessor parse(CharSequence text),此处的形参格式要和格式化后的一致。
实例化:3、调用静态方法自定义格式:如ofPattern("yyyy-MM-dd hh-mm-ss")
格式化:public String format(TemporalAccessor temporal),此处TemporalAccessor 类形参要看上面自定义格式有没有日期或者时间(一般都用LocalDateTime类形参就行)。
解析:public TemporalAccessor parse(CharSequence text),此处的形参格式要和格式化后的一致。
Java比较器接口:
可以使用Comparable和Comparator来直接比较两个对象大小,但是不能对比较的引用类型对象进行排序,要想排序,要用到把他们放在数组中或集合中,然后调用Arrays.sort(数组形参)和Collections.sort(集合形参)或者Arrays.sort(数组形参,comparator)和Collections.sort(集合形参,comparator)。
Arrays.sort(数组参数)和Collections.sort(集合形参)默认使用的是自然排序;
Arrays.sort(数组形参,Comparator)和Collections.sort(集合形参,Comparator)使用的才是定制排序。
sort方法默认使用的是从小到大的排序方式,sort方法认为的大是返回1时的第一个元素和返回-1的第二个元素;若要使用从大到小的排序,只用将-1和1调换即可。
自然排序:Comparable接口:
1、对常用的String类、包装类等已经重写过compareTo(Obj)方法,并且按照从小到大排序。
2、对自定义类,如果需要比较某个属性或者按照某个属性排序,可以先让该类实现Comparable接口,再重写compareTo(Obj)方法。比较时可直接调用compareTo方法,如果对数组或集合元素排序,还可以用Arrays.sort(数组形参)和Collections.sort(集合形参)。
▲重写compareTo(Obj)方法的规则(默认为从小到大,若从大到小则需要返回值相反):
举例:
定制排序:Comparator接口:
当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用Comparator接口的实现类强行对多个对象进行整体排序的比较,使用时需要让实现类(而不是需要比较的类,使用comparator不用让比较类重写)重写其中的Compare(Obj,Obj)方法。
▲Compare(Obj,Obj)方法重写规则和comparableTo方法相同。
Comparator一般用在Arrays.sort(数组形参,Comparator)和Collections.sort(集合形参,Comparator)这两种sort重载方法中,并且以匿名类对象的方式使用。
举例:
两种方式的比较:
都可以使用泛型。
Comparable方式必须将比较类实现Comparable接口,实现类的对象可以随时使用compareTo(Obj)方法进行排序。
Comparator方式只是一个临时性的,不用将比较类实现Comparator接口,但还是需要一个实现类以传入,通常都是用它实现类匿名类的匿名对象,使用时才new,要想下次使用还得重新new。
System类:
由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方便的进行调用。
属性:in:标准输入流(键盘输入),out:标准输出流(显示器)和err:标准错误输出流(显示器)。
方法:
1、long currentTimeMillis()
2、void exit(int status):该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表异常退出。
3、void gc():该方法的作用是请求系统进行垃圾回收。
Math类
数学相关的工具类。
BigInteger和BigDecimal类:
BigInteger可以表示不可变的任意精度的整数。
BigInteger a = BigInteger.valueOf(100);
相关方法:
Biglnteger add(Biglnteger other)
Biglnteger subtract(Biglnteger other)
Biglnteger multipiy(Biginteger other)
Biglnteger divide(Biglnteger other)
Biglnteger mod(Biglnteger other)
static Biglnteger valueOf(long x)
BigDecimal表示不可变的任意位数的小数。
BigDecimala = BigDecimal.valueOf(99.99);
相关方法:
BigDecimal add(BigDecimal other)
BigDecimal subtract(BigDecimal other)
BigDecimal multipiy(BigDecimal other)
BigDecimal divide(BigDecimal other ,RoundingMode mode(舍入方式))
static BigDecimal valueOf(long x)
static BigDecimal valueOf(Double x)