目录
1 LocalDate、LocalTime、LocalDateTime
3 java.time.format.DateTimeFormatter 类
9.1 字符串相关的类
1 String特性
-
String是一个final类,代表 不可变的字符序列,也不能被继承。
-
String对象的字符内容是存储在一个字符数组value[]中的。
-
实现了Serializable接口:表示字符串支持序列化;Comparable接口:表示可以比较大小。
-
通过字面量方式(区别于new)给字符串赋值,此时的字符串值声明在字符串常量池中。
-
不可变性的体现:
-
当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有value赋值。
-
当对现有字符串进行连接操作时,也需要重新指定内存区域赋值。
-
调用replace方法修改指定字符或字符串时,也需要重新指定内存区域赋值。
-
String s1 = "abc";//字面量赋值方式
String s2 = "abc";
s1 = "hello";
sout ---> s1:hello s2:abc
String s3 = "abc";
s3 += "def";
sout ---> s3:abcdef s2:abc
String s4 = "abc";
String s5 = s4.replace('a', 'm');
sout ---> s4:abc s5:mbc
2 String对象创建
3 字符串拼接操作
-
常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
-
只要其中有一个是变量,结果就在堆中
-
如果拼接的结果调用intern()方法,返回值就在常量池中
例题:
引用传递的是地址值,而字符串具有不可变性,change中的赋值后,原来的str依然不变。
4 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 newChar):返回一个新的字符串,它是 通过用 newChar 替换此字符串中出现的 所有 oldChar 得到的。
-
String replace(CharSequence target, CharSequence replacement):使 用指定的字面值替换序列替换此字符串 所有 匹配字面值目标序列的子字符串。
-
String replaceAll(String regex, String replacement) : 使用给定的 replacement 替换此字符串所有匹配给定的 正则表达式(regex) 的子字符串。
-
String replaceFirst(String regex, String replacement) : 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
-
boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。
-
String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
-
String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此 字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
5 String数据类型转换
String--->基本数据类型:调用封装类的parseXxx(str)
基本数据类型--->String:调用String重载的ValueOf(xxx)
String--->char[]:str.toCharArray()
char[]--->String:调用String构造器
char[] c = new char[]{'a', 'b', 'c'};
String str = new String(c);
String--->byte[]:调用String的getBytes() 使用默认字符集进行转换; 或者可以自己指定字符集 getBytes("gbk")
byte[]--->String:调用String构造器(注意编码集与解码集一致)new String(btye[], 字符集)
6 StringBuffer与StringBuilder
相同:底层均用char[]数组存储
String:不可变的字符序列
StringBuffer:可变的字符序列 线程安全的,效率低
StringBuilder:可变的字符序列 djk5.0新增,线程不安全,效率高
源码分析:如何实现可变?
String str = new String(); //char[] value = new char[0];
String str1 = new String("abc"); //char[] value = new char[]{'a','b','c'};
//首先,StringBuffer的value不是final的
StringBuffer sb1 = new StringBuffer(); //char[] value = new char[16];--->底层创建了一个长度为16的数组
StringBuffer sb2 = new StringBuffer(); //char[] value = new char["abc".length() + 16];
说明:
-
sb2.length()输出结果为3(输出的是实际的数据量)
-
如果底层数组容量不够了,就需要扩容。默认情况下扩容为原来的2倍+2,同时将原有数组复制到新的数组中。建议使用时提前指定创建数组的容量,调用带参的构造器。
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() :把当前字符序列逆转
9.2 jdk8之前日期时间API
1 java.lang.System类
System类提供的
public static long currentTimeMillis()用来返回当前时
间与1970年1月1日0时0分0秒之间以
毫秒
为单位的时间差(时间戳)。
此方法适于计算时间差。
long time = System.currentTimeMillis();
2 java.util.Date类
表示特定的瞬间,精确到毫秒。
java.util.Date类
|---java.sql.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.sql.Date对应数据库中日期类型的变量
1. 实例化
long time = System.currentTimeMillis();
2. 对象转化
sql.Date--->util.Date:直接转(多态)
util.Date--->sql.Date:
情况1:
java.util.Date d = new java.sql.Date(2536982357829L);
java.sql.Date d2 = (java.sql.Date) d;
情况2:
java.util.Date d3 = new java.util.Date();
java.sql.Date d4 = new java.sql.Date(d3.getTime());
3 java.text.SimpleDateFormat类
使用:对日期Date类的格式化和解析
两个操作:
1. 格式化:日期--->字符串
//实例化SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat();
//格式化
java.util.Date date = new java.util.Date();
String format = sdf.format(date);
//输出y-M-d 上/下午3:20
//可以按照指定的方式进行格式化
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
2. 解析:格式化的逆过程,字符串--->日期
String str = "20-3-17 下午5:10"; //与对象sdf的格式保持一致
java.util.Date date1 = sdf.parse(str);
//指定格式解析
Date date2 = sdf1.parse("2020-02-18 11:48:27"); //要求字符串必须符合SimpleDateFormat识别的格式(构造器体现),否则会抛异常
4 java.util.Calendar(日历)类
是一个抽象类
1. 实例化:
//方式一:创建其子类(GregorianCalendar)的对象
//方式二:调用其静态方法getInstance()方法
Calendar calendar = Calendar.getInstance(); //这个对象也是GregorianCalendar类造的
2. 常用方法:
-
public int 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)
Calendar calendar = Calendar.getInstance();
//get()
int days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days); //得到今天是这个月的第几天
//set()
calendar.set(Calendar.DAY_OF_MONTH,22);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days); //22
//add()
calendar.add(Calendar.DAY_OF_MONTH,3);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days); //25
//getTime() 日历类--->Date
Date date = calendar.getTime();
System.out.println(date);//Thu Nov 25 23:32:46 CST
//setTime() Date--->日历类
Date date1 = new Date();
calendar.setTime(date1);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days); //27
9.3 jdk8之前中新日期时间API
Date和calendar中的问题:
-
可变性:像日期和时间这样的类应该是不可变的。
-
偏移性:Date中的年份是从1900开始的,而月份都从0开始。
-
格式化:格式化只对Date有用,Calendar则不行。
-
此外,它们也不是线程安全的;不能处理闰秒等。
jdk之前新增的API:
-
java.time – 包含值对象的基础包
-
java.time.chrono – 提供对不同的日历系统的访问
-
java.time.format – 格式化和解析时间和日期
-
java.time.temporal – 包括底层框架和扩展特性
-
java.time.zone – 包含时区支持的类
1 LocalDate、LocalTime、LocalDateTime
其中,LocalDateTime更常用一些。
举例:
//now():获取当前日期+时间
LocalDateTime localDateTime = LocalDateTime.now();
//of():获取指定的年、月、日、时、分、秒,没有偏移量
LocalDateTime localDateTime1 = LocalDateTime.of(2020,10,6,3,56,21);
//体现不可变性
LocalDateTime localDateTime1 = localDateTime.withDayOfMonth(22);//只有返回值localDateTime1改变了,localDateTime的值没变
2 Instant(瞬时)
时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间
戳。
Instant instant = Instant.now(); //获取本初子午线对应的当前时间
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8)); //添加时间偏移量(东8区)
3 java.time.format.DateTimeFormatter 类
格式化或解析日期、时间。(类似于SimpleDateFormat)
方法:
1. 预定义的标准格式。如:
ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
//格式化:日期--->字符串
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
LocalDateTime localDateTime = LocalDateTime.now();
String str = formatter.format(localDateTime); //2021-11-28T23:44:41.189
//解析:字符串--->日期
TemporalAccessor parse = formatter.parse(str); //{},ISO resolved to 2021-11-28T23:44:41.189
2. 本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG) 适用于:LocalDateTime
//格式化:日期--->字符串
DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
String format = formatter1.format(localDateTime); //21-11-28 下午11:46
3. 自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”) (常用)
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
String format1 = formatter2.format(localDateTime); //2021-11-28 11:52:01
9.4 java比较器
功能:java中的对象,正常情况下,只能进行比较:== 或 != 不能使用>或<。在开发中,我们需要对多个对象进行排序,就要比较对象的大小。需使用两个接口(Comparable、Comparator)中的任何一个。
Java实现对象排序的方式有两种:
-
自然排序:java.lang.Comparable
-
定制排序:java.util.Comparator
1 自然排序:java.lang.Comparable
像String、包装类等都实现了Comparable接口,重写了其中的compareTo()方法,给出了比较两个对象大小的方法。
重写compareTo()方法的规则:
-
如果当前对象this大 于形参对象obj,则返回正整数,
-
如果当前对象this小于形参对象obj,则返回 负整数,
-
如果当前对象this等于形参对象obj,则返回零。
对于自定义类,需要实现Comparable接口,重写compareTo()方法,在其中指明如何排序。
//自定义货物类
public class Goods implements Comparable{
private String name;
private double price;
public Goods(String name, double price) {
this.name = name;
this.price = price;
}
public String toString() {
return "Goods{" + "name='" + name + '\'' + ", price=" + price + '}';
}
//按照价格从低到高排序,再按照产品名称排序
public int compareTo(Object o) {
if(o instanceof Goods){
Goods goods = (Goods) o;
if(this.price > goods.price)
return 1;
else if(this.price < goods.price)
return -1;
else
return this.name.compareTo(goods.name); //直接使用字符串比较
//或者:return Double.compare(this.price, goods.price);
}
throw new RuntimeException("传入数据类型不一致");
}
}
//排序
Goods[] arr = new Goods[4];
//赋值
//...
Arrays.sort(arr);
2 定制排序:java.util.Comparator
-
当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前操作,可以使用Comparator的对象来排序。
-
如果方法返 回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示 o1小于o2;如果返回0,表示相等。
//按照字符串从大到小顺序排列
String[] str = new String[]{"C","D","A","E","B"};
Arrays.sort(str, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1 instanceof String && o2 instanceof String){
String s1 = (String) o1;
String s2 = (String) o2;
return -s1.compareTo(s2);
}
throw new RuntimeException("传入数据类型不一致");
}
});
System.out.println(Arrays.toString(str));
3 两种方式的对比
Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小。
Comparator接口属于临时比较。
9.5 System类
1 介绍
-
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。 该类位于java.lang包。
-
由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实 例化该类。其内部的成员变量和成员方法都是static的 。
2 属性
错误信息:err
输入流:in
输出流:out
3 方法
native long currentTimeMillis():
返回当前的计算机时间。(时间戳)
void exit(int status):
该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表
异常退出。
void gc():
是请求系统进行垃圾回收。
String getProperty(String key):
获得系统中属性名为key的属性对应的值。key:java.version、os.name等。
9.6 Math类
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) 角度—>弧度
9.7 BigInteger与BigDecimal
1 BigInteger
java.math包的BigInteger可以表示不可变的任意精度的整数。
BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、
位操作以及一些其他操作。
2 BigDecimal
BigDecimal类支持不可变的、任意精度的有符号十进制定点数。
可以进行加减乘除等计算
BigInteger bi = new BigInteger("12433241123");
BigDecimal bd = new BigDecimal("12435.351");
BigDecimal bd2 = new BigDecimal("11");
System.out.println(bi);
//System.out.println(bd.divide(bd2)); //会报错,因为除不尽并且没有指定算多少位
System.out.println(bd.divide(bd2, BigDecimal.ROUND_HALF_UP));
System.out.println(bd.divide(bd2, 15, BigDecimal.ROUND_HALF_UP)); //保留15位小数