字符串相关的类
String
- String 是一个 final 类,代表不可变的字符序列。
- 字符串是常量 ,用双引号引起来表示。 它们的值在创建之后不能更改。
- String 对象的字符内容是存储在一个字符数组 value[] 中的。
- String 实现了Serializable, Comparable接口,表明String是支持序列化的,可比较大小的
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() 方法,返回值就在常量池中
- 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) 返回指定子字符串在此字符串中最后
一次出现处的索引,从指定的索引开始反向搜索 - 注:
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转换
StringBuffer
String、StringBuffer、StringBuilder的异同
- String:不可变的字符序列;底层使用char[] 存储;最慢
- StringBuffer:可变字符序列;线程安全的,效率低;底层使用char[] 存储;较快
- StringBuilder:可变字符序列;线程不安全的,效率高;底层使用char[] 存储;最快
源码分析:
String str1 = new String();// char[] value = new char[0];
String str2 = new String("abc");//char[] value = new char[]{'a','b','c'};
StringBuffer sb1 = new StringBuffer();//char[] value = new char[16];底层创建长度是16的数组
StringBuffer sb2 = new StringBuffer("abc");//char[] value = new char["abc".length+16];
sb2.length为3
扩容问题:长度扩容为原来长度*2+2,同时将原有数组赋值到新的数组中
开发中建议:使用 StringBuffer(int capacity)或 StringBuilder(int capacity)
常用方法:
- 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 ():把当前字符序列逆转 - public int indexOf (String str)
- public String
substring (int start,int end) - public int
length() - public char
charAt (int n) - public void
setCharAt (int n ,char ch)
StringBuilder
StringBuilder 和 StringBu ffer 非常类似,均代表可变的字符序列 而且提供相关功能的方法也一样
- 增 append
- 删 delete
- 改 setChar
- 查 charAt
- 插 insert
- 遍历 for + charAt / toString
- 长度 length
互相转换
- String——> StringBuffer、StringBuilder:调用StringBuffer和StringBuilder的构造器
- StringBuffer、StringBuilder——>String:调用String的构造器、StringBuffer和StringBuilder的toString方法
日期时间API
java.lang.System
System
类提供的 public static long currentTimeMillis() 用来返回当前时间与 1970 年 1 月 1 日 0 时 0 分 0 秒之间以==毫秒==为单位的时间差。此方法适于计算时间差。
java.util.Date 类
java.util.Date 类
|---java.sql.Date类 // 继承关系
1.两个构造器的使用
- Date 使用无参构造器创建的对象可以获取本地当前时间。
- Date(long date) 创建指定毫秒数的Date对象
2.两个方法的使用
- toString() :把此 Date 对象转换为以下形式的 String dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat) zzz 是时间 标准 。
- getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
3.java.sql.Date对应数据库中的日期类型的对象
实例化:java.sql.Date d = new java.sql.Date(23132323123L);println出来为“1999-02-12”格式
java.sql.Date—>java.util.Date:多态
java.util.Date—>java.sql.Date:
Date d = new Date(); java.sql.Date d1 = new java.sql.Date(d.getTime());
java.text.SimpleDateFormat 类
Date 类的 API 不易于国际化,大部分被废弃了 java.text.SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体 类。
它允许进行格式化:日期—>文本 、 解析:文本—>日期
// 1. 实例化,使用默认构造器
SimpleDateFormat sdf = new SimpleDateFormat();
// 2. 格式化:日期-->字符串
Date date = new Date();
System.out.println(date);
String format = sdf.format(date);
System.out.println(format);
// 3. 解析:字符串-->日期
String str = "19-12-28 上午11:21";
Data data1 = sdf.parse(str);
System.out.println(date1);
/*按照指定方式格式化和解析*/
// 4. 实例化,使用带参构造器
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
// 5. 格式化:日期-->字符串
String format = sdf.format(date);
System.out.println(format);
// 6. 解析:字符串-->日期
Data data1 = sdf.parse("2020-01-21 12:45:55");// 格式符合构造器中的格式
System.out.println(date1);
java.util.Calendar 日历类(抽象类)
// 1.实例化
// 方式一:创建其子类(GregorianCalendar)对象
// 方式二:调用其静态方法getInstance()
Calendar calendar = Calendar.getInstance();
// 2. 常用方法
// get()
int days = calendar.get(Calendar.DAY_OF_MONTH);// 返回当前时间是这个月的第几天
int days = calendar.get(Calendar.DAY_OF_YEAR);// 返回当前时间是这一年的第几天
// set()
calendar.set(Calendar.DAY_OF_MONTH, 22);// 修改当前时间为这个月的第几天,修改了calendar
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));// 22
// add()
calendar.add(Calendar.DAY_OF_MONTH, 3);// 天数可以为负数 如:-3
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));// 25
// getTime() 日历类--->Date
Date date = calendar.getTime();
// setTime() Date--->日历类
Date date = new Date();
calendar.setTime(date);
注意
- 获取月份 时: 一月 是 0 ,二月是 1 ,以此类推 12 月是 11
- 获取星期时: 周日是 1 ,周二是 2 。 。。。周六是 7
以下是JDK8新日期时间API
可变性:像日期和时间这样的类应该是不可变的。
偏移性:
Date 中的年份是从 1900 开始的,而月份都从 0 开始。
格式化:格式化只对
Date 有用, Calendar 则不行。
此外,它们也不是线程安全的;不能处理闰秒等。
- java.time
包含值对象的基础包 - java.time.chrono
提供对不同的日历系统的访问 - java.time.format
格式化和解析时间和日期 - java.time.temporal
包括底层框架和扩展特性 - java.time.zone
包含时区支持的类 - 说明:大多数开发者只会用到基础包和format 包,也可能会用到 temporal 包。因此,尽管有 68 个新的公开类型,大多数开发者,大概将只会用到其中的三分之一。
LocalDate、LocalTime、LocalDateTime
LocalDate 、 LocalTime 、 LocalDateTime 类是其中较重要的几个类,它们的实例是==不可变==的对象。
- 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() | 将月份天数、 年份天数 、 月份 、 年份修改为指定的值并返回新 的对象 |
plusDays(), plusWeeks(),plusMonths(), plusYears(),plusHours() | 向当前对象添加几天 、 几周 、 几个月 、 几年 、 几小时 |
minusMonths()/minusDays()/minusYears()/minusHours() | 从当前对象减去 几 月 、 几周 、 几 天 、 几年 、 几小时 |
Instant
java.time 包通过值类型 Instant 提供机器视图,不提供处理人类意义上的时间单位。 Instant 表示时间线上的一点,而不需要任何上下文信息,例如,时区。概念上讲, 它只是简单的表示自 1970 年 1 月 1 日 0 时 0 分 0 秒( UTC )开始的秒数。 因为 java.time 包是基于纳秒计算的,所以 Instant 的精度可以达到纳秒级。1秒=1000毫秒=10^6微吗秒=10^9纳秒
时间戳是指格林威治时间
1970 年 01 月 01 日 00 时 00 分 00 秒 (北京时间 1970 年 01 月 01
日 08 时 00 分 00 秒)起至现在的总秒数。
方法 | 描述 |
---|---|
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_TIMEDateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; LocalDateTime localDateTime = LocalDateTime.now(); String str = formatter.format(localDateTime); TemporalAccessor parse = formatter.parse("2019-02-18T15:42:18.797"); System.out.println(parse);
本地化相关的格式。如: ofLocalizedDateTime(FormatStyle.LONG)
// 本地化相关的格式。如:ofLocalizedDateTime() //FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT :适用于LocalDateTime DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG); //格式化 String str2 = formatter1.format(localDateTime); System.out.println(str2);//2019年2月18日 下午03时47分16秒 // 本地化相关的格式。如:ofLocalizedDate() // FormatStyle.FULL / FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT : 适用于LocalDate
自定义的格式。如: ofPattern(“yyyy MM dd hh:mm:ss”)
// 重点: 方式三:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”) DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"); //格式化 String str4 = formatter3.format(LocalDateTime.now()); System.out.println(str4);//2019-02-18 03:52:09 //解析 TemporalAccessor accessor = formatter3.parse("2019-02-18 03:52:09"); System.out.println(accessor);
其他API
- ZoneId 该类中包含了所有的时区信息 一个时区的 ID 如 Europe/Paris
- ZonedDateTime 一个在 ISO 8601 日历系统时区的日期时间 如 2007 12
03 T 10 15 30 01 00 Europe/Paris 。- 其中每个时区都对应着 ID 地区 ID 都为 区域 城市 的格式 例如:
Asia/Shanghai 等
- 其中每个时区都对应着 ID 地区 ID 都为 区域 城市 的格式 例如:
- Clock 使用时区提供对当前即时 、 日期和时间的访问的时钟 。
- 持续时间: Duration 用于计算两个 时间 间隔
- 日期间隔: Period 用于计算两个 日期 间隔
- TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整到“下一个工作日”等操作。
- TemporalAdjusters : 该类通过静态方法
(firstDayOfXxx()/lastDayOfXxx()/ 提供了大量的常用
TemporalAdjuster 的实现 。
Java比较器
Java 实现对象排序的方式有两种:
- 自然排序: java.lang.Comparable
- 定制排序: java.util.Comparator
- 两者比较:Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小;Comparator接口属于临时比较。
自然排序 java.lang.Comparable
像String、包装类等实现了Comparable接口,重写了compareTo()方法。
重写compareTo(obj)方法的规则:
- 如果当前对象this大于形参对象obj,则返回正整数;
- 如果当前对象this小于形参对象obj,则返回负整数;
如果当前对象this等于形参对象obj,则返0
对于自定义类来说,如果需要排序,我们可以让==自定义类实现Comparable接口,重写compareTo(obj)方法。在compareTo(obj)方法中指明如何排序==。
实现 Comparable 接口的对象列表(和数组)可以通过 Collections.sort 或
Arrays.sort 进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
Comparable 的典型 实现 默认都是从小到大排列的
- String :按照字符串中字符的 Unicode 值进行比较
- Character :按照字符的 Unicode 值来进行比较
- 数值类型对应的包装类以及 BigInteger 、 BigDecimal :按照它们对应的数值大小进行比较
- Boolean true 对应的包装类实例大于 false 对应的包装类实例
- Date 、 Time 等:后面的日期时间比前面的日期时间大
定制排序 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 提供排序 。
System类
void exit(int status)
该方法的作用是退出程序。其中 status 的值为 0 代表正常退出,非零代表异常退出。 使用该方法可以在图形界面编程中实现程序的退出功能等。native long currentTimeMillis()
该
方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时
间和 GMT 时间 格林威治时间 )1970 年 1 月 1 号 0 时 0 分 0 秒所差的毫秒数。void gc()
该
方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况。String getProperty(String key)
该方法的作用是获得系统中属性名为 key 的属性对应的值。系统中常见的属性名以及属性的作用如下表所示:| 属性名 | 属性说明 |
| —————— | ————————— |
| 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,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
java.math 包的 BigInteger 可以表示==不可变==的任意精度的整数 。 BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。另外, BigInteger 还提供以下运算:模算术、 GCD 计算、质数测试、素数生成、位操作以及一些其他操作。
构造器: 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 。
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)