Java常用类
字符串相关的类
String类
String类的特性
- String类是字符串类,java中所有的字符串字面值,都作为此类的示例实现。
- String类是一个final类,不可用继承,定义的变量是常量,定义之后也不能改变。
- String对象的字符内容是存储在一个字符数组value[]中的。
String str1 = “abc”;与String str2 = new String(“abc”);的区别?
- 前者是一个字符串常量,存储在字符串常量池中,目的是共享。
- 后者是字符串非常量对象,存储在堆中。
字符串对象的存储:
1 | String s1 = "javaEE"; |
1 | Person p1 = new Person("Tom",12); |
1 | String s1 = "hello"; |
通过上面这些例子,可以总结出来:
- 常量和常量的拼接结果任然在常量池,并且常量池中不会有相同内容的常量。
- 只要两个拼接的字符串有一个是变量,拼接的结果就在堆中。
- 如果拼接的结果调用intern()方法,返回值就在常量池中。
String的使用陷阱
String s1 = “a”; 说明:在字符串常量池中创建了一个字面量为”a”的字符串。
s1 = s1 + “b”; 说明:实际上原来的“a”字符串对象已经丢弃了,现在在堆空间中产生了一个字符串s1+”b”(也就是”ab”)。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能。
String s2 = “ab”;
说明:直接在字符串常量池中创建一个字面量为”ab”的字符串。
String s3 = “a” + “b”;
说明:s3指向字符串常量池中已经创建的”ab”的字符串。
String s4 = s1.intern();
说明:堆空间的s1对象在调用intern()之后,会将常量池中已经存在的”ab”字符串赋值给s4。
String类的常用方法
int length(); 返回字符串的长度
char charAt(int index); 返回索引出的字符串
boolean isEmpty(); 判断字符串是否为空
String toLowCase(); 将字符串全部转换为小写
String toUpperCase(); 将字符串全部转换为大写
String trim(); 将字符串首位的空格去掉,返回字符串的副本
boolean equals(String str); 比较两个字符串内容是否相同
boolean equalsIgnoreCase(String str); 比较两个字符串内容是否相同,忽略大小写
String concat(String str); 将指定字符串拼接到该字符串的结尾
int conpareTo(String str);比较两个字符串的大小
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 值序列
int indexOf(String str); 返回指定子字符串在此字符串中第一次出现处的索引
int indexOf(String str, int fromIndex); 从指定的索引开始,获取指定子字符串在此字符串中第一次出现处的索引值
int lastIndexOf(String str); 返回指定子字符串在此字符串中最右边出现处的索引值
int lastIndexOf(String str, int fromIndex); 返回指定子字符串在此字符串中最后 一次出现处的索引值,从指定的索引开始反向搜索 注:indexOf()和lastIndexOf()方法如果未找到都是返回-1
String replace(char oldChar, char newChar); 返回一个新的字符串,它是通过用 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个,如果超过了,剩下的全部都放到最后一个元素中。
String与字符数组的转换
字符数组 —> 字符串
String 类的构造器:String(char[]) 和 String(char[],int offset,int length) 分别用字符数组中的全部字符和部分字符创建字符串对象。
字符串 —> 字符数组
char[] toCharArray():将字符串中的全部字符存放在一个字符数组中的方法。
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin):提供了将指定索引范围内的字符串存放到数组中的方法。
String与字节数组转换
字节数组 —> 字符串
String(byte[]):通过使用平台的默认字符集解码指定的 byte 数组,构 造一个新的String。
String(byte[],int offset,int length) :用指定的字节数组的一部分,即从数组起始位置offset开始取length个字节构造一个字符串对象。
字符串 —> 字节数组
public byte[] getBytes() :使用平台的默认字符集将此 String 编码为byte 序列,并将结果存储到一个新的 byte 数组中。
public byte[] getBytes(String charsetName) :使用指定的字符集将此String 编码到 byte 序列,并将结果存储到新的 byte 数组。
1 | String str = "中"; |
StringBuffer类
StringBuffer类的特性
- java.lang.StringBuffer代表可变的字符序列,JDK1.0中声明,可以对字符串进行修改,并不会产生新的对象
- StringBuffer类使用必须构造器生成对象,有三个构造器:
- StringBuffer() 初始容量为16的字符串缓冲区
- StringBuffer(int size) 自定容量的字符串缓冲区
- StringBuffer(String str) 将内容初始化为指定字符串内容
- 很多方法与String相同
1 | String s = new String("我喜欢学习"); |
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() 把当前字符序列逆转
注意:在使用append()和insert()时,如果原来数组的长度不够,可以自动扩容
StringBuilder类
StringBuilder类和StringBuffer类非常相似,类中提供的方法也差不多,这里不再赘述。
String、StringBuffer和Stringbuilder三者的对比:
String(JDK1.0):不可变字符序列
StringBuffer(JDK1.0):可变字符序列、线程安全、效率低
StringBuilder(JDK5.0):可变字符序列、线程不安全、效率高
时间日期相关的API
JDK8之前的
java.lang.System类
System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。此方法可以用于计算时间差。
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 其中: dow 是一周中的某一天 (Sun, Mon,Tue, Wed, Thu, Fri, Sat),zzz是时间标准。
其他很多方法都过时了
java.text.SimpleDateFormate类
Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat 类是一个不与语言环境有关的方式来格式化和解析日期的具体类。
SimpleDateFormate类可以对时间日期进行格式化:日期 –> 文本、解析:文本 –> 日期
格式化:
SimpleDateFormat() 默认的格式和语言环境创建对象
SimpleDateFormat(String pattern) 该构造方法可以用参数pattern指定的格式创建一个对象,该对象调用String format(Date date) 方法格式化时间对象date
解析:
Date parse(String source) 将给定的字符串解析为一个日期
1 | Date date = new Date(); // 产生一个Date实例 |
java.util.Calendar类
Calender描述
Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能
获取Calender实例的方法
1.使用Calender.getInstance()方法
2.调用他的子类GregorianCalender的构造器
一个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,以此类推,十二月是11
- 获取星期时:周日是1,周二是2……周六是7
JDK8中新的
如果我们可以跟别人说:“我们在1502643933071见面,别晚了!”那么就再简单不过了。但是我们希望时间与昼夜和四季有关,于是事情就变复杂了。JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被弃用了。而Calendar并不比Date好多少。它们面临的问题是:
可变性:像日期和时间这样的类应该是不可变的。
偏移性:Date中的年份是从1900开始的,而月份都从0开始。
格式化:格式化只对Date有用,Calendar则不行。
此外,它们也不是线程安全的;不能处理闰秒等。
LocalDate、LocalTime、LocalDateTime
Java 8 吸收了 Joda-Time 的精华,以一个新的开始为 Java 创建优秀的API。新的 java.time 中包含了所有关于本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime) 和持续时间(Duration)的类。历史悠久的 Date 类新增了 toInstant() 方法,用于把 Date 转换成新的表示形式。这些新增的本地化时间日期 API 大大简 化了日期时间和本地化的管理。
- LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存储生日、纪念日等日期。
- LocalTime表示一个时间,不是日期。
- LocalDateTime是用来表示日期和时间的,是最常用的类之一。
| 方法 | 描述 |
|---|---|
| now()/ now(ZoneId zone) | 静态方法,根据当前时间创建对象/指定时区的对象 |
| of() | 静态方法,根据指定的日期/时间创建对象 |
| getDayOfMonth/getDayOfYear() | 获得月份天数(1-31)/获得年份天数(1-366) |
| getDayOfWeek() | 获得星期(返回一个DayOfWeek枚举值) |
| getMonth() | 获得月份,返回一个Month枚举值 |
| getMonthValue()/getYear() | 获得月份(1-12)/获得年份 |
| getHour()/getMinute()/getSecond() | 获得当前对象对应的小时、分钟、秒 |
| withDayOfMonth()/withDayOfYear()/withMonth()/withYear() | 将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象 |
1 | //Duration:用于计算两个“时间”间隔,以秒和纳秒为基准 |
Instant(瞬时)
instant:时间线上的一个瞬时点。这可能被用来记录应用程序中的事件时间戳。
在处理时间和日期的时候,我们通常会想到年,月,日,时,分,秒。然而,这只是时间的一个模型,是面向人类的。第二种通用模型是面向机器的,或者说是连续的。在此模型中,时间线中的一个点表示为一个很大的数,这有利于计算机处理。在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在Java中,也是从1970年开始,但以毫秒为单位。
java.time包通过值类型Instant提供机器视图,不提供处理人类意义上的时间单位。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级。
格式化与解析日期或时间
java.time.format.DateTimeFormatter 类:该类提供了三种格式化方法:
预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
| 方法 | 描述 |
|---|---|
| ofPattern(String pattern) | 静态方法 , 返回一个指定字符串格式的DateTimeFormatter |
| format(TemporalAccessor t) | 格式化一个日期、时间,返回字符串。 |
| parse(CharSequence text) | 将制定的字符串序列解析为一个日期、时间 |
1 |
其他相关API
- ZoneId:该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris
- ZonedDateTime:一个在ISO-8601日历系统时区的日期时间,如 2007-12- 03T10:15:30+01:00 Europe/Paris。
- 其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式,例如: Asia/Shanghai等
- Clock:使用时区提供对当前即时、日期和时间的访问的时钟。
- 持续时间:Duration,用于计算两个“时间”间隔
- 日期间隔:Period,用于计算两个“日期”间隔
- TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整 到“下一个工作日”等操作。
- TemporalAdjusters : 该类通过静态方法 (firstDayOfXxx()/lastDayOfXxx()/nextXxx())提供了大量的常用 TemporalAdjuster 的实现。
Java比较器
在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间 的比较问题。
Java实现对象排序的方式有两种:
自然排序:java.lang.Comparable
定制排序:java.util.Comparator
自然排序:java.lang.Comparable
描述
Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序。
实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过 compareTo(Object obj) 方法的返回值来比较大小。如果当前对象this大于形参对象obj,则返回正整数,如果当前对象this小于形参对象obj,则返回负整数,如果当前对象this等于形参对象obj,则返回零。
实现Comparable接口的对象列表(和数组)可以通过 Collections.sort 或 Arrays.sort进行自动排序。实现此接口的对象可以用作有序映射中的键或有 序集合中的元素,无需指定比较器。
各个数据类型的比较方式:
- String:按照字符串中字符的Unicode值进行比较
- Character:按照字符的中字符的Unicode值进行比较
- 数值类型对应的包装类以及BigInteger、BigDecimal:按照它们对应的数值大小进行比较
- Boolean:true 对应的包装类实例大于 false 对应的包装类实例
- Date、Time等:后面的日期时间比前面的日期时间大
示例:
1 | class Goods implements Comparable { |
定制排序: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), 从而允许在排序顺序上实现精确控制。
还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的 顺序,或者为那些没有自然顺序的对象 collection 提供排序。
示例:
1 | Goods[] all = new Goods[4]; |
System类
基本概述
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。
由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方便 的进行调用。
成员变量
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运行时环境(JRE)版本 java.home java安装目录 os.name 操作系统名称 os.version 操作系统版本 user.name 用户的账户名 user.home 用户的主目录 user.dir 用户的当前的工作目录
Math类
java.lang.Math提供了一系列静态方法用于科学计算。其方法的参数和返回 值类型一般为double型。
abs 绝对值
acos,asin,atan,cos,sin,tan 三角函数
sqrt 平方根
pow(double a,doble 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) 角度—>弧度
BigInteger和BigDecimal
BigInteger
Integer类作为int的包装类,能存储的最大整型值为2 31-1,Long类也是有限的,最大为2 63-1。如果要表示再大的整数,不管是基本数据类型还是他们的包装类 都无能为力,更不用说进行运算了。
java.math包的BigInteger可以表示不可变的任意精度的整数。BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。另外,BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、 位操作以及一些其他操作。
常用方法:
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) :返回其值为 (thisexponent) 的 BigInteger。
BigDecimal
一般的Float类和Double类可以用来做科学计算或工程计算,但在商业计算中,要求数字精度比较高,故用到java.math.BigDecimal类。
BigDecimal类支持不可变的、任意精度的有符号十进制定点数。
常用方法:
- public BigDecimal add(BigDecimal augend)
- public BigDecimal subtract(BigDecimal subtrahend)
- public BigDecimal multiply(BigDecimal multiplicand)
- public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)