D2 常用类总结

1.字符串相关

1.1 String基本概念

String str = “String”String str = new String(“String”) 的区别:

  • 字符串常量存储在字符串常量池,目的是共享
  • 字符串非常量对象存储在堆中

康师傅的这张图表现的非常清晰:
字符串的存储方式


1.2 String、StringBuffer和StringBuilder

直接看底层的实现:

  • String:
private final byte[] value
  • StringBuffer:
// 构造器
    AbstractStringBuilder(int capacity) {
       if (COMPACT_STRINGS) {
           value = new byte[capacity];
           coder = LATIN1;
       } else {
           value = StringUTF16.newBytesFor(capacity);
           coder = UTF16;
       }
   }
// 扩容时
    int newCapacity = (oldCapacity << 1) + 2
  • StringBuilder:
// 构造器
   AbstractStringBuilder(int capacity) {
       if (COMPACT_STRINGS) {
           value = new byte[capacity];
           coder = LATIN1;
       } else {
           value = StringUTF16.newBytesFor(capacity);
           coder = UTF16;
       }
   }
// 扩容时
    int newCapacity = (oldCapacity << 1) + 2
  1. 可以发现三者都在java.lang包下,其中String被声明为final的,所以不可变;
  2. 而StringBuffer和StringBuilder都是调用了父类AbstractStringBuilder的构造器,在该父类中声明了大小为capacity(默认为16)的byte[],因此二者可变;
  3. 同时,扩容方法都是变为原字符串长度的2倍+2,为了避免多次扩容,应当尽量使用含参构造器。

其中StringBuffer是线程安全的,效率较低:

    public synchronized StringBuffer append(Object obj) {
        toStringCache = null;
        super.append(String.valueOf(obj));
        return this;
    }

而StringBuilder是线程不安全的,效率更高:

	public StringBuilder append(String str) {
        super.append(str);
        return this;
    }

1.3 字符串常用方法

  • charAt(int index): 返回某索引处的字符return value[index]
  • isEmpty():判断是否是空字符串:return value.length == 0
  • toLowerCase():使用默认语言环境,将 String 中的所有字符转换为小写
  • toUpperCase():使用默认语言环境,将 String 中的所有字符转换为大写
  • trim():返回字符串的副本,忽略前导空白和尾部空白
  • equals(Object obj):比较字符串的内容是否相同
  • equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写
  • concat(String str):将指定字符串连接到此字符串的结尾。 等价于用“+”
  • compareTo(String anotherString):比较两个字符串的大小
  • substring(int beginIndex):返回一个新的字符串,它是此字符串的从index开始截取到最后的一个子字符串。
  • substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
  • endsWith(String suffix):测试此字符串是否以指定的后缀结束
  • startsWith(String prefix):测试此字符串是否以指定的前缀开始
  • startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
  • contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列时,返回 true
  • indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
  • indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
  • lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引
  • lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
    注意:indexOf和lastIndexOf方法如果未找到都是返回-1
  • replace(str, str1): 替换str中所有str1
  • replaceALL/replaceFirst/matches(): 包含正则的替换/替换第一个/查找匹配
  • split(str, int(可选)): 按str分割字符串为int份,超出的都放在最后一份
  • Integer.parseInt(): 将数字组成的字符串转换成int, Double/Byte…都有类似的方法
  • String.valueOf(): 将int/double…转换成字符串
  • toCharArray(): 转化成char[]
  • getChars(begin, end, target, start): 将字符串begin到end-1部分放入target中,从target[start]开始放,需要提供足够大的char[]
  • str.getBytes(): 将str转换成编码存放在byte[]
  • Arrays.toString(): 数组类型的用这个方法打印
  • append/delete/insert/reverse
  • replace(start, end, str): 把start到end位置替换成str,可以不等长
  • setCharAt(): 更改单个字符

2. 时间相关方法

2.1 获取当前时间的几种方式

  • System.currentTimeMillis():返回从1970.1.1.0:00:00至今的毫秒数——时间戳
  • Date date = new Date():创建日期类,调用相关方法

date.toString(): 返回到秒的时间
date.getTime(): 返回时间戳
date(long): 将long毫秒数变为具体时间

  • SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”):按指定格式获取时间

2.2 时间的其它方法

  • cal.get(Calendar.XXX):设置某个时间cal以获取至今的时间间隔

3. 比较器

为了比较对象,不只是使用 == 或 !=, 需要实现Comparable/Comparator接口:

  • Comparable用于在类中实现,实现后,类的实例化对象具备CompareTo方法
class ComTest implements Comparable{
    @Override
    public int compareTo(Object o) {
        return 0;
    }
}
  • Comparator用于不可修改代码且未实现Comparable接口的对象, 利用比较器比较,对象不具备比较的方法,需要重写Compare方法并抛出异常
Arrays.sort(str, 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);
        }
        throw new RuntimeException("数据异常");
    }
});

4. 枚举类

当类的对象只有有限个确定值时可以使用,尤其是定义一组常量时建议使用。
enum可以有属性,方法,可以实现接口,注意对象间用 ‘,’ 间隔,结束用 ‘;’

  • 可以在enum中实现抽象方法,也可以在每个对象处实现方法
enum Students{
    // 枚举类需要写上注释让人知道这是啥
    Zhao,
    Qian,
    Sun,
    Li;
}
main(){
    @Test
    public void test(){
        Students zhou = Students.Zhao;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值