包装类:
包装类概念:主要是将基本数据类型转换成类,使其具有类的特点,可以调用类中的方法。
基本数据类型及其包装类对应关系
基本数据类型 | 包装类 |
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
注意:
其中Boolean和Char是对象型包装类(Object直接子类)
另外六种为数值型包装类(Number直接子类)PS:Number是一个抽象类
装箱与拆箱:
装箱操作即为将基本数据类型转为包装类。
拆箱操作即为将包装类转为基本数据类型。
代码如下
包装类和基本数据类型转换:
jdk5以前为手动装箱和手动拆箱,在jdk5之后有了自动装箱和拆箱方式
自动装箱和拆箱代码如下
其实自动装箱拆箱底层逻辑与手动无异,其他包装类的方法类似。
String类
String类概念和理解:
String对象用于保存字符串即一组字符序列,字符串常量对象就是双引号扩起的字符序列;例如"你好"。字符串的字符使用的是Unicode字符编码,一个字符占两个字节(不区分字母汉字)。
PS,通过观察String类图可知,String类实现了Serializable接口,即String是可以串行化的(可以用于网络传输),实现了Comparable接口,说明String对象可以进行比较。
创建String对象两种方式:
方式1:直接赋值 String s = “java”;
方式2:调用String构造器 String s = new String("c++");
两种方式的区别:
方式1本质上是从常量池中查找是否有“java”数据空间,如果有则直接指向,没有的话就创建然后指向。s最终指向的是常量池的空间地址。
方式2本质上是在堆中创建空间,里面有value属性指向常量池的“c++”空间,如果没有则创建后通过value指向,最终指向的是堆中的空间地址。
因此System.out.println(a == b); 结果返回false
String类常见方法代码实现如下:
String str1 = "hello";
String str2 = "HELLO";
String str3 = "hello1";
//equals比较内容是否相同,区分大小写
System.out.println(str1.equals(str2));//false
//equalsIgnoreCase 忽略大小写的判断内容是否相等
System.out.println(str1.equalsIgnoreCase(str2));//true
//length获取字符的个数,字符串的长度
System.out.println(str1.length());//5
//indexOf 获取字符在字符串对象中第一次出现的索引,索引从0开始,如果没有则返回-1
System.out.println(str1.indexOf('l'));//2
//lastIndexOf 获取字符在字符串中最后一次出现的索引,索引从 0 开始,如果找不到,返回-1
System.out.println(str1.lastIndexOf('l'));//3
//substring 截取指定范围的子串 实际是[1,4)
System.out.println(str1.substring(1,4));//ell
//截取后面所有字符
System.out.println(str1.substring(1));//ello
//toUpperCase转换成大写
System.out.println(str1.toUpperCase());//HELLO
//toLowerCase转换成小写
System.out.println(str2.toLowerCase());//hello
//concat 拼接字符串
System.out.println(str1.concat(str2));//helloHELLO
//replace 替换字符串中的字符(all)
System.out.println(str1.replace('l','m'));//hemmo
//split 分割字符串, 对于某些分割字符,我们需要 转义比如 | \\等
String[] spilt = str1.split("e");
for (int i = 0; i < spilt.length; i++) {
System.out.print(spilt[i]);
System.out.print(" ");
}
System.out.println();
//toCharArray 转换成字符数组
char[] chars = str1.toCharArray();
for (int j = 0; j < chars.length; j++) {
System.out.println(chars[j]);
}
//compareTo 比较两个字符串的大小,如果前者大
// 则返回正数,后者大,则返回负数,如果相等,返回 0
// (1) 如果长度相同,并且每个字符也相同,就返回 0
// (2) 如果长度相同或者不相同,但是在进行比较时,可以区分大小
// 就返回 if (c1 != c2) {
// return c1 - c2;
// }
// (3) 如果前面的部分都相同,就返回 str1.len - str2.len
String m = "wang";
String n = "zhang";
String z = "wang";
System.out.println(n.compareTo(m));//第一个字符不同,返回'z' - 'w' 3
System.out.println(m.compareTo(z));//0
//format 格式字符串
String name = "zhy";
int age = 18;
double score = 97.8;
String info1 = "我的姓名缩写是" + name + "\t我的年龄是"
+ age + "\t我的成绩是" + score;
System.out.println(info1);
String formatStr = "我的姓名缩写是%s 我的年龄是%d 我的成绩是%.2f";
String info2 = String.format(formatStr,name,age,score);
System.out.println(info2);
字符串具有特性
观察源码String是final类,代表不可变的字符序列,字符串是不可变的,字符串对象一旦被分配,其内容是不可变的
StringBuffer和StringBuilder:
String类保存字符串常量,每次更新都需要开辟新的空间,效率特别低,因此java设计者提供了StringBuffer和StringBuilder来增强String的功能,提高效率。
StringBuffer的对象可以串行化(即可以在网络传输)。
StringBuffer父类中AbstractStringBuilder有属性char[] value 不是final说明可以将字符串内容存放在堆中,所以在变化(增加删除)时不需要每次更换地址,创建对象,而String每次变化都需要创建一个新的地址指向,效率高于String。
StringBuffer是一个final类,不能被继承。
StringBuilder是一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全)。用在字符串缓冲区被单个线程使用的时候,比StringBuffer要快。
StringBuffer上主要操作时append和insert方法可以重载这些方法接受任意类型的数据。
日期类
JDK8后日期类加入了LocalDate(日期-年月日)、LocalTime(时间-时分秒)、LocalDateTime(日期时间-年月日时分秒)
LocalDate只包含日期,可以获取日期字段
LocalTime只包含时间,可以获取时间字段
LocalDateTime包含日期加时间,可以获取日期和时间字段
日期类常见方法代码实现
//调用now()函数获取当前日期的时间对象,注意返回的是国外的时间格式
LocalDateTime Ldt = LocalDateTime.now();
System.out.println(Ldt);
//使用DateTimeFormater对日期对象格式化
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String time = dateTimeFormatter.format(Ldt);
System.out.println(time);
System.out.println("年=" + Ldt.getYear());
System.out.println("月=" + Ldt.getMonth());
System.out.println("月=" + Ldt.getMonthValue());
System.out.println("日=" + Ldt.getDayOfMonth());
System.out.println("时=" + Ldt.getHour());
System.out.println("分=" + Ldt.getMinute());
System.out.println("秒=" + Ldt.getSecond());
LocalDate now = LocalDate.now(); //可以获取年月日
LocalTime now1 = LocalTime.now();//可以获取到时间
System.out.println(now + " " + now1);
时间戳Instant及Date类转换的方式代码实现
//获取表示当前时间戳的对象
Instant now01 = Instant.now();
System.out.println(now01);
//通过form把Instant转成Date
Date date = Date.from(now01);
//通过date的toInstant把date转成Instant对象
Instant instant = date.toInstant();
System类
System类常见方法代码实现
//exit()退出程序--0表示的是一个状态,正常的状态
//System.exit(0);
//arraycopy复制数组元素,一般使用Arrays.copyOf完成复制数组
int[] mm = {1,2,3,4,5};
int[] nn = new int[5];//nn中当前是{0,0,0,0,0}
// 源数组mm the source array;
// srcPos: 从源数组的哪个索引位置开始拷贝
// nn : 目标数组,即把源数组的数据拷贝到哪个数组
// destPos: 把源数组的数据拷贝到 目标数组的哪个索引
// length: 从源数组拷贝多少个数据到目标数组
System.arraycopy(mm,0,nn,0,mm.length);
System.out.println(Arrays.toString(nn));
Date d = new Date();
d = null;
System.gc();
// 在调用这句gc方法时,上面已经失去了d引用的new Date()被回收