Java常用类
字符串相关的类
String的特性
- String类:代表字符串。Java程序中所有的字符串字面量都作为此类的实例实现
- String是一个final类,代表_不可变的字符序列_
- 字符串是常量,用双引号引起表示。他们的值在创建之后不能更改
- String对象的字符内容是存储在一个字符数组 value[]中的
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
}
结论:
- 常量与常量的拼接结果是在常量池中,且常量池中不会存在相同内容的常量
- 只要其中有一个是变量,结果就在堆中
- 如果拼接结果调用 intern()方法,返回值就在常量池中
常用API
- int length(): 返回字符串的长度
- char charAt(): 返回某索引处的字符
- boolean isEmpty(): 判断字符串是否是空字符串
- String toLowerCase(): 将字符转换为小写
- String toUpperCase(): 将字符转换为大写
- 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-1结束
- 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 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、StringBuffer、StringBuilder类对比
- 三者有何异同?
String: 不可变的字符序列;底层用char[]进行存储
StringBuffer: 可变的字符序列;线程安全,效率低;底层用char[]进行存储
StringBuilder: 可变的字符序列;JDK5.0新增,线程不安全的,效率高;底层用char[]进行存储
String 底层使用的是一个 final char[] 进行存储,而StringBuild和StringBuffer使用的是一个char[]进行存储。
同时,StringBuffer和StringBuilder初始化时使用的是new char[16] - 扩容问题:默认情况下,扩容为原来的2倍+2,同时将原有数组的元素复制到新的数组中。
- 建议:开发中建议使用:StringBuffer(int capacity) 或 StringBuilder(int capacity),尽量避免扩容
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(): 把当前字符序列逆转
JDK8之前的日期时间API
- 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 yyy
其中dow是一周中的某一天(Sun,Mon,Tue,Wed,Thu,Fri,Sat),zzz是时间标准
- 构造器:
- java.text.SimpleDateFormat类
Date类的API不易于国际化,SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体类
允许进行格式化:日期–>文本 解析:文本–>日期- 格式化:
SimpleDateFormat(): 默认的模式和语言环境创建对象
public SimpleDateFormat(String pattern): 该构造方法可以用参数pattern指定的格式创建一个对象,该对象调用
public String format(Date date): 方法格式化时间对象date - 解析:
public Date parse(String source): 从给定字符串的开始解析文本,以生成一个日期
- 格式化:
- java.util.Calendar(日历)类
- Calendar是一个抽象基类,主要用于完成日期字段之间相互操作的功能
- 获取Calendar实例的方法
- 使用Calendar.getInstance()方法
- 调用它的子类GregorianCalendar的构造器
- 一个Calendar的实例是系统时间的抽象表示,通过 get(int field)方法来取得想要的时间信息。
- public void set(int field,int value);
- public void add(int field,int amount);
- public final Date getTime();
- public final void setTime(Date date);
JDK8中新日期时间API
背景:JDK8之前的API有一下几个不足
可变性:像日期和时间这样的类应该是不可变量的
偏移性:Date中的年份是从1900年开始,月份是从0开始
格式化:格式化只能针对Date,Calendar则不能使用
此外,线程不安全;也不能处理闰秒
- 第三次引入的API是成功的,并且Java 8中引入的java.time API已经纠正了过去的缺陷。
- Java 8 吸收了 Joda-Time的精华,以一个新的开始为Java创建优秀的API。新的 java.Time 中包含了所有关于本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。历史悠久的Date类新增了toInstant()方法,用于把Date转换成新的表示形式。这些新增的本地化时间日期API大大简化了日期时间和本地化的管理
- java.time 包含值对象的基础包
- java.time.chrono 提供对不同的日历系统的访问
- java.time.format 格式化和解析时间和日期
- java.time.temporal 包括底层框架和扩展特性
- java.time.zone 包含时区支持的类
- LocalDate、LocalTime、LocalDateTime类是其中较重要的几个类,他们的实例是不可变对象
- LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存储生日、纪念日等日期
- LocalTime表示一个时间,而不是日期
- LocalDateTime是用来表示日期和时间,这是一个最常用的类之一
方法 | 描述 |
---|---|
now() | 静态方法,根据当前时间创建对象/指定时区的对象 |
of() | 静态方法,根据指定日期/时间创建对象 |
getDayOfMonth()/getDayOfYear() | 获得月份天数(1-31)/获得年份天数(1-366) |
getDayOfWeek() | 获得星期几(返回一个DayOfWeek枚举值) |
getMonthd() | 获得月份,返回一个Month枚举值 |
getMonthValue()/getYear() | 获得月份(1-12)/获得年份 |
getHour()/getMinute/getSecond() | 获得当前对象对应的小时、分钟、秒 |
withDayOfMonth()/withDayOfYear()/withMonth()/withYear() | 将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象 |
plusDays(),plusWeeks(),plusMonths(),plusYears(),plusHours() | 向当前对象添加几天、几周、几个月、几年、几小时 |
minusMonths(),minusWeeeks(),minusDays(),minusYears(),minusHours() | 从当前对象减去几月、几周、几天、几年、几小时 |
瞬时:Instant
- Instant: 时间线上的一个瞬时点。这可能被用来记录应用程序中的时间时间戳
方法 | 描述 |
---|---|
now() | 静态方法,返回默认UTC时区的Instant类的对象 |
ofEpochMilli(long epochMilli) | 静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象 |
atOffset(ZoneOffset offset) | 结合即时的偏移量来创建一个 OffsetDateTime |
toEpochMilli() | 返回1970-01-01 00:00:00 到当前时间的毫秒数,即为时间戳 |
格式化与解析日期或时间
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 text) | 将指定格式的字符串序列解析为一个日期、时间 |
Java比较器
java实现对象排序的方式有两种:
- 自然排序:java.lang.Comparable
- 定制排序:java.util.Comparator
Comparable接口的使用
使用实例:
- 像String、包装类等实现了Comparable接口,重写了compareTo()方法,给出了比较两个对象大小的规则
- 重写compareTo(obj)的规则:
如果当前对象this大于形参对象obj,则返回正整数
如果小于则返回负整数数
如果等于返回零
Comparator定制排序
- 当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不合适当前的操作,那么可以考虑使用Comparator的对象来排序,强行对多个对象进行整体排序的比较
- 重写compare(Obj obj1,Obj obj2)方法。o1>o2,返回正整数,等于返回0,小于返回负整数。
- 可以将Comparator传递给sort方法(如Collections.sort或Arrays.sort),从而允许在排序顺序上实现精确控制。
- 还可以使用Comparator来控制某些数据结构的顺序,或者为那些没有自然排序的对象collection提供排序
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的属性对应的值。系统中常见的属性名以及属性的作用如下:
- native long currentTimeMillis():
属性名 | 属性说明 |
---|---|
java.version | Java运行时环境版本 |
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,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类型转换为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计算,质数测试,素数生成,位操作以及一些其他操作。
- 构造器
BigInteger(String val): 根据字符串构建BigInteger对象
BigDecimal
- 一般的Float类和Double类可以用来做科学计算或工程计算,但在商业计算中,要求数字精度比较高,所以使用java.math.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)