0%

【Java基础】常用类

Java常用类学习,自己整理的学习笔记


一、String类

1.1 String类的使用

  • (1)String:字符串,使用一对””引起来表示
  • (2)String声明为final的,不可以被继承
  • (3)String实现了Serializable接口:表示是字符串是支持序列化的
    • 实现了Comparable接口:表示String是可以比较大小的
  • (4)String内部定义了final char[] value用于存储字符串数据
    • 1、新版JDK定义时 final byte[] value数组
    • 2、当对现有字符串进行连接操作时,需要重写指定内存区域赋值,不能使用原有的value进行赋值
    • 3、当嗲用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值
  • (5)Sting代表不可变得字符(byte)序列;简称:不可变性
    • 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
  • (6)通过字面量的方法(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中
  • (7)字符串常量池中是不会存储相同内容的字符串的

1.2 String实例化方式

  • 方式一:通过字面量定义的方式
    • (1)常量与常量的拼接,定义仍然在常量池中
    • (2)只要出现变量,结果就在堆空间中
    • (3)拼接的结果调用intern()方法,返回值就在常量池中
  • 方式二:通过 new + 构造器的方式

1.3 String的常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int length():但会字符串的长度,return value length

char charAt(int index):返回某索引处的字符return value[index]

boolean isEmpty():判断是否是空字符串,return value.length == 0

String toLowerCase():使用默认语言环境,将String中的所有字符转换成小写

String toUpperCase():使用默认语言环境,将String中所有字符转换成大写

String trim():返回字符串的副本,忽略前导空白和尾部空白

boolean equals(Object obj):比较字符串的内容是否相同

boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写

String concat(String str):将指定字符串连接到此字符串的尾部,等同于使用"+"

int compareTo(String antherString):比较两个字符串的大小

String subString(int beginIndex):返回一个新的字符串,它是此字符串的从beginIndex开始截取,直到末尾

String subString(int beginIndex, int endIndex):返回一个新的字符串,它是此字符串的从beginIndex开始截取,到endIndex结束,左闭右开区间
1
2
3
4
5
boolean eadsWith(String suffix):测试次字符串是否指定的后续结束

boolean startsWith(String prefix):测试次字符串是否以指定的前缀开始

boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的字符串是否指定前缀开始
1
2
3
4
5
6
7
8
9
10
11
boolean contains(CharSequence s):当且仅当此字符串包含指定的char值序列时,返回true

int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引

int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现的索引,从指定的索引开始

int lastIndexOf(String str):返回指定字符串中最右边出现处的索引

int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索

#注意:indexOf和lastIndexOf方法如果未找到,返回值是-1
1
2
3
4
5
6
7
8
//替换
String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的

String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串宿友匹配字面值目标序列的子字符串

String replaceAll(String regex, String repacement):使用给定的replacement替换此字符串所有匹配给定的正则表达式的字符串

String replaceFirst(String regex, String replacement):使用给定的replacement替换此字符串匹配给定的正则表达式的第一个字符串
1
2
//匹配
boolean matches(String regex):告知此字符串是否匹配给定的正则表达式
1
2
3
4
//切片
String[] split(String regex):根据给定的正则表达式的匹配拆分此字符串

String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放在最后一个元素中

1.4 String与其他类型的转换

  • String 与 char[]之间的转换
    • String –> char[]:调用String的toCharArray()
    • char[] –> String: 调用String的构造器
  • String 与 byte[]之间的转换
    • String –> byte[]:调用String的getBytes() / getBytes(charsetName)
    • byte[] –> String:调用String的构造器 new String(byte[]) / new String(byte[], charsetName)

二、StringBuffer 和 StringBuilder

2.1 关于StringBuffer和Stringbuilder的使用

  • String 和 StringBuffer 和 StringBuilder之间的区别
    • String:不可变的字符序列;
    • StringBuffer:可变的字符序列;线程安全的,效率低;
    • StringBuilder:可变的字符序列;JDK5.0线程不安全,效率高;
  • 源码分析
1
2
3
4
5
String str = new String(); 
// char[] value = new char[0],创造长度为0的字符数组

String str1 =new String("abc");
// char[] value = new char[]{'a', 'b', 'c'}
1
2
3
4
5
6
7
8
9
10
11
StringBuffer sb1 = new StringBuffer();
// char[] value = new char[16],底层默认创建一个长度时16的字符数组

sb1.append('a');
// value[0] = 'a'

sb1.append('b');
// value[1] = 'b'

StringBuffer sb2 = new StringBuffer("abc");
// char[] value = new char["abc".lenghth +16]
  • 问题
    • 问题1: System.out.println(sb2.length);
      • 输出为3,虽然底层空间不止3,但是方法被重写,只显示非null字符的个数
    • 问题2:扩容
      • 如果需要添加的数据底层数组盛不下,那就需要扩容底层的数组。默认情况下,扩容为原来容量的2倍+2,同时将原有的数组中的元素复制到新的数组中。
      • 指导意义:开发中建议大家使用:StringBuffer(int capacity) 和 StringBuilder(int capacity)来避免扩容

2.1 StringBuffer 和 StringBuilder 的常用方法

StringBuffer 和 StringBuilder的方法名一模一样,只是同步与不同步区别

1
2
3
4
5
6
7
8
9
StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接

StringBuffer delete(int start, int end):删除指定位置的内容

StringBuffer replace(int statr, int end, String str):把[start, end)位置替换成str

StringBuffer insert(int offset, xxx):在指定的位置插入xxx

StringBuffer reverse():把当前字符序列逆转
1
2
3
4
5
6
7
8
9
public int indexOf(String str)

public String subString(int start, int end):返回一个从start开始到end索引结束的左闭右开区间的子字符串

public int length():字符串长度

public char charAt(int n):读取特定的字符

public void setCharAt(int n, char ch):将指定的位置的字符进行更改

2.3 总结

  • 增:append(xxxx)

  • 删:delete(int start, int end)

  • 查:charAt(int n)

  • 改:replace(int statr, int end, String str) / setCharAt(int n, char ch)

  • 插:insert(int offset, xxx)

  • 长度:length()

  • 遍历:for() + charAt() / toString()

  • 效率:StringBuilder > StringBuffer > String


三、Date类

3.1 Date类分类

  • java.util.Date
  • java.sql.Date
    • sql的Date类是继承于util的Date类

3.2 Date类的使用

  • 两个构造器
1
2
3
Date date = new Date(); :空参,默认获取本地时间

Date date = new Date(毫秒数); :毫秒数是从197011日开始计算的
  • 两个常用方法
1
2
3
4
toString():显示当前的年、月、日、时、分、秒
//格式为:Sun Sep 13 19:21:19 CST 2020

getTtime():获取当前Date对象的对象的毫秒数(时间戳)

3.3 两个Date类之间的转换

  • java.sql.Date –> java.util.Date
    • 多态性,可以使用强转的方式
  • java.util.Date –> java.sql.Date
    • 利用getTime()返回的毫秒数,作为参数传入构造器中
    • java.sql.Date date = new java.sql.Date(java.util.Date().getTime());

3.4 额外拓展

  • 返回毫秒数的方式也可以用System.CurrentTimeMillis()的方式进行返回

四、SimpleDateFormat类

4.1 SimpleDateFormat说明

  • simpleDateFormat对日期Date类的格式化和解析

4.2 SimpleDateFormate使用

  • (1)两个构造器
1
2
3
4
5
SimpleDateFormat sdf = new SimpleDateFormat(); :使用默认的格式
//格式为:2020/9/14 下午9:55

SimpleDateFormat sdf = new SimpleDateFormat("自定义格式"); :使用规定的格式
//例:"yyyy-MM-dd hh:mm:ss" --> 2020-09-14 10:13:52
  • (2)两个操作
    • 格式化:日期 –> 字符串(将Date对象转变成字符串)
      • String newDate = sdf.format(date);
    • 解析:字符串 –> 日期(将SimpleDateFormat对象的格式转变成Date对象)
      • Date date = sdf.parse("2020/9/14 下午9:55")

五、Calendar类

5.1 说明

  • Calendar类称为 日历类,是一个抽象类

5.2 Calendar使用

  • 1.实例化

    • 创建子类(GregorianCalendar)的对象,但名字过长,一般不用
    • 利用Calendar的静态方法getInstance()创建
      1
      2
      3
      4
      Calendar calendar = Calendar.getInstance();

      System.out.println(calendar.getClass());
      //返回:java.util.GregorianCalendar,即跟创建GregorianCalendar效果一样
  • 2.常用方法

    • (1)get()
      • int days = calendar.get(Calendar.DAY_OF_MONTH);//获取当月的天数,参数是Calendar内部定义的常量,数量过多,就不列举出来
    • (2)set()
      • calendar.set(Calendar.DAY_OF_MONTH, 22);//修改当月的天数为22,变相修改时间
    • (3)add()
      • calendar.add(Calendar.DAY_OF_MONTH, 3);//增加天数,增加3天(可以负数)
    • (4)getTime()
      • Date date = calendar.getTime();//Calendar类转变成Date类
    • (5)setTime()
      • calendar.setTime(new Date());//Date类转变成Calendar

六、JDK8新增的时间API

6.1 LocalDate、LocalTime、LocalDateTime

  • 说明
    • 三个API的方法都一样,就Date就只是获取日期,TIme只是获取时间。一般都用LocalDateTime。以下都以LocalDateTime举例
  • 方法
    • 实例化1:使用静态方法now()
      1
      2
      LocalDateTime localDateTime = LocalDateTime.now();
      //获取本地日期和时间
    • 实例化2:利用静态方法of()来按指定日期时间创建
      1
      LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 1, 13, 23, 23);
    • getXxx():获取想要的数据(例:获取本月中第几天)
      1
      int days = localDateTime1.getDayOfMonth();
    • withXxx():修改数据(例:修改本月中的第几天)
      1
      LocalDateTime localDateTime2 = localDateTime1.withDayOfMonth(22);
    • plusXxx():加法(例:月份+3)
      1
      LocalDateTime localDateTime3 = localDateTime1.plusMonths(3);
    • minusXxxx():减法(例:月份-2)
      1
      LocalDateTime localDateTime4 = localDateTime1.minusMonths(2);

6.2 Instant

  • 说明
    • 使用方法类似于java.util.Date
  • 方法
    • 实例化1:使用静态方法now()
      1
      2
      Instant instant = Instant.now();
      //注意:获取的时间是本初子午线的时间,有时间差
    • 实例化2:使用静态方法ofEpochMilli(),参数为毫秒数(时间戳)
      1
      Instant instant1 = Instant.ofEpochMilli(毫秒数);
    • 获取毫秒数
      1
      long l = instant.toEpochMilli();
    • 添加时间偏移量
      1
      2
      OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
      //将时间+8小时,变成中国时间

6.3 DateTimeFormatter

  • 说明
    • 使用方法类似于SimpleDateFormat类
  • 方法
    • 实例化1:使用预定义格式,如:ISO_LOCAL_DATE_TIME
      1
      DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;
    • 实例化2:ofLocalizedDateTime();
    • 参数:FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT
      1
      DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
    • 实例化3(推荐):自定义格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
      1
      DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
    • 格式化:format()  日期 —> 字符串
      1
      String str1 = formatter.format(LocalDateTime.now());
    • 解析:parse()  字符串 —> 日期
      1
      TemporalAccessor parse = formatter.parse(对应的格式);

七、Java比较器

7.1 分类

  • Java比较器通过两个接口来实现,Comparable 和 Comparator。Comparable称为自然排序,而Comparator被称为定制排序

7.2 Comparable接口的使用

  • 使用:
    • 类实现Comparable接口,重写compareTo方法,利用Arrays.sort(数组)的方法,会按照重写的compareTo的方法,对数组进行排序。
  • 重写compareTo(obj)规则;
    • 如果当前对象this大于形参对象obj,则返回正整数
    • 如果当前对象this小于形参对象obj,则返回负整数
    • 如果当前对象this等于形参对象obj,则返回0

7.3 Comparator接口的使用

  • 背景:
    • 当元素的类型没有实现java.lang.Comparable接口而有不方便修改代码
    • 或实现了java.langComparable接口的排序规则不适合当前的操作
    • 那么可以考虑使用Comparator的对象来排序
  • 使用方法:
    • 创建Comparator接口实现类,该类中对compare方法进行重写。然后使用Arrays.sort(数组,Comparator实现类对象),然后会按照重写的compare的方法对该数组进行排序。
  • 重写compare(Object o1, Object o2)方法规则:
    • 如果方法返回正整数,则表示o1比o2大
    • 如果返回负整数,表示o1比o2小
    • 如果返回0,表示相等

7.4 Comparable接口 和 Comparator的使用的比较

  • Comparble 接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小
  • Comparator接口属于临时性的比较

八、其他常用类

8.1 System类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1.System.currentTimeMillis():获取毫秒数

2.System.exit(int status):退出
0:正常退出
0:异常退出

3.System.gc():请求系统垃圾回收

4.System.getProperty(String key):获取系统中属性名为key属性对应的值
java.version -- Java运行时环境版本
java.home -- Java安装目录
os.name -- 操作系统名字
os.version -- 操作系统的版本
user.name -- 用户的账户名称
user.home -- 用户的主目录
user.dir -- 用户当前工作目录

8.2 Math类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1.abs:绝对值

2.acos, asin, atan, cos, sin, tan :三角函数

3.sqrt:平方根

4.pow(double a, double b):a的b次幂

5.log :自然对数

6.exp :e为底指数

7.max(double a, double b):求最大

8.min(double a, double b):求最小

9.random() :返回0.01.0的随机数

10.long round(double a)double型数据a转变成long

11.toDegrees(double angrad) :弧度-->角度

12.toRadians(double angdeg) :角度-->弧度

8.3 BigInteger类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//BigInteger可以表示不可变的任意精度的整数
1.public BigInteger abs():返回次BigInteger的绝对值的BigInteger

2.BigInteger add(BigInteger val):返回其值为(this + val)的BigInteger

3.BigInteger subtract(BigInteger val):返回其值为(this -val)的BigInteger

4.BigInteger multiply(BigInteger val):返回其值为(this * val)的BigInteger

5.BigInteger divide(BigInteger val):返回其值为(this / val)的BigInteger,整数相除只保留整数部分

6.BigInteger remainder(BigInteger val):返回其值为(this % val)的BigInteger

7.BigInteger[] divideAndRemainder(BigInteger val):返回包含(this / val)后跟(this % val)的两个BigInteger的数组

8.BigInteger pow(int exponent):返回其值为(this^exponent)的BigInteger

8.4 BigDecimal

1
2
3
4
5
6
7
8
//BigDecimal要求数字的精度比Float, Double要高
1.public BigDecimal add(BigDecimal augend)

2.public BigDecimal subtract(BigDecimal subtrahend)

3.public BigDecimal multiply(BigDeciaml multiplicand)

4.public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)