6.Java SE 常用类

String 类

  1. 常量和常量的拼接结果出现在常量池,且常量池中不会存在相同内容的常量
  2. 只要有一个是变量,结果就在堆中。
  3. 如果拼接的结果调用 intern() 方法,返回值就在常量池中。
String s1 = "HelloWorld";
String s2 = "Hello";
String s3 = s2 + "World";
String s4 = "World";
System.out.println(s1 == s3);//false
System.out.println(s1 == s2 + s4);//false,因为这两个都有变量

final String s5 = "Hello";//常量
String s6 = s5 + "World";
System.out.println(s1 == s5);//true

System.out.println(s1==s3.intern());//true
  1. String 类实现了Serializable接口:表示字符串是支持序列化的;实现了Comparable接口:表示String可以比较大小。

  2. String内部定义了final char[] value用于存储字符串数据。

  3. String:代表不可变的字符序列。简称:不可变性。体现如下:(简而言之,就是得拿一个String 去接收返回值)
    ① 当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
    ② 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。

  4. 相关方法

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 anotherString):比较两个字符串的大小
String substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。

boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
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

替换:
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个,如果超过了,剩下的全部都放到最后一个元素中。

  1. 涉及到 String 类与其他结构之间的转换
    ① String 和 byte[] 之间的转换。
    (一)编码:String --> byte[]:调用String的getBytes();byte[] bytes = "abs123你大爷".getBytes(字符集可省略);
    (二)解码:byte[] --> String:调用String的构造器;String str = new String(bytes,字符集可省略);
    (三)解码时,要求解码使用的字符集必须与编码时使用的字符集一致,否则会出现乱码。
    ② String 与 char[] 之间的转换。
    (一)String --> char[]:调用String的toCharArray();char[] charArray = "abs123".toCharArray();
    (二)char[] --> String:调用String的构造器;String str = new String(charArray);
    ③ String 与 基本数据类型、包装类之间的转换。
    (一) String --> 基本数据类型、包装类:调用包装类的静态方法:parseXxx(str);int num = Integer.parseInt(str);
    (二)基本数据类型、包装类 --> String:调用String重载的valueOf(xxx);String str = Strig.valueOf(num);

StringBuffer 和 StringBuilder 的使用

在这里插入图片描述

  1. String、StringBuffer、StringBuilder 三者效率:String < StringBuffer < StringBuilder。(用法: 和 String 的 new 用法一样
  2. 常用方法:
 增: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()

util.Date 类 和 sql.Date 类

util.Date 的使用:

  1. 两个构造器的使用:
    ① Date() :创建一个对应当前时间的 Date 对象;Date date = new Date();
    ② 创建指定毫秒数的 Date 对象;Date date = new Date(1639555632718L);
  2. 两个方法的使用:
    ① toString():显示当前的年、月、日、时、分、秒。
    ② getTime():获取当前 Date 对象对应的毫秒数。(时间戳)

sql.Date 的介绍: 它对应着数据库中的日期类型的变量。

  1. 实例化:java.sql.Date date = new java.sql.Date(1639555632718L);
  2. util.Date --> sql.Date :java.sql.Date date = new java.sql.Date(毫秒数);
    System 类中 currentTimeMillis() 介绍:返回当前时间和1970年1月1日0时0分0秒之间以毫秒为单位的时间差,成为时间戳;long time = System.currentTimeMills();

SimpleDateFromat 的使用

介绍:SimpleDateFromat 对日期 Date 类的格式化和解析。

  1. 实例化:
    ① 默认构造器:SimpleDateFormat sdf = new SimpleDateFormat();
    ② 按照指定方式格式化和解析:调用带参的构造器;SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  2. 两个操作:
    ① 格式化:日期 —> 字符串;String str = sdf.format(date);
    ② 解析:格式化的逆过程,字符串 —> 日期;Date date = sdf.parse("19-12-18 上午12:33");

LocalDate、LocalTime、LocalDateTime 的使用

说明:LocalDateTime 相较于 LocalDate、LocalTime,使用频率要高。

  1. now():获取当前的 日期:LocalDate localDate = LocalDate.now();、时间:LocalTime localTime = LocalTime.now();、日期和时间:LocalDateTime localDateTime = LocalDateTime.now();
  2. of():设置指定的年、月、日、时、分、秒。没有偏移量:LocalDateTime localDateTime = LocalDateTime.of(2020, 10, 6, 13, 23, 43);
  3. getXxx():获取相关属性
localDateTime.getDayOfMonth();// 这个月的第几天
localDateTime.getDayOfWeek();//周几 的英文
localDateTime.getMonth();//月的英文
localDateTime.getMonthValue();//月 的数字
localDateTime.getMinute();//秒
  1. withXXX():设置相关属性:这里也提现了不可变性
localDate.withDayOfMonth(22);//返回更改 这个月的第几天 的 LocalDateTime 对象
localDateTime.withHour(4);//返回更改 时辰 的 LocalDateTime 对象
localDateTime.plusMonths(3);//返回加上 月数 的 LocalDateTime 对象
localDateTime.minusDays(6);//返回减去 天数 的 LocalDateTime 对象

Comparable自然排序举例

**介绍:**在 Java 对象中,正常情况下,我们只能比较:==、!=。不能使用 > 或 < 的;但是如果要比较对象的大小,就需要使用 ComparableComparator

  1. 两个接口的使用对比:
    ① Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小
    ② Comparator接口属于临时性的比较。
  2. 举例:
    ① Comparable 接口的使用举例:自然排序
    (一)像 String、包装类等实现了 Comparable 接口,重写了里面的 compareTo(obj) 方法,给出了比较对象大小的方式。进行了从小到大的排序。
 @Test
public void test1(){
    String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));
}

(二)重写 compareTo(obj) 的规则:

	如果当前对象this > 形参对象obj,则返回正整数,
    如果当前对象this < 形参对象obj,则返回负整数,
    如果当前对象this == 形参对象obj,则返回零。

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

public class Goods implements Comparable{
	private String name;
	private double price;
	……相关构造器 get set 方法省略……
	//指明商品比较大小的方式:按价格从低到高排序,再按照产品名称从高到低排序
	@Override
	public int compareTo(Object o){
		if(o instanceof Goods){
			Goods goods = (Goods) o;
			if(this.price > goods.price){
				return 1;
			}else if(this.price < goods.price){
				return -1;
			}else{
				//return 0;
				return -this.name.compareTo(goods.name);//调用String 类 和包装类的
			}
		}
		throw new RuntimeException("传入的数据类型不一致");
	}
}
//实用
@Test
public void test2(){
    Goods[] arr = new Goods[5];
    arr[0] = new Goods("lenovoMouse",34);
    arr[1] = new Goods("dellMouse",43);
    arr[2] = new Goods("xiaomiMouse",12);
    arr[3] = new Goods("huaweiMouse",65);
    arr[4] = new Goods("microsoftMouse",43);
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));
}

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

如果方法返回正整数,则表示o1 > o2;
如果返回0,表示相等;
返回负整数,表示o1 < o2。

(三)例子 一:

@Test
public void test3(){
   String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};
   Arrays.sort(arr,new Comparator(){
       //按照字符串从大到小的顺序排列
       @Override
       public int compare(Object o1, Object o2) {
           if(o1 instanceof String && o2 instanceof  String){
               String s1 = (String) o1;
               String s2 = (String) o2;
               return -s1.compareTo(s2);
           }
//                return 0;
           throw new RuntimeException("输入的数据类型不一致");
       }
   });
   System.out.println(Arrays.toString(arr));
}

(四)例子 二:

@Test
public void test4(){
    Goods[] arr = new Goods[6];
    arr[0] = new Goods("lenovoMouse",34);
    arr[1] = new Goods("dellMouse",43);
    arr[2] = new Goods("xiaomiMouse",12);
    arr[3] = new Goods("huaweiMouse",65);
    arr[4] = new Goods("huaweiMouse",224);
    arr[5] = new Goods("microsoftMouse",43);

    Arrays.sort(arr, new Comparator() {
        //指明商品比较大小的方式:按照产品名称从低到高排序,再按照价格从高到低排序
        @Override
        public int compare(Object o1, Object o2) {
            if(o1 instanceof Goods && o2 instanceof Goods){
                Goods g1 = (Goods)o1;
                Goods g2 = (Goods)o2;
                if(g1.getName().equals(g2.getName())){
                    return -Double.compare(g1.getPrice(),g2.getPrice());
                }else{
                    return g1.getName().compareTo(g2.getName());
                }
            }
            throw new RuntimeException("输入的数据类型不一致");
        }
    });

    System.out.println(Arrays.toString(arr));
}

相关面试题

String s = new String(“abc”);方式创建对象,在内存中创建了几个对象?

两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:“abc”

String、StringBuffer、StringBuilder三者的异同?

  1. String:不可变的字符序列;底层使用char[]存储
  2. StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储
  3. StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储

参考https://www.bilibili.com/video/BV1Kb411W75N?from=search&seid=2916918626291484311&spm_id_from=333.337.0.0

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二爷.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值