字符串相关类

String类

概述

代表字符串,使用一堆””引起来表示

  1. 1. String声明为final的,不可被继承
  2. 1. String实现了Serializable接口:表示字符串是支持序列化的
  3. 1. String实现了Comparable接口:表示String可比较大小
  4. 1. String内部定义了final char[] value用于存储字符串数据
  5. 1. 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中
  6. 1. 字符串常量池中是不会存储相同内容的字符串的

String代表不可变的字符序列

简称:不可变性

当对字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value进行赋值
当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
当调用String的repalce() 方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值

不同实例化方式以及对比
方式一:通过字面量定义的方式
方式二:通过new + 构造器的方式

字面量定义的方式会使数据声明在方法去中的字符串常量池中 new + 构造器的方式会使数据在堆空间中开辟空间存放new的对象,并将其中的char[]的数据存在方法区中的字符串常量池中,将常量池对应的地址值赋给字符串new的对象

不同拼接操作的对比
字面量与字面量的拼接结果在常量池。且常量池中不会存在相同内容的常量
只要其中有一个是变量,结果就是在堆中新开辟了一个对象
如果拼接的结果调用 intern() 方法,返回值就在常量池中

  1. String s1 = "hello";
  2. String s2 = "world";
  3. String s3 = "hello" + "world";
  4. String s4 = s1 + "world";
  5. String s5 = s1 + s2;
  6. String s6 = (s1 + s2).intern();
  7. System.out.println(s3 == s4);//false
  8. System.out.println(s3 == s5);//false
  9. System.out.println(s4 == s5);//false
  10. System.out.println(s3 == s6);//true

Stirng 与 char[] 之间的转换
String —> char[]:调用String的toCharArray()
char[] —> String:调用String的构造器
Stirng 与 byte[] 之间的转换
String —> byte[]:调用String的getBytes()
byte[] —> String:调用String的构造器
String 与 StringBuffer、StringBuilder之间的转换
String —> StringBuffer、StringBuilder:调用StringBuffer、StringBuilder构造器
StringBuffer、StringBuilder —> String:①调用String构造器②StringBuffer、StringBuilder的toString()
JVM中字符串常量池存放位置说明
jdk6.0:字符串常量池存储在方法区(永久区)
jdk7.0:字符串常量池存储在堆空间
jdk8.0:字符串常量池存储在方法去(元空间)
常见算法题目的考查
模拟一个trim方法,去除字符串两端的空格
对字符串中字符进行自然顺序排序

StringBuffer类 && StringBuilder类

String、StirngBuffer、StringBuilder的异同
String:不可变的字符序列(char[])
StringBuffer:可变的字符序列(char[]);线程安全的(方法都是synchronized方法),效率低
StringBuilder:可变的字符序列(char[]);线程不安全的,效率高;jdk5.0新增

StringBuffer、StringBuilder的内存解析

  1. String str = new String(); //char[] value = new char[0];
  2. String str1 = new String("abc"); //char[] value = new char[]{'a','b','c'};
  3. StringBuffer sb1 = new StringBuffer();//char[] value = new char[16];底层创建了一个长度是16的char[]数组
  4. System.out.println(sb1.length());//0
  5. sb1.append('a');//value[0] = 'a';
  6. sb1.append('b');//value[1] = 'b';
  7. StringBuffer sb2 = new StringBuffer("abc");//char[] value = new char['abc'.lenght() + 16];

问题1:System.out.println(sb2.length());//3
问题2:扩容问题:如果要添加的数据数组盛不下,需要扩容数组
默认情况下,扩容为原来的容量的2倍 + 2,同时将原有数组中的元素复制到新的数组中

开发中建议使用StringBuffer(int capacity) 或 StringBuilder(int capacity) 的构造器,避免扩容效率下降

对比String、StirngBuffer、StringBuilder效率问题
结论:从高到低:StringBuilder > StringBuffer > String
StringBufferBuilderTest.java

日期时间API

JDK8之前的日期时间API

System类中的currentTimeMillis()
返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差;称为时间戳
Date类
Date类有两个,彼此之间存在继承关系

java.util.Date类 |—-java.sql.Date类

java.sql.Date类对应数据库中的日期类型的变量

两个构造器的使用
Date():创建一个对应当前时间的Date对象
Date(long date):创建指定毫秒数的Date对象
两个方法的使用
toString():显式当前的年、月、日、时、分、秒
getTime():获取当前Date对象对应的毫秒数(时间戳)
java.sql.date实例化
java.sql.Date date2 = new java.sql.Date(352353252345L);
将java.util.Date对象转换为java.sql.Date对象
Date date1 = new Date();
java.sql.Date date3 = new java.sql.Date(date1.getTime());
SimpleDateFormat类

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

两个操作
格式化:日期 —-> 字符串

  1. SimpleDateFormat sdf = new SimpleDateFormat();
  2. Date date = new Date();
  3. //格式化
  4. String format = sdf.format(date);
  5. System.out.println(format);

解析:格式化的逆过程:字符串 —-> 日期

  1. SimpleDateFormat sdf = new SimpleDateFormat();
  2. Date date = new Date();
  3. //解析
  4. String str = "22-03-14 下午3:46";
  5. Date date4 = sdf.parse(str);
  6. System.out.println(date4);

要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现)

实例化

  1. //1.使用默认构造器
  2. SimpleDateFormat sdf = new SimpleDateFormat();
  3. //2.使用带参构造器进行格式化
  4. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

Calendar日历类
实例化
方式一:创建其子类(GregorianCalendar)的对象
方式二:调用其静态方法getInstance()

  1. Calendar instance = Calendar.getInstance();

常用方法

  1. Calendar calendar = Calendar.getInstance();
  2. //get()
  3. int days = calendar.get(Calendar.DAY_OF_MONTH);
  4. System.out.println(days);//今天是这个月的第14天
  5. System.out.println(calendar.get(Calendar.DAY_OF_YEAR));//今天是这一年的第73天
  6. //set()
  7. //calendar可变性
  8. calendar.set(Calendar.DAY_OF_MONTH, 22);
  9. days = calendar.get(Calendar.DAY_OF_MONTH);
  10. System.out.println(days);//22
  11. //add()
  12. calendar.add(Calendar.DAY_OF_MONTH, -3);
  13. days = calendar.get(Calendar.DAY_OF_MONTH);
  14. System.out.println(days);
  15. //getTime():日历类 ---> Date
  16. Date date = calendar.getTime();
  17. System.out.println(date);
  18. //setTime():Date ---> 日历类
  19. Date date1 = new Date();
  20. calendar.setTime(date1);
  21. System.out.println(calendar.get(Calendar.DAY_OF_MONTH));

JDK8中的新的日期时间API

LocalDate、LocalTime、LocalDateTime的使用
说明
①分别使用ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的本地日期或事件,并不包含当前的时间信息,也不包含与时区相关的信息
②LocalDateTime相较于LocalDate、LocalTime,使用频率更高
③类似于Canlendar
常用方法
image.png
Instance(瞬时点)
说明
①时间线上的一个瞬时点。概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC开始的秒数)
②类似于Date类
常用方法
image.png
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数
DateTimeFormatter
说明
①格式化或解析时间、日期
②类似于SimpleDateFormat
实例化的方式
预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
常用方法
image.png

  1. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
  2. String str = formatter.format(LocalDateTime.now());
  3. System.out.println(str);
  4. TemporalAccessor accessor = formatter.parse("2019-02-18 03:52:09");
  5. System.out.println(accessor);

Java比较器

说明

Java中的对象,正常情况下,只能进行比较:== 或 !=,不能使用 > 或 < 的。但是在开发场景中,我们需要对多个对象进行排序,言外之意,就要比较对象的大小

实现

使用两个接口中的任何一个:Comparable(自然排序) 或 Comparator(定制排序)

Comparable(自然排序)

像String、包装类等实现了Comparable接口,重写了compareTo()方法,给出了比较两个对象大小的方式
像String、包装类重写compareTo()方法以后,进行了从小到大的排列
重写compareTo(obj)的规则:

  1. - 如果当前对象this大于形参对象obj,则返回正整数
  2. - 如果当前对象this小于形参对象obj,则返回负整数
  3. - 如果当前对象this等于形参对象obj,则返回零

对于自定义类来说,如果需要排序,我们可以让自定义类实现comparable接口。重写compareTo(obj)在compareTo(obj)方法中指明如何排序

Comparator(定制排序)

背景:当元素的类型没有实现comparable接口而又不方便修改代码或者实现了comparable接口的排序规则又不适合当前的操作, 那么可以考虑使用comparator的对象来排序
重写compare(Object o1,Object o2)方法,比较o1和o2的大小

  1. - 返回正整数,则表示o1 > o2
  2. - 返回负整数,表示o1 < o2;
  3. - 返回0,表示相等

两种方式对比

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

System类

说明

System类代表系统,系统级的很多属性和控制方法都放置在该类的内部,该类位于java.lang包
由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实例化该类,其内部的成员变量和成员方法都是static的,所以也可以很方便的进行调用
成员变量
System类内部包含in、out、err三个成员变量,分别代表标准输入流(键盘输入),标准输出流(显示器),标准错误输出流(显示器)
成员方法
native long currentTimeMills();
void exit(int status);
void gc();
String getProperty(String key);

Math类

说明
java.lang.Math提供了一系列静态方法用于科学计算,其方法的参数和返回值类型一般为double型
abs 绝对值
acos,asin,atan,cos,sin,tan 三角函数
sqrt 平方根
pow(double a,double b) a的b次幂
log 自然对数
exp e为底指数
max(double a,double b)
min(double a,double b)
random() 返回0.0到1.0的随机数
long round(double a) double型数据a转换为long型(四舍五入)
toDegrees(double angrad) 弧度 ——>角度
toRadians(double angdeg) 角度 ——>弧度

BigInteger 与 BigDecimal

BigInteger

Integer类作为int的包装类,能存储的最大整型数为2^31 - 1,Long类也是有限的,最大为2^63 - 1.如果要表示再大的证书,不管是基本数据类型还是他们的包装类都无能唯一,更不用说进行运算了
java.math包的BigInteger可以表示不可变的任意精度的整数,BigInteger提供所有Java的基本整数操作符的对应物,并提供java.lang.Math的所有相关方法。另外,BigInteger还提供以下运算:模算术、GCD计算、质数测试、素数生成、位操作以及一些其他操作
构造器
BigInteger(String val):根据字符串构建BigInteger对象

BigDecimal

一般的float类和Double类可以用来做科学计算或工程计算,但在商业计算中,要求数字精度比较高,故用到java.math.BigDecimal类
构造器
public BigDecimal(double val)
public BigDecimal(String val)