字符串类
final 不能被继承
String是一个final类 ,代表不可变的字符序列
String 底层存在一个char型数组中
使用一对“”表示
实现Serializable接口: 表示可序列化的,和io流有关
Comparable 接口:可比较大小
内部定义了final char【】 value 存储字符串数据
不可变性体现
通过字面量“区别new 方式赋值”的方式给一个字符串赋值,此时字符串常量池中,常量池中不会存储相同内容的字符串
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
s1 = "hello";
System.out.println(s1);
System.out.println(s2);
}
当字符串重新赋值时,不能在原有的value进行修改,必须重新开辟一块内存重新存储
因为原有value是final类型,不能修改
String s3 = "abc";
s3 += "def";
System.out.println(s3);
拼接后 也不会在原有的value扩展内存,而是重新找地方进行赋值
使用replace方法修改 字符串中的字符,原字符串不会改变,新字符串存到新地址的内存中
String s4 = s3.replace('a','b');
System.out.println(s3);
System.out.println(s4);
abcdef
bbcdef
不同实例化方式对比
字面量定义
String s1 = "abc";
通过new构造器定义(不只有这一种构造器)
String s1 = new String("hello");
存在字符串常量池中,地址相同
String s1 = "abc";
String s2 = "abc";
new的存在堆空间中,地址不同
堆空间存储new的对象 另外的char【】数组存在常量池中,如果常量池中存在,则不新建
String s1 = new String("hello");
String s2 = new String("hello");
String不同拼接方式对比
String s1 = "javaee";
String s2 = "hadoop";
String s3 = "javaeehadoop";
String s4 = "javaee"+"hadoop";
String s5 = s1+"hadoop";
String s6 = "javaee"+s2;
只有s4 == s3
字面量声明的存在常量池中,因为不能变性,所以字面量声明的涉及到拓展s1 s2等功能,会在常量池中新开辟一块,而不是在原有的地址上进行扩招,所以即使输出一样也不会是用的同一块内存
使用intern方法得到的的返回值,得到的是常量池中存在的地址,地址与s3相同
String s4 = "javaee"+"hadoop";
String s6 = s5.intern();
jvm底层结构说明
jvm即java虚拟机,jvm一般分三种,默认一般为HotSpot
Heap堆 分三部分 新生区 养老区 永久存储区
永久区可以看作是方法区 字符串常量池在方法区,具体体现为元空间
String常用方法
.length 返回底层数组长度
charAt 通过这个方法调用底层数组指定元素,index格式,超过长度会报错
isEmpty 判断是否为空,看数组长度
toLowerCase 返回新字符串, 把字符串的大写变为小写,原本的不变
…回新字符串, 把字符串的小写变为大写,原本的不变
.trim();去除元素的首尾所有空格,中间的不会变。用法在输入用户名的时候可以用
equals 比较内容
equalsINIgnoreString ;在忽略大小写的情况下是否一样,验证码
concat 链接,拼接 一般直接用加号+
compareTo 实现的comparable接口的方法,比较两个字符串大小,涉及到字符串排序
substring 一个index 取现字符串的子串 返回index后面的字符串
substring 两个index 取左闭区间 右开区间字符串
endsWith 判断 是否由指定字符串结尾
startWith 判断 是否由指定字符串开始
从指定开始的位置 判断
boolean ee = s3.startsWith("ee", 4);
contains 判断是否包含
s3.contains(s1);
indexOf 返回字符串索引开始的位置,如果没有返回-1
lastIndexof 索引到最后一个
replace 通过newchar 替换字符/串,返回一个新字符/串 由于string不可变性,所以本身不会变
matches判断是否匹配正则表达式
split 切片
String和其他结构转换
String与基本数据类型、包装类之间转换 调用parse方法
int i = Integer.parseInt(str1);
其他类型类似
其他转String 调用String重载的valueOf(xxx)
String str = String.valueOf(i);
String与char[]之间转换
char[] charArray = str1.toCharArray();
String 与 byte【】转换
调用getBytes()方法,转换成ascll码
加final 后会加入到常量池中
可变的字符串序列 Stringbuilder
StringBuffer 线程安全效率低
底层用char型数组存储 但是没有加final 是可变的
Stringbuilder 线程不安全效率高
底层用char型数组存储 但是没有加final 是可变的
日期时间API
当前时间
-
new Date 方法
-
sout这个方法
-
getTime 获取时间戳 毫秒 可以计算的类型 比如加减
-
Date date = new Date(); System.out.println(date.toString()); System.out.println(date.getTime());//返回long型的值
Tue Mar 23 17:37:27 CST 2021
1616492247478
指定时间
看构造器
数据库类型对象
new java.sql.Date();
sql时间对象转换util对象
直接强转
util时间对象转换sql对象
父类的util.gettime 输入给sql时间对象
java.sql.Date date1 = new java.sql.Date(date.getTime());
simpleDateFormate
对Date进行格式化和解析
格式化,日期-----》字符串
解析 字符串------>日期
格式化 日期-----》字符串 Date 传入format 输出更容易理解
使用默认构造器
SimpleDateFormat format = new SimpleDateFormat();
String s = format.format(date);
System.out.println(s);
21-3-23 下午8:01
解析 字符串改为日期类型
String str = new String("19-8-21 下午8:00");
try {
Date date1 = format.parse(str);
System.out.println(date1);
} catch (ParseException e) {
e.printStackTrace();
Wed Aug 21 20:00:00 CST 2019
解析格式要正确
定制格式化
调用带参构造器
格式化
Date date = new Date();
SimpleDateFormat stf = new SimpleDateFormat("YYYY-MM-dd hh:mm:ss");
String s = stf.format(date);
System.out.println(s);
2021-03-23 08:20:13
YYYY-MM-dd hh:mm:ss 年月日 时分秒
解析
Date date1 = stf.parse("2021-03-23 08:20:13");
System.out.println(date1);
用户传的字符串转化为数据库能识别的Date
String birthday = new String("2003-02-04");//用户传的数据
SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd");//设置相同格式
Date date = format.parse(birthday);//util下的date
java.sql.Date date1 = new java.sql.Date(date.getTime());
System.out.println(date1);
2002-12-29//看着像字符串,但他是个sql.date
Calendar日历类
1.实例化 创建对象
抽象类 ,不能直接new
- 需要new他的子类 ,GregorianCalendar
- 调用个Getinstance方法 通常用这个,还是上面那个子类造的
常用方法
get()
月的第几天等等 周几 等获取平常使用的数据
set()
改信息
add()
在本身日期上加 几天等等 减法用复数
getTime()
把日历类转化为Date对象
setTime()
Date转化为日历类时间
LocalDate LocalTime LocaDateTime 使用
.now 获取当前日期 时间等
of()
指定日期时间
LocalDateTime localDateTime = LocalDateTime.of(2020,10,18,20,18);
System.out.println(localDateTime);
2020-10-18T20:18
get类似使用
修改用with不用set
localDatetime有不可变性,不会修改本身,返回一个新的日期,本身不变
添加改为plus
instant 类使用 瞬时
得到毫秒数
DateTimeFormatter 格式化日期时间的工具类
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
导入module
复制过去只是一个普通文件,不能直接运行
进入右上角 project structure
进入modules
加减号 添加删除
Java比较器
比较对象里的某一属性大小
camparable 自然比较器
升序排序
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 0;
}
// return Double.compare(this.price,goods.price);
}
throw new RuntimeException("输入错误");
}
二级排序
@Override
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 this.name.compareTo(goods.name);
}
}
throw new RuntimeException("输入错误");
}
camparator定制排序
适用于
- 当前元素没有实现comparable接口 不方便修改代码,或者实现了comparable接口但是排序规则不适合当前操作,这个方法强行对多个对象进行整体排序比较
- 重写compar(Object o1,Object o2)方法,比较o1 o2 的大小
- 如果方法返回正整数 表示01 > 02; 如果方法返回负整数 表示01 < 02;
- 可以将comparator 传递给sort方法 如Collections.sort 或Arrays.sort 从而允许在排序上实现精确控制
- 可以使用compartor 来控制某些数据结构的顺序,如set 的顺序,或者为没有自然排序的集合提供排序
使用方法
例:Arrays.sort(arr,new Comparator()){
重写方法
}
//按照从大到小排序,因为前面已经写了comparable 所以调用了他的compareto方法,取反,得到了一个临时的从大到小排序,必须把01 02 强转成要比较的对象类型。
局限性,只适合完全取反
Arrays.sort(goods, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Goods&& o2 instanceof Goods){
Goods goods1 = (Goods) o1;
Goods goods2 = (Goods) o2;
return -goods1.compareTo(goods2);
}throw new RuntimeException("输入错误");
}
});
定制排序方法二
例:先按产品名称从低到高,再按价格从高到低
Arrays.sort(goods, new Comparator() {
//先按产品名称从低到高,再按价格从高到低
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Goods&& o2 instanceof Goods){
Goods goods1 = (Goods) o1;
Goods goods2 = (Goods) o2;
if (goods1.getName().equals(goods2.getName())){
return Double.compare(goods1.getPrice(),goods2.getPrice());
}else {
return goods1.getName().compareTo(goods2.getName());
}
}throw new RuntimeException("输入错误");
}
});
System工具类
代表系统
void exit(int status) 在图形化界面上退出程序
void gc 请求系统进行垃圾回收
getProperty(key) key可以是verson等 具体参考API
math工具类
数学操作相关 ,直接调用方法
BigInteger与BigDecimal
int能存储最大整形值为2的31次方-1 long能提供2的61次方-1 都是有限的
而Biginteger能表示任何精度的不可变的整数 有Integer包装类的所有方法
BigDecimal 对应的是浮点型 对精度要求非常高 大于10位时,用这个存储