
常用类
1、包装类
包装类的分类
针对八种基本数据类型定义相应的引用类型——包装类
有了类的特点,就可以调用类中的方法
包装类和基本数据的转换
jdk5 前的手动装箱和拆箱方式,装箱:基本类型 -> 包装类型,反之,拆箱
jdk5 以后(含jdk5)的自动装箱和拆箱方式
自动装箱底层调用的是 valueOf 方法,比如Integer.valueOf()
包装类型和String类型的相互转换
WrapperVSString.java
Integer类和Character类的常用方法
Integer.MIN_VALUE:返回最小值
Integer.MAX_VALUE:返回最大值
Character.isDigit('a'):判断是不是数字
Character.isLetter('a'):判断是不是字母
Character.isUpperCase('a'):判断是不是大写
Character.isLowerCase('a'):判断是不是小写
Character.isWhitespace('a'):判断是不是空格
Character.toUpperCase('a'):转成大写
Character.toLowerCase('a'):转成小写
2、String类
String 对象用于保存字符串,也就是一组字符序列
字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)都只占用两个字节
String 类有很多构造器,构造器的重载
String 类实现了接口 Serializeable (String 可以串行化:可以在网络传输)
接口 Comparable (String 对象可以比较大小)
String 是final类,不能被其他的类继承
String 有属性 private final char value[];用于存放字符串内容
注意:value 是一个final类型,不可以修改(需要功力):即value不能指向新的地址,但是单个字符内容是可以变化的
两种创建String对象的区别
方式一:直接赋值 String s = "abc";
方式二:调用构造器 String s2 = new String("abc");
方式一:先从常量池查看是否有“abc”数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址
方式二:先在堆中创建空间,里面维护了value属性,指向常量池的abc空间。
如果常量池没有”abc“,重新创建如果有,直接通过value指向。最终指向的是堆中的空间地址
字符串的特性
String 是一个final 类,代表不可变的字符序列
字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的。
String a = "hello"; String b = "abc"; String c = a + b;//c是指向堆中的对象(String) value[] -> 池中"helloabc" String d = "helloabc"; System.out.println(c == d);//false
String c = a + b;
底层是 StringBuilder sb = new StringBuilder(); sb.append(a); sb.append(b); sb 是在堆中,并且append是在原来字符串的基础上追加的。
解读:
先创建一个 StringBuilder sb = StringBuilder()
执行 sb.append("hello");
sb.append("abc");
String c = sb.toString();
最后其实 c 是指向堆中的对象(String) value[] -> 池中"helloabc"
String类的常见方法
String类是保存字符串常量。每次更新都需要重新开辟空间,效率较低,因此提出了 StringBuilder 和 StringBuffer 来增强String的功能,并提高效率。
equalsIgnoreCase 忽略大小写,判断内容是否相等
length 获取字符个数,字符串长度
indexOf 获取字符/字符串在字符串对象中第一次出现的索引,索引从0开始,如果找不到,则返回-1
lastIndexOf 获取字符/字符串在字符串对象中最后一次出现的索引,索引从0开始,如果找不到,则返回-1
substring 截取指定范围的字串
str.substring(6); ==> 截取索引6以后的全部字符
str.substring(2,5); ==> 从索引2开始截取到索引5-1的位置
toUpperCase 转换成大写
toLowerCase 转换成小写
concat 拼接字符串
replace 替换字符串
replace("11","22"); 把字符串中的所有11替换成22
split 分割字符串,对于某些分割字符,需要转义
toCharArray 转换成字符数组
compareTo 比较两个字符串的大小,如果前者大,则返回正数,后者大,则返回负数,相等返回0;
长度相同或者不同:进行比较时,可以区分大小,就返回(c1 - c2)
前面部分都相同,就返回 str1.len - str2.len
format 格式字符串
占位符有:%s 字符串;%c 字符;%d 整形;%.2f 浮点型(会进行四舍五入)
String name = "john"; int age = 10; double score = 56.546; char gender = '男'; String info = String.format("我的姓名是%s,年龄是%d,成绩是%.2f,性别是%c,希望大家喜欢我",name,age,score,gender); //String formatStr = "我的姓名是%s,年龄是%d,成绩是%.2f,性别是%c,希望大家喜欢我"; //String info2 = String.format(formatStr,name,age,score,gender) System.out.printfln(info);
3、StringBuffer类
基本介绍
Java.lang.StringBuffer 代表可变的字符序列,可以对字符串内容进行增删
很多方法与String相同,但StringBuffer是可变长度的
StringBuffer是一个容器
String与StringBuffer比较
String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率低。
StringBuffer保存的是字符串常量,里面的值可以更改,每次StringBuffer的更新实际上是可以更新的内容,不用每次更新地址,效率较高
String --> StringBuffer
使用构造器
StringBuffer stringBuffer = new StringBuffer(str)
使用append方法
StringBuffer stringBuffer = new StringBuffer(str)
stringBuffer = stringBuffer.append(str)
StringBuffer --> String
使用StringBuffer提供的 toString方法
String s = stringBuffer.toString();
使用构造器
String s = new String(stringBuffer);
StringBuffer方法
增
append()方法
StringBuffer s = new StringBuffer("abc");
s.append("sss");//abcsss
删
s.delete(11,14);//删除 11~14字符 [11,14)
改
s.replace(9,11,"xyz");//使用“xyz”替换索引9-11的字符 [9,11)
查
int indexOf = s.indexOf("111");//查找指定的字符串在字符第一次出现的索引,找不到返回-1
插
s.insert(9,"22");//在索引为9的位置插入 “22” ,原来索引为9的内容自动后移
长度
s.length();
4、StringBuilder类
基本介绍
一个可变的字符序列。此类提供一个与StringBuffer 兼容的 API,但不保证同步(StringBuilder 不是线程安全)。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,在大多数实现中,他比 StringBuffer 要快
在 StringBuffer 上的主要操作是append和insert方法,可重载这些方法,已接受任意类型的数据。
理解
StringBuilder 继承 Abstract StringBuilder 类
实现了 Serializable ,说明StringBuilder 对象是可以串行化(对象可以网络传输,可以保存到文件)
是final类,不能被继承
StringBuilder 对象字符序列任然是存放在其父类 AbstractStringBuilder 的 char[] value;因此,字符序列是堆中
StringBuilder 的方法没有做互斥的处理,即没有synchronized(已同步) 关键字,因此在单线程的情况下使用
String、StringBuffer 和StringBuilder的比较
StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且方法也一样
String:不可变字符序列,效率低,但复用率高
StringBuffer:可变字符序列,效率较高(增删)、线程安全
StringBuilder:可变字符序列、效率最高、线程不安全
String、StringBuffer 和 StringBuilder 的选择
使用的原则:
如果字符串存在大量的修改操作,一般使用 StringBuffer 或 StringBuilder
如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder
如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer
如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等
5、Math类
基本介绍
Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数
均为静态方法
常用方法
abs 绝对值
int abs = Math.abs(-9);
pow 求幂
double pow = Math.pow(2,4);
//2的4次方ceil 向上取整,返回>=改参数的最小整数(并转成double类型)
double ceil = Math.ceil(-3.0001);
//-3.0floor 向下取整,返回<=改参数的最大整数(并转成double类型)
double floor = Math.floor(3.9);
//3.0round 四舍五入
long round = Math.round(-5.001);//5
sqrt 开方
double sqrt = Math.sqrt(9.0);
//3.0random 求随机数,返回的是 0<= X <1 之间的一个随机小数
max 返回最大值
min 返回最小值
6、Arrays类
常见方法应用案例
Arrays里面包含了一系列静态方法,用于管理或操作数组(比如排序和搜索)
toString 返回数组的字符串形式
Arrays.toString(arr)
sort 排序(自然排序和定制排序)
binartSearch 通过二分搜索法进行查找,要求必须排好序
copyOf 数组元素的复制
fill 数组元素的填充(全部)
equals 比较两个数组内容是否完全一致
asList 将一组值,转换成list
7、System类
exit 退出当前程序
System.exit(0);
// 0表示一个状态,表示正常退出arraycopy 复制数组元素,比较适合底层调用,一般使用Arrays.copyOf 完成复制数组
int[] src = {1,2,3};
int[] dest = new int[3];
System.arraycopy(src,0,dest,0,3);
//(源数组,原数组那个索引位置开始,目标数组,拷贝到目标索引那个位置开始,从源数组拷贝多少个数据到目标数组)currentTimeMillens 返回当前时间距离1970-1-1 的毫秒数
gc 运行垃圾回收机制
System.gc();
8、BigInteger 和 BigBecimal
介绍
BigInteger 适合保存比较大的整形
BigDecimal 适合保存精度更高的浮点型(小数)
常见方法
add 加
subtract 减
multiply 乘
divide 除
8、日期类
第一代日期类
Date 精确到毫秒,代表特定的瞬间
SimpleDateFormat 格式和解析日期的类格式化和解析日期的具体类。它允许进行日期格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化
注意:
默认输出的日期格式是国外的方式,因此通常要对格式进行转换
创建 SimpleDateFormat 对象,可以指定相应格式
Date d1 = new SimpleDateFormat sdf = new SimpleDateFormat(”yyyy年MM月dd日 hh:mm:ss E“);
String format = sdf.format(d1)
格式使用的字母是规定好的,不能乱写
可以把一个格式化的字符串转化为对应的Date
String s = "1996年01月01日 10:20:30 星期一;"
Date parse = sdf.parse(s);
得到的Date仍然在输出时,还是按照国外的形式,如果希望指定格式输出,需要转换
第二代日期类
第二代日期类,主要就是 Calendar(日历)。
public abstract class Calendar extends Object implements Serializsble,Cloneable,Comparable<Calendar>
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法
注意
Calendar 是一个抽象类,并且构造器是private
可以通过 getInstance() 来获取实例
提供大量的方法和字段
Calendar 返回月的时候要 +1 ,是按照 0 编号的
Calendar 没有提供对应的格式化类,需要自己编写
按照 24小时进制来获取时间, Calendar.HOUR --改成-->Calendar.HOUR_OF_DAY
第三代日期类
前两代日期类的不足分析
JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法 已经在JDK 1.1引入Calendar 类之后被弃用了。而Calendar也存在问题
可变性:像日期和时间这样的类应该是不可变的
偏移性:Date中年份是从1900开始的,而月份都是从0开始的
格式化:格式化只对Date有用,Calendar则不行
它们也不是线程安全的;不能处理润秒(每隔2天,多出1秒)
常见方法
LocalDate 只包含日期(年月日),可以获取日期字段
LocalTime 只包含时间(时分秒),可以获取时间字段
LocalDateTime 包含日期+时间,可以获取日期和时间字段
LocalDateTime ldt = new LocalDateTime.now();
DateTimeFormatter 格式日期类
类似于SimpleDateFormat
DateTimeFormatter dtf = DateTmineFormatter.oFPattern("yyyy年MM月dd日 HH小时mm分钟ss秒");
String str = dtf.format(ldt);
Instant 时间戳
类似于Date,提供了一系列和Date类转换的方式
Instant——>Date
Date date = Date.form(instant);
Date——>Instant
Instant instant = date.toInstant();