文章目录
枚举类型
定义格式:
enum Season{//1.通过enum替代class SPRING("春天"),SUMMER("夏天"); //2.创建SPRING对象,语法为:常量名(参数列表); //3.多个常量对象,使用 , 隔开 //4.若使用enum实现枚举,则常量对象定义语句需放在最前 private String name; private Season(String name){ this.name = name; } //无参构造器的情况,可以省略参数列表及其所在的小括号 //声明枚举对象时底层默认public static final修饰 }
特点与注意事项:
- 枚举对象、属性使用final+static修饰并以常量的规范命名,实现底层优化
- 枚举对象根据需要可以有多个属性,但不提供set方法以防止属性被修改
- 枚举类型的构造器一般设置为私有化,防止直接创建对象
- 使用enum后不可继承其他类,因enum隐式继承Enum,java是单继承机制
- 枚举类隐式被final修饰,不可被其他类继承
常用方法:
- toString:Enum类重写了,返回当前对象名,子类也可重写该方法,用于返回对象属性信息
- name:返回当前对象名,子类中不可重写
- ordinal:返回当前枚举常量对象的位置号,默认0开始
- values:返回当前枚举类中所有枚举常量
- valueOf:将字符串转换为枚举对象,要求字符串必须为已有常量名,否则异常
- compareTo:比较两个枚举常量的位置号,底层逻辑为调用(对象编号-参数的对象编号)
String类型解析
- String在java.lang包下,无需导包;所有双括号括起的字符序列都是其实例对象,如"Hello"
- 字符串字符使用Unicode字符编码,一个字符占两个字节
- String类被final修饰,故不可继承
- String中属性
private final char value[]
存放字符串内容,存储在常量池(有final修饰)- JDK7版本开始字符串常量池从方法区移动到堆内存中
- JDK11.0.3版本value属性更改为byte数组
- String类实现了接口
Serializable
可串行化,实现网络传输、Comparable
实现String对象相互比较
String类型构造器
String s1 = new String();
String s2 = new String(String original);
String s3 = new String(char[] a);
String s4 = new String(char[] a , int startIndex , int count);
String s5 = new String(byte[] b);
String s6 = new String(StringBuffer buffer);
String创建及其区别
String s1 = "lxl";
//查看常量池中是否有"lxl"空间,有则直接指向,无则创建后指向
//s1最终指向常量池中的空间地址
String s2 = new String("lxl");
//堆中创建对象空间,其中维护了value属性,指向常量池中的"lxl"空间,若常量池中无"lxl"空间则重新创建,若有则直接指向
String s3 = "a"+"b";
//常量优化机制,直接在常量池中创建"ab",所以s3指向常量池中的"ab"对象
String a="a",b="b";
String s4 = a + b;
//底层先StringBuilder sb = new StringBuilder();
//sb.append("a"); sb.append("b");
//String s4 = sb.toString();
//sb.toString调用了new String(value,0,count)构造器
//最后s4指向堆中的String对象,对象中属性value指向常量池中的"ab"对象
//所以此处涉及3个对象创建
//任何字符串变量参与拼接,底层原理都是如此!!!
String常用方法
1.equals() 比较内容是否相同,区分大小写
2.equalsIgnoreCase() 比较内容是否相同,忽略大小写
3.length() 获取字符串长度
4.indexOf() 返回字符在字符串中第一次出现的索引,找不到返回-1
5.lastIndexOf() 返回字符在字符串中最后出现的索引,找不到返回-1
6.substring() 截取指定范围的子串
7.toUpperCase/toLowerCase() 转为大写/小写
8.concat() 拼接字符串
9.replace() 替换字符串中所有匹配char字符/CharSequence字符序列,返回新字符串,原字符串对象不变;CharSequence是String类型实现的接口,故该方法可以接受String类型参数
10.replaceAll() 替换字符串中所有匹配子字符串,返回新字符串,原字符串对象不变
10.replaceFirst() 替换字符串中第一匹配子字符串,返回新字符串,原字符串对象不变
10.split() 根据参数字符,分割字符串,返回字符串数组
11.compareTo() 比较两个字符串大小
12.toCharArray() 转为字符数组
13.format() 格式化字符串,%s字符串、%c字符、%d整型、%.2f浮点型(保留两位小数 )
StringBuffer类型解析
- java.lang.StringBuffer表示可变字符序列,用于频繁的字符串增删
- 方法大多与String相同,但StringBuffer是可变长度
- StringBuffer是容器,直接父类为AbstractStringBuilder
- 实现Serializable接口,可实现串行化
- AbstractStringBuilder中有个属性char value[] ,用于存放字符串内容,存放在堆内存中(无final修饰),value有默认长度,当更新后内容不超过默认长度时,不用更改其指向地址
- StringBuffer类被final修饰,不可被继承
StringBuffer构造器
1.StringBuffer() //构造一个不带字符的字符串缓冲区创(建一个对象,对象中value属性指向无值的字符数组),初始容量为16
2.StringBuffer(ChaerSequence seq) //构造一个字符字缓冲区,包含与CharSequence seq相同字符
3.StringBuffer(int capacity) //构造一个不带字符,固定初始容量的字符缓冲区(即指定char[]长度)
4.StringBuffer(String str) //构造一个字符字缓冲区,包含与str相同字符,字符缓冲区长度为str.length()+16
StringBuffer方法
1.append() //增加字符串
2.delete(start,end) //删除start到end(不包含end)字符串
3.replace(start,end,str) //替换start到end(不包含end)的字符串为str
4.indexOf() //子串在字符串中第一次出现的索引,无则返回-1
5.insert() //插入字符串
6.length() //获取字符串长度
StringBuffer与String转换
//String(str对象) -> StringBuffer:
StringBuffer sb1 = new StringBuffer(str);//第一种
StringBuffer sb2 = new StringBuffer();//第二种
sb2 = sb2.append(str);
//StringBuffer -> String
1.String str1 = sb1.toString();//第一种
2.String str2 = new String(sb1);//第二种
StringBuilder类型解析
- 可变字符序列,该类提供一个与StringBuffer兼容的API,但不保证同步。该类被设计为StringBuffer简易替代物,用于字符串缓冲区被单个线程使用时。允许的情况下优先使用StringBuilder,处理速度快
- StringBuilder是容器,直接父类为AbstractStringBuilder
- StringBuilder主要操作为append和insert,可重载这些方法以接受任意类型的数据
- StringBuilder没有做互斥处理(无synchronized关键字),故只能在单线程下使用
包装类的使用
包装类类型:
基本数据类型 包装类 byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean 包装类的应用:
- 包装类作为泛型
- 基本类型转字符串类型(toString方法)
- 字符串类型转基本数据类型(除Character外,包装类都提供parseXxx静态方法)
包装类的继承与实现关系:
- Boolean/Character继承了Object,实现了Serializable、Comparable
- Byte/Short/Integer/Float/Double继承了Number,实现了Comparable
- Number继承了Object,实现了Serializable
拆箱与装箱/String类与包装类转换:
int n1 = 100; Integer num1 = new Integer(n1); Integer num2 = Integer.valueOf(n1);//手动装箱 int n2 = Integer.intValue();//手动拆箱 Integer num3 = n1; //自动装箱,jdk5后,底层使用Integer.valueOf() int n3 = num3; //自动拆箱,底层使用Integer.intValue() //包装类 -> String Integer i = 100; String s1 = i+""; String s2 = i.toString(); String s3 = String.valueOf(i); String s4 = Integer.toString(i); //String -> 包装类 String j = "123"; Integer i1 = Integer.parseInt(j); //返回int后自动装箱 Integer i21 = Integer.valueOf(j);
包装类常用方法:
- Integer.MIN_VALUE => 返回int类型最小值
- Integer.MAX_VALUE => 返回int类型最大值
- Integer.compare() => 判断两个int类型数据大小
- Character.isDigit() => 判断是不是数字
- Character.isLeter() => 判断是不是字母
- Character.isUpperCase() => 判断是不是大写
- Character.isLowerCase() => 判断是不是小写
- Character.isWhitespace() => 判断是不是空格
- Character.toUpperCase() => 转为大写
- Character.toUpperCase() => 转为小写
Math类的使用
常用方法(public static修饰):
abs
求绝对值
pow
求幂a^b
ceil
向上取整
floor
向下取整
round
四舍五入
sqrt
开方
random
求随机数[0,1)求a~b随机数:
(int)(a+Math.random()*(b-a+1))
max
求最大数
min
求最小数
Arrays类的使用
常用方法(public staic修饰):
toString
返回数组的字符串形式sort
排序(自然排序与定制排序)binarySearch
通过二分搜索法搜索查找,要求数组排序过copyOf
数组元素复制,第二参数为复制长度fill
数组填充,数组每个元素填充为第二参数值equals
数组比较,两个数组元素一样返回trueasList
返回List序列
UUID类的使用
常用方法:
randomUUID
静态工厂检索一个类型4(伪随机生成)的UUID。nameUUIDFromBytes(byte[] name)
静态工厂根据指定的字节数组检索类型3(基于名称)UUID 。toString()
返回代表这个UUID的String对象。
System类的使用
exit
退出当前程序arraycopy
复制数组元素,适合底层调用,一般使用Arrays.copyOf
currentTimeMillens
返回1970.1.1零时到现在的毫秒数(long类型)gc
运行垃圾回收机制
BigInteger、BigDecimal类型
构造方法:
BigDecimal b1 = new BigDecimal("0.1"); //推荐使用字符串作为参数的构造方法的创建形式 BigDecimal b2 = new BigDecimal(0.1); //b2!=0.1, 仍然存在小数无法精准转换问题 BigDecimal b3 = BigDecimal.valueof(0.1); //调用BigDecimal的静态方法获取对象,可以解决基本数据类型无法精确转换问题
常用方法有:
Date类的使用(一代日期类)
构造方法:
Date date1 = new Date();//无参构造器 long time1 = date.getTime();//获取该Date对象的毫秒形式时间 Date date2 = new Date(time1);//有参构造器,根据毫秒形式时间生成Date对象
常用方法:
boolean after(Date when) //测试此日期是否在指定日期之后。 boolean before(Date when) //测试此日期是否在指定日期之前。 long getTime() //返回自1970年1月1日以来,由Date对象表示的00:00:00 GMT的毫秒数。 void setTime(long time) //将此Date对象设置为1970年1月1日00:00:00 GMT后的 time毫秒的时间点。
注意:Date类开发时,基本上只用无参构造方法!很多功能方法基本上用另外一个类Calendar【日历类】
特别注意:运算毫秒数时一定要将第一个参与运算的常量值加上L后缀,不然会发生int类型数据溢出
DateFormat类的使用
作用:格式化日期形式,主要用于日期对象与字符串间转换;DateFormat是一个抽象类,开发中使用其子类
SimpleDateFormat
构造方法:
SimpleDateFormat s = SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 创建对象的时候,指定格式(日期转成字符串的格式) //y-年、M-月、d-天、H/h-时、m-分、s-秒、S-毫秒、E-星期
常用功能:
String format(Date date); // 将日期转成字符串 Date parse(String source); // 将字符串转成日期类型,若字符串格式与日期格式不匹配时报ParseException异常
Calendar类的使用(二代日期类)
概述:Caldendar日历类是一个抽象类,构造器由
protected
修饰,是通过静态方法获取其子类对象获取实例对象:
Calendar calendar = Calendar.getInstance(); // 使用默认时区和区域设置获取日历类Calendar对象 //多态,抽象父类的引用指向子类对象
常用方法:
boolean after(Object when) //测试此日期是否在指定日期之后 boolean before(Object when) //测试此日期是否在指定日期之前。 //Object需为Calendar子类,否则直接返回false int compareTo(Calendar c) //判断二者对应毫秒数大小,-1前0相等1后 void setTime(Date date) //根据Date对象设置该Calendar对象的时间 void setTimeInMillis(long millis) //根据millis毫秒值设置Calendar对象时间 Date getTime() //获取当前Calendar对象转换的Date对象 long getTimeInMillis() //获取当前Calendar对象对应的毫秒值 void set(int field,int value) //设置field日历字段的值 int get(int field) //获取field日历字段的值 //月份返回0~11(1~12月),星期返回1~7(星期日-六) //HOUR字段返回12小时制,HOUR_OF_DAY返回24小时制 //YEAR年、MONTH月、DATE日、MINUTE分钟、SECOND秒 void add(int field,int amount) //根据日历规则将field字段添加或减去给定的值。
LocalDateTime类的使用
概述:
- LocalDateTime类是JDK8加入的,包含日期+时间
- LocalDate只包含日期,可获取日期字段,年月日
- LocalTime只包含时间,可获取时间字段,时分秒
- Instant 时间戳
使用方式:
LocalDateTime ldt = LocalDateTime.now(); //返回表示当前时间的LocalDateTime对象 System.out.println(ldt.getYear());//获取ldt对象的年字段 System.out.println(ldt.getHour());//获取ldt对象的时字段 LocalDateTime day_10 = ldt.plusDays(10)); //获取10天后的时间对象 LocalDateTime day_10 = ldt.minusDays(10)); //获取10天前的时间对象 //DateTimeFormatter对象进行三代日期格式化: DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss E"); String strDate = dtf.format(ldt);//将ldt对象转为格式化字符串 //Instant类似于Date,并提供与Date类转换的方式 Instant now = Instant.now(); Date date = Date.from(now);//Instant对象 -> Date对象 Instant instant = date.toInstant();//Date对象 -> Instant对象