文章目录
一、八种包装类
(一)包装类
- Boolean
- Character
- Byte
- Short
- Integer
- Long
- Float
- Double
(二)体系图
(三)装箱与拆箱
装箱:基本数据类型转包装类
拆箱:包装类转基本数据类型
//jdk5之前
//手动装箱
int n1 = 100;
Integer integer = new Integer(n1);
Integer integer1 = Integer.valueOf(n1);
//手动拆箱
int i = integer.inValue();
//jdk5之后
//自动装箱
int n2 = 200;
Integer integer2 = n2;
//自动拆箱
int n3 = integer2;
(四)包装类型与String类型的转换
以Integer与String转化为例:
//包装类 - > String类
Integer i = 100;
//方法一
String str1 = i + "";
//方法二
String str2 = i.toString();
//方法三
String str3 = String.valueOf(i);
//String类 - > 包装类
String str4 = "12345";
//方法一
Integer i2 = Integer.parseInt(str4);//自动装箱
//方法二
Integer i3 = new Integer(str4);//构造器
(五)包装类常用方法
- Integer类
最大值:Integer.MIN_VALUE
最小值:Integer.MAX_VALUE - Character类
是否为数字:Character.isDigit(‘a’)
是否为字母:Character.isLetter(‘a’)
是否为大写:Character.isUpperCase(‘a’)
是否为小写:Character.isLowerCase(‘a’)
是否为空格:Character.isWhitespace(‘a’)
转大写:Character.toUpperCase(‘a’)
转小写:Cahracter.toLowerCase(‘A’)
(六)面试题
//关于Integer类的面试题:
//(1)m = 1 的底层是m = Integer.valueOf(a),看valueOf源码发现;
//a的范围在-128~127,就直接返回a;
//否则,new Integer(a).
Integer m = 1;
Integer m = 1;
System.out.println(m == n);//T
Integer x = 128;
Integer y = 128;
System.out.println(x == y);//F
//(2)只要有基本数据类型,判断的就是值是否相同
Integer i = 128;
int j = 128;
System.out.println(x == y);//T
二、String类
(一)String类介绍
- String对象用于保存字符串,也就是一组字符序列
- 字符串常量对象是用双引号括起的字符序列。例如:“你好”、“12.97”."boy"等
- 字符串的字符使用Unicode字符编码,一个字符(不区分字母还汉字)占两个字节
(二)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[], int ,int);
(三)创建String对象的两种方式【重要:注意理解!】
String str1 = "asdf";
String str2 = new String("asdf");
/*
第一种方式:先看常量池中是否有"asdf",有的话将地址给str1,没有的话就创建
第二种方式:在堆中创建空间,维护value属性,看常量池中是否有"asdf",如有将地址给value,没有则创建
*/
//例一:
String a = "asd";//创建一个"asd"
String b = "asd";//指向刚才在常量池中创建的"asd"
System.out.println(a.equals(b));//T
System.out.println(a == b);//T
String c = new String("asd");//指向堆中的value,而value指向刚才在常量池中创建的"asd"
System.out.println(a.equals(c));//T
System.out.println(a == c);//F
System.out.println(a == c.intern());//T intern():返回"asd"在常量池中的地址
System.out.println(c == c.intern());//F
内存分配图如下:
(四)字符串的特性
1)String类是一个final类,代表不可改变的字符序列
2)字符串是不可变的,一个字符串对象一旦被分配,其内容是不可变的,但地址可变
//例二:以下代码,创建了几个对象?4个
String str1 = "a";//一个
str1 = "b";//一个
String str2 = "c" + "d";//一个:等价于String str2 = "cd";
String str3 = str1 + str2;//一个:str3指向堆,堆指向"bcd"
//str2常量相加,看的是常量池地址;str3指向的是堆
//例三:【要重点理解】
public class Test {
String str = new String("hsp");
final char[] ch = {'j', 'a', 'v', 'a'};
public void change(String str, char ch[]){
str = "java";
ch[0] = 'h';
}
public static void main(String[] args) {
Test test = new Test();
test.change(test.str, test.ch);
System.out.println(test.str);
System.out.println(test.ch);
}
}
输出:
hsp
hava
分析:
1.首先开辟一个main栈
2.Test test = new Test();开辟一个堆,存test对象
2.test.change(test.str, test.ch);方法的调用会开辟一个新的栈2
3.栈2中形参str指向堆中的str,栈2形参ch执行那个堆中ch
4.str = "java";表示栈2中形参str变换地址,指向常量池中的"java"
5.ch[0] = 'h';修改了堆中ch[0]的内容
6.因此,test对象的str未改变,ch改变了
例三的内存分配图如下:
(五)String类的常用方法
- equals(String):比较字符串大小
- equalsIgnoreCase(String):忽略大小写比较内容是否相等
- length():获取字符串长度
- indexOf(Char/String):获取字符/字符串第一次出现的位置,找不到返回-1
- lastIndexOf(Char/String):获取字符/字符串最后一次出现的位置,找不到返回-1
- substring(int index):截取包括索引及之后所有字符
substring(int index1, int index2):截取index1到index2 - 1的字符 - trim():去掉前后空格
- charAt(int index):获得index索引处的字符
- toUpperCase():转换成大写
- toLowerCase():转换成小写
- concat(String):字符串拼接
- replace(String str1,String str2):子字符串str1替换成str2
- split(String):字符串分隔
- compareTo(String):比较大小,大返回整数,小返回负数,相等返回0
- toCharArry():转成字符数组
- format():格式化字符串
例:String.format(“姓名是%s 年龄是%d 成绩是%0.2f 性别是%c”, name, age, score, gender)
三、StringBuffer类
-
StringBuffer代表可变字符序列,可以对字符内容增删,长度可变
-
StringBuffer常用构造方法
StringBuffer str1 = new StringBuffer();
StringBuffer str2 = new StringBuffer(int capacity);
StringBuffer str3 = new StringBuffer(String str); -
String类与StringBuffer类的转化
//String->StringBuffer
String str1 = "hello";
//方法一:构造器
StringBuffer sb1 = new StringBuffer(str1);
//方法二:append方法
StringBuffer sb2 = new StringBuffer();
sb2.append(str1);
//StringBuffer->String
//方法一:toString()方法
String str2 = sb1.toString();
//方法二:构造器
String str3 = new String(sb1);
- StringBuffer常用方法
1)append(String/char/int…):追加
2)delete(int index1, int index2):删除索引index1到index2 - 1的字符
3)replace(int index1, int index2, String str):替换索引index1到index2 - 1的字符
4)indexOf(String):查找子串第一次出现的索引
5)lastIndexOf(String):查找子串最厚一次出现的索引
6)insert(int index, String str):在索引index处插入子串
7)length():返回字符串的长度
8)toString():转成String类型
四、StringBuilder类
-
基本介绍
1)一个可变的字符序列。此类提供一个与 StringBuffer兼容的API,但不保证同步(StringBuilder 不是线程安全)。该类被设计用作 StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer要快。
2)在StringBuilder上的主要操作是append 和insert方法,可重载这些方法,以接受任意类型的数据。 -
String、StringBuffer和StringBuilder类的比较
1)StringBuilder和StringBuffer非常类似,均代表可变的字符序列,而且方法也一样。
2)String:不可变字符序列,效率低,但是复用率高。
3)StringBuffer:可变字符序列、效率较高(增删)、线程安全
4)StringBuilder:可变字符序列、效率最高、线程不安全
5)如果要大量修改尽量不要使用String,因为它会导致大量副本存在内存中 -
String、StringBuffer和StringBuilder类的比较
1)如果字符串存在大量的修改操作,一般使用StringBuffer 或StringBuilder
2)如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder
3)如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer
4)如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等
五、Math类
常用方法:
- Math.abs():绝对值
- Math.pow(底数,指数):幂函数
- Math.ceil():向上取整
- Math.floor():向下取整
- Math.round():四舍五入
- Math.sqrt():平方根
- Math.random():返回 [ 0 , 1 ) 随机小数
返回一个[a,b]的随机数:a+Math.random()*(b-a+1)
返回一个(a,b)的随机数:a-1+Math.random()*(b-a) - Math.max():最大值
- Math.min():最小值
五、Arrays类
常用方法:
- Arrays.toString():返回数组的字符串形式
- Arrays.sort():递增排序
//自定义排序:递减
Arrays.sort(arr, new Comparator(){
@Override
public int compare(Object o1, Object o2){
Integer i1 = (Integer)o1;
Integer i2 = (Integer)o2;
return i2 - i1;
}
});
- Arrays.binarySearch(数组,元素):二分查找元素,存在返回下标,不存在返回负数(前提:数组有序)
- Arrays.copyOf(数组,元素个数):复制指定个数数组
- Arrays.fill(数组,元素):替换所有数组元素
- Arrays.equals(数组,数组):比较数组元素是否相等
- Arrays.asList():将数组元素转成LIst集合
六、System类
常用方法:
- System.exit(0):退出当前程序
- System.arraycopy(原数组,开始索引,拷贝数组,开始索引,需要拷贝数据个数):复制素组元素
- System.currentTimeMillens():返回当前时间距离1970-1-1的毫秒数
- System.gc():垃圾回收
七、BigInteger类和BigDecimal类
常用方法:
- add():加
- substract():减
- multiply():乘
- divide():除
//调用divide除不尽会抛出异常
//使用BigDecimal.ROUND_CEILING,指定精度,保留分子精度
BigDecimal a = new BigDecimal("1999.9992");
BigDecimal b = new BigDecimal("1.3");
System.out.println(a.divide(b, BigDecimal.ROUND_CEILING));
八、日期类
(一)Date类
1)Date:精确到毫秒,代表特定的瞬间
2)SimpleDateFormat:格式和解析日期的类,它允许进行格式化(日期->文本)、解析(文本->日期)和规范化
Date date = new Date();
System.out.println("当前日期:" + date);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss E");
String format = simpleDateFormat.format(date);
System.out.println("规范化日期:" + format);
Date date1 = new Date(9234567);
System.out.println("指定毫秒数(9234567)得到日期:" + date1);
String s = "2022-11-15 05:06:25 星期二";
System.out.println("字符串(2022-11-15 05:06:25 星期二)转成日期:" + simpleDateFormat.parse(s));
输出:
当前日期:Tue Nov 15 17:14:51 CST 2022
规范化日期:2022-11-15 05:14:51 星期二
指定毫秒数(9234567)得到日期:Thu Jan 01 10:33:54 CST 1970
字符串(2022-11-15 05:06:25 星期二)转成日期:Tue Nov 15 05:06:25 CST 2022
(二)Calender类
Calender是一个抽象类,并且构造器是私有的
Calendar c = Calendar.getInstance();
System.out.println(c);
System.out.println("年:" + c.get(Calendar.YEAR));
System.out.println("月:" + (c.get(Calendar.MARCH) + 1));
System.out.println("日:" + c.get(Calendar.DAY_OF_MONTH));
System.out.println("小时:" + c.get(Calendar.HOUR_OF_DAY));
System.out.println("分:" + c.get(Calendar.MINUTE));
System.out.println("秒:" + c.get(Calendar.SECOND));
(三)LocalDate、LocalTime和LocalDateTime类
- LocalDate(日期:年月日)、LocalTime(时间:时分秒)和LocalDateTime(日期+时间)类
- DateTimeFormatter格式日期类
- Instant时间戳
LocalDateTime ldt = new LocalDateTime.now();
System.out.println(ldt);
System.out.println(ldt.getYear());
System.out.println(ldt.getMonth());
System.out.println(ldt.getDayOfMonth());
System.out.println(ldt.getHour());
System.out.println(ldt.getMinute());
System.out.println(ldt.getSecond());
//plusDays:当前时间加上890天
System.out.println(ldt.plusDays(890));
//minusMinutes:当前时间减去32分钟
System.out.println(ldt.minusMinutes(32));
//DateTimeFormatter格式日期类
DateTimeFormatter dtfm = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(dtfm.format(ldt));
//Instant时间戳
//1.通过静态方法now()获取当前时间戳
Instant now = Instant.now();
//2.from方法Instant转成Date
Date date = Date.from(now);
//3.toInstant方法Date转成Instant
Instant instant = date.toInstant();
特别说明
本文章是个人整理的学习笔记,参考b站韩顺平老师的课程(【零基础 快速学Java】韩顺平 零基础30天学会Java)。老师讲的非常好,有兴趣的可以去看一下。