1、字符串相关的类
1.1、字符串相关的类:String
String声明为final的,不可被继承
String实现了Serializable接口:表示字符串是支持序列化的;实现了Comparable接口:表示String可以比较大小
String内部定义了final char[] value用于存储字符串数据
String:代表不可变的字符序列。简称:不可变性。
1、当对字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value进行赋值。
2、当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
3、当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串声明在字符串常量池中
字符串常量池中是不会存储相同内容的字符串的
/**
* String的实例化方式
* 方式一:通过字面量定义的方式
* 方式二:通过new + 构造器的方式
*
* 面试题:String s = new String("abc");方式创建对象,在内存中创建了几个对象?
* 答:两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:"abc"
*/
@Test
public void test() {
// 通过字面量定义的方式:此时的s1和s2的数据javaEE声明在方法区中的字符串常量池中。
String s1 = "javaEE";
String s2 = "javaEE";
// 通过new + 构造器的方式:此时的s3和s4保存的地址值,是数据在堆空间中开辟空间以后对应的地址值
String s3 = new String("javaEE");
String s4 = new String("javaEE");
System.out.println(s1 == s2);// true
System.out.println(s1 == s3);// false
System.out.println(s1 == s4);// false
System.out.println(s3 == s4);// false
};
常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
只要其中有一个是变量,结果就在堆中。
如果拼接的结果是调用intern()方法,返回值就在常量池中
String s1 = "hello";
String s2 = "world";
String s3 = "hello" + "world";
String s4 = s1 + "world";
String s5 = s1 + s2;
String s6 = (s1 + s2).intern();
final String s7 = "hello"; // 此时的s7是一个常量
String s8 = s7 + "world";
System.out.println(s3 == s4);// false
System.out.println(s3 == s5);// false
System.out.println(s4 == s5);// false
System.out.println(s3 == s6);// true
System.out.println(s3 == s8);// true
1.2、字符串相关的类:String常用方法
int length():返回字符串的长度:return value.length
char charAt(int index):返回某索引处的字符return value[index]
boolean isEmpty():判断是否是空字符串:return value.length == 0
String toLowerCase():使用默认语言环境,将String中的所有字符转换为小写
String toUpperCase():使用默认语言环境,将String中的所有字符转换为大写
String trim():返回字符串的副本,忽略首部空白和尾部空白
boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写
String concat(String str):将指定字符串连接到此字符串的结尾。等价于用"+"
int compareTo(String anotherString):比较两个字符串的大小
String substring(int beginIndex):返回一个新的字符串,它是此字符串从beginIndex开始截取到最后的一个子字符串
String substring(int beginIndex, int endIndex):返回一个新的字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串
boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定的前缀开始
boolean contains(CharSequence s):当且仅当此字符串包含指定的char值序列时,返回true
int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引
int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
String replace(char oldChar, char new Char):返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的
String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串
String replaceAll(String regex, String replacement):使用给定的replacement替换此字符串所有匹配给定的正则表达式的子字符串
String replaceFirst(String regex, String replacement):使用给定的replacement替换此字符串匹配给定的正则表达式的第一个子字符串
boolean matches(String regex):告知此字符串是否匹配给定的正则表达式
String[] split(String regex):根据给定正则表达式的匹配拆分此字符串
String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中
1.3、String与基本数据类型、包装类之间的转换
String --> 基本数据类型、包装类:调用包装类的静态方法:parseXxx(str)
基本数据类型、包装类 --> String:调用String重载的valueOf(xxx)
1.4、String与char[]之间的转换
String --> char[]:调用String的toCharArray()
char[] --> String:调用String的构造器
1.5、String与byte[]之间的转换
String --> byte[]:调用String的getBytes()
byte[] --> String:调用String的构造器
1.6、String、StringBuffer、StringBuilder三者的异同?
String:不可变的字符序列;底层使用final char[]存储
StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储
StringBuilder:可变的字符序列;JDK 5.0新增的,线程不安全的,效率高;底层使用char[]存储
1.7、StringBuffer源码分析
扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中
指导意义:开发中建议大家使用:StringBuffer(int capacity) 或 StringBuilder(int capacity)
String str = new String(); // char[] value = new char[0];
String str1 = new String("abc"); // char[] value = new char[]{'a','c','c'};
StringBuffer sb1 = new StringBuffer(); // char[] value = new char[16];底层创建了一个长度是16的数组
System.out.println(sb1.length()); //0
sb1.append('a');//value[0] = 'a';
sb1.append('b');//value[1] = 'b';
StringBuffer sb2 = new StringBuffer("abc");//char[] value = new char["abc".length() + 16];
1.8、StringBuffer类的常用方法
StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
StringBuffer delete(int start, int end):删除指定位置的内容
StringBuffer replace(int start, int end, String str):把[start, end)位置替换为str
StringBuffer insert(int offset, xxx):在指定位置插入xxx
StringBuffer reverse():把当前字符序列逆转
1.9、对比String、StringBuffer、StringBuilder三者的效率
从高到低排列:StringBuilder > StringBuffer > String
1.10、String与StringBuffer、StringBuilder之间的转换
String --> StringBufferr、StringBuilder:调用StringBuffer、StringBuilder构造器
StringBufferr、StringBuilder --> String:
调用String构造器
StringBuffer、StringBuilder的toString()
2、JDK 8之前的日期时间API
2.1、java.lang.System类
System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
2.2、java.util.Date类
表示特定的瞬间,精确到毫秒
构造器:
Date():使用无参构造器创建的对象可以获取本地当前时间
Date(long date)
常用方法
getTime():返回自1970年1月1日 00:00:00 GMT 以来此Date对象表示的毫秒数
toString():把此Date对象转换为以下的形式的String:dow mon dd hh:mm:ss zzz yyyy
2.3、java.text.SimpleDateFormat类
Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体类
格式化:
SimpleDateFormat():默认的模式和语言环境创建对象
public SimpleDateFormat(String pattern):该构造方法可以用参数pattern指定的格式创建一个对象
public String format(Date date):格式化时间对象date
解析:
public Date parse(String source):从给定字符串的开始解析文本,以生成一个日期
2.4、java.util.Calendar类
Calendar是一个抽象基类,主要用于完成日期字段之间相互操作的功能
获取Calendar实例的方法
使用Calendar.getInstance()方法
调用它的子类GregorianCalendar的构造器
一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想要的时间信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY、MINUTE、SECOND
public void set(int field, int value)
public void add(int field, int amount)
public final Date getTime()
public final void setTime(Date date)
注意
获取月份时:一月是0,二月是1,以此类推,12月是11
获取星期时:周日是1,周一是2,以此类推,周六是7
3、JDK 8中新日期时间API
3.1、新日期时间API出现的原因
可变性:像日期和时间这样的类应该是不可变的
偏移性:Date中的年份是从1900开始的,而月份都是从0开始
格式化:格式化只对Date有用,Calender则不行
此外,它们都不是线程安全的;不能处理闰秒等
3.2、LocalDate、LocalTime、LocalDateTime类
它们的实例是不可变的对象,分别表示使用ISO-8601日历系统的日期、时间、日期和时间。
创建方法:
now() / now(ZoneId zone):静态方法,根据当前时间创建对象/指定时区的对象
of():静态方法,根据指定日期/时间创建对象
get类的方法:
getDayOfMonth()/getDayOfYear():获得月份天数(1-31)/获得年份天数(1-366)
getDayOfWeek():获得星期几(返回一个DayOfWeek枚举值)
getMonth():获得月份,返回一个Month枚举值
getMonthValue()/getYear():获得月份(1-12)/获得年份
getHour()/getMinute()/getSecond():获得当前对象对应的小时、分钟、秒
set类的方法:
withDayOfMonth()/withDayOfYear()/withMonth()/withYear():将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象
操作类的方法:
plusDays()/plusWeeks()/plusMonths()/plusYears()/plusHours():向当前对象添加几天、几周、几个月、几年、几小时
minusMonths()/minusWeeks()/minusDays()/minusYears()/minusHours():从当前对象减去几月、几周、几天、几年、几小时
3.3、瞬时:Instant
时间线上的一个瞬时点,同样的,在Java中也是从1970年开始,但以毫秒为单位
常用方法:
now():静态方法,返回默认UTC时区的Instant类的对象
ofEpochMilli(long epochMilli):静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象
atOffset(ZoneOffset offset):结合即时的偏移来创建一个OffsetDateTime
toEpochMilli():返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳
3.4、java.time.format.DateTimeFormatter类
预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
本地化相关的格式。如ofLocalizedDateTime(FormatStyle.LONG)
自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss E”)
常用方法:
ofPattern(String pattern):静态方法,返回一个指定字符串格式的DateTimeFormatter
format(TemporalAccessor t):格式化一个日期、时间,返回字符串
parse(CharSequence test):将指定格式的字符序列解析为一个日期、时间
4、Java比较器
4.1、方式一:自然排列:java.lang.Comparable
Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序
实现Comparable的类必须实现compareTo(Object obj)方法,两个对象即通过compareTo(Object obj)方法的返回值来比较大小。
如果当前对象this大于形参对象obj,则返回正整数
如果当前对象this小于形参对象obj,则返回负整数
如果当前对象this等于形参对象obj,则返回零
实现Comparable接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排列。
4.2、方式二:定制排序:java.util.Comparator
当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用Comparator的对象来排序
重写compare(Object o1, Object o2)方法,比较o1和o2的大小
如果方法返回正整数,表示o1大于o2
如果方法返回0,表示相等
返回负整数,表示o1小于o2
可以将Comparator传递给sort方法(如Collections.sort或Arrays.sort),从而允许在排序顺序上实现精确控制
5、System类
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。
成员变量:
in:标准输入流(键盘输入)
out:标准输出流(显示器)
err:标准错误输出流(显示器)
成员方法:
native long currentTimeMillis():该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1日0时0分0秒所差的毫秒数。
void exit(int status):该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表异常退出。
void gc():该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况。
String getProperty(String key):该方法的作用是获得系统中属性名为key的属性对应的值。
java.version:java运行时环境版本
java.home:java安装目录
os.name:操作系统的名称
os.version:操作系统的版本
user.name:用户的账户名称
user.home:用户的主目录
user.dir:用户的当前工作目录
6、Math类
abs:绝对值
acos,asin,atan,cos,sin,tan:三角函数
sqrt:平方根
pow(double a, double b):a的b次幂
log:自然对数
exp:e为底指数
max(double a, double b)
min(double a, double b)
random():返回0.0到1.0的随机数
long round(double a):double型数据a转换为long型(四舍五入)
toDegrees(double angrad):弧度–>角度
toRadians(double angdeg):角度–>弧度
7、BigInteger与BigDecimal
7.1 BigInteger类
java.math包的BigInteger可以表示不可变的任意精度的整数
构造器:
BigInteger(String val):根据字符串构建BigInteger对象
常用方法:
public BigInteger abs():返回此BigInteger的绝对值的BigInteger
BigInteger add(BigInteger val):返回其值为(this+val)的BigInteger
BigInteger subtract(BigInteger val):返回其值为(this-val)的BigInteger
BigInteger multiply(BigInteger val):返回其值为(this*val)的BigInteger
BigInteger divide(BigInteger val):返回其值为(this/val)的BigInteger。整数相除只保留整数部分
BigInteger remainder(BigInteger val):返回其值为(this%val)的BigInteger
BigInteger[] divideAndRemainder(BigInteger val):返回包含(this/val)后跟(this%val)的两个BigInteger的数组
BigInteger pow(int exponent):返回其值为(this的exponent次方)的BigInteger
7.2 BigDecimal类
BigDecimal类支持不可变的、任意精度的有符号十进制定点数
构造器:
public BigDecimal(double val)
public BigDecimal(String val)
常用方法:
public BigDecimal add(BigDecimal augend)
public BigDecimal subtract(BigDecimal subtrahend)
public BigDecimal multiply(BigDecimal multiplicand)
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)