Bootstrap

Java基础(十五):常用类

一、八种包装类

(一)包装类

  1. Boolean
  2. Character
  3. Byte
  4. Short
  5. Integer
  6. Long
  7. Float
  8. 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);//构造器

(五)包装类常用方法

  1. Integer类
    最大值:Integer.MIN_VALUE
    最小值:Integer.MAX_VALUE
  2. 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类介绍

  1. String对象用于保存字符串,也就是一组字符序列
  2. 字符串常量对象是用双引号括起的字符序列。例如:“你好”、“12.97”."boy"等
  3. 字符串的字符使用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类的常用方法

  1. equals(String):比较字符串大小
  2. equalsIgnoreCase(String):忽略大小写比较内容是否相等
  3. length():获取字符串长度
  4. indexOf(Char/String):获取字符/字符串第一次出现的位置,找不到返回-1
  5. lastIndexOf(Char/String):获取字符/字符串最后一次出现的位置,找不到返回-1
  6. substring(int index):截取包括索引及之后所有字符
    substring(int index1, int index2):截取index1到index2 - 1的字符
  7. trim():去掉前后空格
  8. charAt(int index):获得index索引处的字符
  9. toUpperCase():转换成大写
  10. toLowerCase():转换成小写
  11. concat(String):字符串拼接
  12. replace(String str1,String str2):子字符串str1替换成str2
  13. split(String):字符串分隔
  14. compareTo(String):比较大小,大返回整数,小返回负数,相等返回0
  15. toCharArry():转成字符数组
  16. format():格式化字符串
    例:String.format(“姓名是%s 年龄是%d 成绩是%0.2f 性别是%c”, name, age, score, gender)

三、StringBuffer类

  1. StringBuffer代表可变字符序列,可以对字符内容增删,长度可变

  2. StringBuffer常用构造方法
    StringBuffer str1 = new StringBuffer();
    StringBuffer str2 = new StringBuffer(int capacity);
    StringBuffer str3 = new StringBuffer(String str);

  3. 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);
  1. 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. 基本介绍
    1)一个可变的字符序列。此类提供一个与 StringBuffer兼容的API,但不保证同步(StringBuilder 不是线程安全)。该类被设计用作 StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer要快。
    2)在StringBuilder上的主要操作是append 和insert方法,可重载这些方法,以接受任意类型的数据。

  2. String、StringBuffer和StringBuilder类的比较
    1)StringBuilder和StringBuffer非常类似,均代表可变的字符序列,而且方法也一样。
    2)String:不可变字符序列,效率低,但是复用率高。
    3)StringBuffer:可变字符序列、效率较高(增删)、线程安全
    4)StringBuilder:可变字符序列、效率最高、线程不安全
    5)如果要大量修改尽量不要使用String,因为它会导致大量副本存在内存中

  3. String、StringBuffer和StringBuilder类的比较
    1)如果字符串存在大量的修改操作,一般使用StringBuffer 或StringBuilder
    2)如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder
    3)如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer
    4)如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等

五、Math类

常用方法:

  1. Math.abs():绝对值
  2. Math.pow(底数,指数):幂函数
  3. Math.ceil():向上取整
  4. Math.floor():向下取整
  5. Math.round():四舍五入
  6. Math.sqrt():平方根
  7. Math.random():返回 [ 0 , 1 ) 随机小数
    返回一个[a,b]的随机数:a+Math.random()*(b-a+1)
    返回一个(a,b)的随机数:a-1+Math.random()*(b-a)
  8. Math.max():最大值
  9. Math.min():最小值

五、Arrays类

常用方法:

  1. Arrays.toString():返回数组的字符串形式
  2. 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;
	}
});
  1. Arrays.binarySearch(数组,元素):二分查找元素,存在返回下标,不存在返回负数(前提:数组有序)
  2. Arrays.copyOf(数组,元素个数):复制指定个数数组
  3. Arrays.fill(数组,元素):替换所有数组元素
  4. Arrays.equals(数组,数组):比较数组元素是否相等
  5. Arrays.asList():将数组元素转成LIst集合

六、System类

常用方法:

  1. System.exit(0):退出当前程序
  2. System.arraycopy(原数组,开始索引,拷贝数组,开始索引,需要拷贝数据个数):复制素组元素
  3. System.currentTimeMillens():返回当前时间距离1970-1-1的毫秒数
  4. System.gc():垃圾回收

七、BigInteger类和BigDecimal类

常用方法:

  1. add():加
  2. substract():减
  3. multiply():乘
  4. 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类

  1. LocalDate(日期:年月日)、LocalTime(时间:时分秒)和LocalDateTime(日期+时间)类
  2. DateTimeFormatter格式日期类
  3. 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)。老师讲的非常好,有兴趣的可以去看一下。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;