java基础---常用类

时间:2023-03-09 15:46:33
java基础---常用类

一、字符串类String

String:字符串,使用一对""引起来表示,字符串常量池在方法区中

public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
//
  • String声明为final的,不可被继承,代表不可变的字符序列
  • String实现了Serializable接口:表示字符串是支持序列化的。
  • String内部定义了final char[] value,用于存储字符串数据
  • 不可变的体现:
    • 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
    • 当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
    • 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
    • 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中
    • 常量与常量的拼接结果在常量池。 且常量池中不会存在相同内容的常量。
    • 只要其中有一个是变量, 结果就在堆中
    • 如果拼接的结果调用intern()方法, 返回值就在常量池中    
  @Test
public void test3(){
String s1 = "javaEE";
String s2 = "hadoop"; String s3 = "javaEEhadoop";
String s4 = "javaEE" + "hadoop";
String s5 = s1 + "hadoop";
String s6 = "javaEE" + s2;
String s7 = s1 + s2; System.out.println(s3 == s4);//true
System.out.println(s3 == s5);//false
System.out.println(s3 == s6);//false
System.out.println(s3 == s7);//false
System.out.println(s5 == s6);//false
System.out.println(s5 == s7);//false
System.out.println(s6 == s7);//false String s8 = s6.intern();//返回值得到的s8使用的常量值中已经存在的“javaEEhadoop”
System.out.println(s3 == s8);//true }
  • 常用的方法
方法 含义 返回值
int length()  返回字符串的长度 value.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 contains(CharSequence s) 当且仅当此字符串包含指定的 char 值序列时,返回 true,比较的字符串  
boolean equals(Object obj) 比较字符串的内容是否相同 重写了equals方法
boolean equalsIgnoreCase(String anotherString) 与equals方法类似, 忽略大小写 本身的字符串不改变
String concat(String str) 将指定字符串连接到此字符串的结尾。 等价于用“+” 本身的字符串不改变
 int compareTo(String anotherString) 比较两个字符串的大小  
String substring(int beginIndex) 返回一个新的字符串, 它是此字符串的从beginIndex开始截取到最后的一个子字符串。  
String substring(int beginIndex, int endIndex) 返回一个新字符串, 它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。  
boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结束  
boolean startsWith(String prefix, int toffset) 测试此字符串从指定索引开始的子字符串是否以指定前缀开始   
boolean startsWith(String prefix)
 测试此字符串是否以指定的前缀开始  
 int indexOf(String str) 返回指定子字符串在此字符串中第一次出现处的索引  
 int indexOf(String str, int fromIndex) 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始  
int lastIndexOf(String str)  返回指定子字符串在此字符串中最右边出现处的索引  
 int lastIndexOf(String str, int fromIndex) 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索 indexOf和lastIndexOf方法如果未找到都是返回-1 
String replace(char oldChar, char newChar) 返回一个新的字符串, 它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。  
String replace(CharSequence target, CharSequence replacement) 使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。  
String replaceAll(String regex, String replacement)  使用给定的replacement 替换此字符串所有匹配给定的正则表达式的子字符串。  
String replaceFirst(String regex, String replacement)  使用给定的replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。   
boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式。  
String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。  
String[] split(String regex, int limit) 根据匹配给定的正则表达式来拆分此字符串, 最多不超过limit个, 如果超过了, 剩下的全部都放到最后一个元素中。  
char[] toCharArray()
将字符串中的全部字符存放在一个字符数组中的方法。

 
byte[] getBytes(String charsetName) 
使用平台的默认字符集将此 String 编码为byte 序列,并将结果存储到一个新的 byte 数组中

 
String(byte[])
通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String

 
String(byte[], int offset, int length) 
用指定的字节数组的一部分,即从数组起始位置offset开始取length个字节构造一个字符串对象

 
byte[] getBytes(String charsetName) 
使用指定的字符集将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组

 
String(char[]) 
字符数组中的全部字符创建字符串对象。
 
String(char[], int offset, int length)

字符数组中的部分字符创建字符串对象。
 
 @Test
public void test3() throws UnsupportedEncodingException {
String str1 = "abc123中国";
byte[] bytes = str1.getBytes();//使用默认的字符集,进行编码,一个中文字符对应3个字符
System.out.println(Arrays.toString(bytes)); byte[] gbks = str1.getBytes("gbk");//使用gbk字符集进行编码。一个中文字符对应2个字符
System.out.println(Arrays.toString(gbks)); System.out.println("******************"); String str2 = new String(bytes);//使用默认的字符集,进行解码。
System.out.println(str2); String str3 = new String(gbks);
System.out.println(str3);//出现乱码。原因:编码集和解码集不一致! String str4 = new String(gbks, "gbk");
System.out.println(str4);//没有出现乱码。原因:编码集和解码集一致! }

二、StringBuilder 和StringBuffer 类

  • String:不可变的字符序列;底层使用final char[]存储
  • StringBuffer:可变的字符序列;线程安全的 sychronized,效率低;底层使用char[]存储
  • StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储
  • 常用方法:
    • StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
    • StringBuffer delete(int start,int end):删除指定位置的内容
    • StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str
    • StringBuffer insert(int offset, xxx):在指定位置插入xxx
    • StringBuffer reverse() :把当前字符序列逆转
    • 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)
  • 总结:
    • 增:append(xxx)
    • 删:delete(int start,int end)
    • 改:setCharAt(int n ,char ch) / replace(int start, int end, String str)
    • 查:charAt(int n )
    • 插:insert(int offset, xxx)
    • 长度:length();
    • 遍历:for() + charAt() / toString()
  • 扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。默认情况下,扩容为原来容量的2倍 + 2,同时将原有数组中的元素复制到新的数组中

@HotSpotIntrinsicCandidate
public StringBuffer() {
super(16); //默认初始容量为16
} @HotSpotIntrinsicCandidate
public StringBuilder() {
super(16);
}
  • 面试题
String str = null;
StringBuffer sb = new StringBuffer();
sb.append(str);
System.out.println(sb.length());//4
System.out.println(sb);//”null”
StringBuffer sb1 = new StringBuffer(str); //空指针异常
System.out.println(sb1);// private AbstractStringBuilder appendNull() {
ensureCapacityInternal(count + 4);
int count = this.count;
byte[] val = this.value;
if (isLatin1()) {
val[count++] = 'n';
val[count++] = 'u';
val[count++] = 'l';
val[count++] = 'l';
} else {
count = StringUTF16.putCharsAt(val, count, 'n', 'u', 'l', 'l');
}
this.count = count;
return this;
}

三、日期和时间类(jdk8之前)

  • java.lang.System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
  • java.util.Date类表示特定的瞬间,精确到毫秒
    • 构造器:
      • Date(): 使用无参构造器创建的对象可以获取本地当前时间
      • Date(long date)
    • 常用方法
      • getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
      • toString():把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue,Wed, Thu, Fri, Sat), zzz是时间标准。
      • 其它很多方法都过时了
  • java.sql.Date对应着数据库中的日期类型的变量

    • 构造器:

      • Date(): 使用无参构造器创建的对象可以获取本地当前时间
      • Date(long date)
    • 如何将java.util.Date对象转换为java.sql.Date对象: 父类强转子类有风险
      // 方式一:
      Date date4 = new java.sql.Date(2343243242323L);
      java.sql.Date date5 = (java.sql.Date) date4;
      //方式二:
      Date date6 = new Date();
      java.sql.Date date7 = new java.sql.Date(date6.getTime());
      //此种方式编译通过,运行发生异常
      Date date1 = newDate(2343243242323L);
      java.sql.Date date2 = (java.sql.Date) date1;
  • .java.text.SimpleDateFormat类 :一个不与语言环境有关的方式来格式化和解析日期的具体类。
    • 格式化:
      • SimpleDateFormat() :默认的模式和语言环境创建对象 "19-12-18 上午11:43"
      • public SimpleDateFormat(String pattern): 该构造方法可以用参数pattern指定的格式创建一个对象,该对象调用:
      • public String format(Date date): 方法格式化时间对象date
    • 解析:
      • 解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现)

      • public Date parse(String source): 从给定字符串的开始解析文本,以生成一个日期    

    @Test
public void testSimpleDateFormat() throws ParseException {
//实例化SimpleDateFormat:使用默认的构造器
SimpleDateFormat sdf = new SimpleDateFormat(); //格式化:日期 --->字符串
Date date = new Date();
System.out.println(date); String format = sdf.format(date);
System.out.println(format); //解析:格式化的逆过程,字符串 ---> 日期
String str = "19-12-18 上午11:43";
Date date1 = sdf.parse(str);
System.out.println(date1); //*************按照指定的方式格式化和解析:调用带参的构造器*****************
// SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa");
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//格式化
String format1 = sdf1.format(date);
System.out.println(format1);//2019-02-18 11:48:27
//解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),
//否则,抛异常
Date date2 = sdf1.parse("2020-02-18 11:48:27");
System.out.println(date2);
}
  • java.util.Calendar(日历)类:Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。
  • 获取Calendar实例的方法
    • 使用Calendar.getInstance()方法
    • 调用它的子类GregorianCalendar的构造器。
  • 一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想要的时间信息。比如YEAR、 MONTH、 DAY_OF_WEEK、 HOUR_OF_DAY 、
    MINUTE、 SECOND
    • public void set(int field,int value)  设置
    • public void add(int field,int amount)  加
    • public final Date getTime() 获取对应Date的毫秒数
    • public final void setTime(Date date) 将date转成calender
  • 获取月份时: 一月是0,二月是1,以此类推, 12月是11
  • 获取星期时: 周日是1,周二是2 , 。 。。。周六是7
        @Test
    public void testCalendar(){
    //1.实例化
    //方式一:创建其子类(GregorianCalendar)的对象
    //方式二:调用其静态方法getInstance()
    Calendar calendar = Calendar.getInstance();
    // System.out.println(calendar.getClass()); //2.常用方法
    //get()
    int days = calendar.get(Calendar.DAY_OF_MONTH);
    System.out.println(days);
    System.out.println(calendar.get(Calendar.DAY_OF_YEAR)); //set()
    //calendar可变性
    calendar.set(Calendar.DAY_OF_MONTH,22);
    days = calendar.get(Calendar.DAY_OF_MONTH);
    System.out.println(days); //add()
    calendar.add(Calendar.DAY_OF_MONTH,-3);
    days = calendar.get(Calendar.DAY_OF_MONTH);
    System.out.println(days); //getTime():日历类---> Date
    Date date = calendar.getTime();
    System.out.println(date); //setTime():Date ---> 日历类
    Date date1 = new Date();
    calendar.setTime(date1);
    days = calendar.get(Calendar.DAY_OF_MONTH);
    System.out.println(days); }
  • 缺点

    • 可变性:像日期和时间这样的类应该是不可变的。
    • 偏移性: Date中的年份是从1900开始的,而月份都从0开始。
    • 格式化:格式化只对Date有用, Calendar则不行。
    • 它们也不是线程安全的;不能处理闰秒等

四、 日期和时间(jdk8)

1.LocalDate、LocalTime、LocalDateTime

  • now():获取当前的日期、时间、日期+时间
  • of():设置指定的年、月、日、时、分、秒。没有偏移量
  • getXxx():获取相关的属性
  • withXxx():设置相关的属性,会返回一个新的日期对象,原来的日期不会改变

      java基础---常用类

2. Instant

  • Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。 在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在Java中,也是从1970年开始,但以毫秒为单位。
  • java.time包通过值类型Instant提供机器视图,不提供处理人类意义上的时间单位。 Instant表示时间线上的一点,表示自1970年1月1日0时0分0秒(UTC)开始的毫秒数。
@Test
public void test2(){
//now():获取本初子午线对应的标准时间
Instant instant = Instant.now();
System.out.println(instant);//2019-02-18T07:29:41.719Z //添加时间的偏移量
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8)); //添加时区之间的时间差
System.out.println(offsetDateTime);//2019-02-18T15:32:50.611+08:00 //toEpochMilli():获取自1970年1月1日0时0分0秒(UTC)开始的毫秒数 ---> Date类的getTime()
long milli = instant.toEpochMilli();
System.out.println(milli); //ofEpochMilli():通过给定的毫秒数,获取Instant实例 -->Date(long millis)
Instant instant1 = Instant.ofEpochMilli(1550475314878L);
System.out.println(instant1);
}

3. DateTimeFormatter

  • 用于格式化或解析日期、时间
    • 预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
    • 本地化相关的格式。如: ofLocalizedDateTime(FormatStyle.LONG)
    • 自定义的格式。如: ofPattern(“yyyy-MM-dd hh:mm:ss”)
方法 含义
ofPattern(String pattern) 静态方法,返回一个指定字符串格式的DateTimeFormatter
format(TemporalAccessor t) 格式化一个日期、 时间, 返回字符串
parse(CharSequence text) 将指定格式的字符序列解析为一个日期、 时间
public void test3(){
// 方式一:预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
//格式化:日期-->字符串
LocalDateTime localDateTime = LocalDateTime.now();
String str1 = formatter.format(localDateTime);
System.out.println(localDateTime);
System.out.println(str1);//2019-02-18T15:42:18.797 //解析:字符串 -->日期
TemporalAccessor parse = formatter.parse("2019-02-18T15:42:18.797");
System.out.println(parse); // 方式二:
// 本地化相关的格式。如:ofLocalizedDateTime()
// FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT :适用于LocalDateTime
DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
//格式化
String str2 = formatter1.format(localDateTime);
System.out.println(str2);//2019年2月18日 下午03时47分16秒 // 本地化相关的格式。如:ofLocalizedDate()
// FormatStyle.FULL / FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT : 适用于LocalDate
DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
//格式化
String str3 = formatter2.format(LocalDate.now());
System.out.println(str3);//2019-2-18 // 重点: 方式三:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//格式化
String str4 = formatter3.format(LocalDateTime.now());
System.out.println(str4);//2019-02-18 03:52:09 //解析
TemporalAccessor accessor = formatter3.parse("2019-02-18 03:52:09");
System.out.println(accessor); }

五、比较器

Java实现对象排序的方式有两种:自然排序: java.lang.Comparable 和 定制排序: java.util.Comparator

  • java.lang.Comparable
    • Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序。默认从小到大
    • 实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过 compareTo(Object obj) 方法的返回值来比较大小。
    • 如果当前对象this大于形参对象obj,则返回正整数,如果当前对象this小于形参对象obj, 则返回负整数,如果当前对象this等于形参对象obj, 则返回零。
    • 实现Comparable接口的对象列表(和数组)可以通过 Collections.sort 或Arrays.sort进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
    • 对于类 C 的每一个 e1 和 e2 来说,当且仅当 e1.compareTo(e2) == 0 与1.equals(e2) 具有相同的 boolean 值时,类 C 的自然排序才叫做与 equals一致。 建议(虽然不是必需的) 最好使自然排序与 equals 一致。
  • Comparable 的典型实现: (默认都是从小到大排列的)
    • String:按照字符串中字符的Unicode值进行比较
    • Character:按照字符的Unicode值来进行比较
    • 数值类型对应的包装类以及BigInteger、 BigDecimal:按照它们对应的数值大小进行比较
    • Boolean: true 对应的包装类实例大于 false 对应的包装类实例
    • Date、 Time等:后面的日期时间比前面的日期时间大
  • java.util.Comparator
    • 当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序, 强行对多个对象进行整体排序的比较。
    • 重写compare(Object o1,Object o2)方法,比较o1和o2的大小:
      • 如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2。
      • 可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。
      • 还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。
  • Comparable接口与Comparator的使用的对比:
    • Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小
    • Comparator接口属于临时性的比较。

六、System 类

系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包

  • 构造器是私有的,无法实例化该类。其内部的成员变量和成员方法都是static的
  • 成员变量
    • System类内部包含in、 out和err三个成员变量,分别代表标准输入流(键盘输入),标准输出流(显示器)和标准错误输出流(显示器)。
  • 成员方法
    • native long currentTimeMillis():该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数
    • void exit(int status):该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表异常退出。 使用该方法可以在图形界面编程中实现程序的退出功能等
    • void gc():该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况。
    • String getProperty(String key):该方法的作用是获得系统中属性名为key的属性对应的值。系统中常见的属性名以及属性的作用如下表所示:
      java基础---常用类

七、Math类

  • java.lang.Math提供了一系列静态方法用于科学计算。其方法的参数和返回值类型一般为double型
  • 常用函数
    函数  含义
    abs  绝对值
    acos,asin,atan,cos,sin,tan 三角函数
    sqrt  平方根
    pow(double a,doble 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)  角度—>弧度

八、BigDecimal 和 BigInteger类

  • java.math包的BigInteger可以表示不可变的任意精度的整数。 BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。
  • 商业计算中,要求数字精度比较高,用java.math.BigDecimal类, 它支持不可变的、任意精度的有符号十进制定点数。
  • BigInteger 还提供以下运算:模算术、 GCD 计算、质数测试、素数生成、位操作以及一些其他操作。
  • 构造器
    • public BigInteger(String val)  --- 根据字符串构建BigInteger对象
    • public BigDecimal(double val)
    • public BigDecimal(String val)
  • 常用方法
方法 含义
BigInteger
public BigInteger abs() 返回此 BigInteger 的绝对值的 BigInteger。
BigInteger add(BigInteger val)  返回其值为 (this + val) 的 BigInteger
BigInteger subtract(BigInteger val) 返回其值为 (this - val) 的 BigInteger
BigInteger multiply(BigInteger val)  返回其值为 (this * val) 的 BigInteger
BigInteger divide(BigInteger val) 返回其值为 (this / val) 的 BigInteger。整数相除只保留整数部分。
BigInteger remainder(BigInteger val)  返回其值为 (this % val) 的 BigInteger。
BigInteger[] divideAndRemainder(BigInteger val) 返回包含 (this / val) 后跟(this % val) 的两个 BigInteger 的数组。
BigInteger pow(int exponent)  返回其值为 (thisexponent) 的 BigInteger。
BigDecimal
public BigDecimal add(BigDecimal augend) +
public BigDecimal subtract(BigDecimal subtrahend) -
 public BigDecimal multiply(BigDecimal multiplicand) *
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)  /