第十一节 常用类

130 阅读4分钟

11.1String字符串的基本理解

①.String声明为final的,不可被继承 ②.String实现了Serializable接口:表示字符串是支持序列化的。 实现了Comparable接口:表示String可以比较大小 ③.String内部定义了final char[] value用于存储字符串数据 ④.String:代表不可变的字符序列。简称:不可变性。

11.2.字符串创建的两种方式

String s1 = "abc";

String s2 = new String("abc");

s1:指向常量池

s2:①指向堆②指向常量池

intern()返回常量池地址

11.3String的常用方法

int length():返回字符串的长度: return value.length
②char charAt(int index): 返回某索引处的字符return value[index]
③boolean isEmpty():判断是否是空字符串:return value.length == 0
④String trim():返回字符串的副本,忽略前导空白和尾部空白
⑤boolean equals(Object obj):比较字符串的内容是否相同
⑥int compareTo(String anotherString):比较两个字符串的大小
⑦String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
⑧int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引

11.4String 与基本数据类型、包装类之间的转换

    /*
    String --> 基本数据类型、包装类:调用包装类的静态方法:parseXxx(str)
    基本数据类型、包装类 --> String:调用String重载的valueOf(xxx)
     */
    @Test
    public void test1(){
        String str1 = "123";
        int num = Integer.parseInt(str1);
​
        String str2 = String.valueOf(num);//"123"
        System.out.println(str1 == str3);
    }
​
}

11.5String、StringBuffer、StringBuilder三者的异同

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

11.6StringBuffer的常用方法

增: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()

11.7对比String、StringBuffer、StringBuilder三者的效率

从高到低排列:StringBuilder > StringBuffer > String

11.8日期常用方法

//1.System类中的currentTimeMillis()
@Test
public void test1(){
    long time = System.currentTimeMillis();
    //返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
    //称为时间戳
    System.out.println(time);
}
//SimpleDateFormat的实例化
@Test
public void test2(){
        //格式化:日期 --->字符串
        Date date = new Date();
        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
        Date date2 = sdf1.parse("2020-02-18 11:48:27");
        System.out.println(date2);
}
//DateTimeFormatter:格式化或解析日期、时间
//类似于SimpleDateFormat
@Test
public void test3(){
        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
}

11.9Comparable接口与Comparator的使用

11.9.1Comparable接口的使用
1.String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,进行了从小到大的排列
2. 对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写compareTo(obj)方法。
    如果当前对象this大于形参对象obj,则返回正整数,
    如果当前对象this小于形参对象obj,则返回负整数,
    如果当前对象this等于形参对象obj,则返回零。
 */
    @Test
    public void test1(){
        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));
    }
    public class Goods implements  Comparable{
​
    private String name;
    private double price;
​
    public Goods() {
    }
​
    public Goods(String name, double price) {
        this.name = name;
        this.price = price;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public double getPrice() {
        return price;
    }
​
    public void setPrice(double price) {
        this.price = price;
    }
​
    @Override
    public String toString() {
        return "Goods{" +
                "name='" + name + ''' +
                ", price=" + price +
                '}';
    }
​
    //指明商品比较大小的方式:按照价格从低到高排序,再按照产品名称从高到低排序
    @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 -this.name.compareTo(goods.name);
            }
        }
        throw new RuntimeException("传入的数据类型不一致!");
    }
}
​
11.9.2Comparator接口的使用:定制排序
    @Test
    public void test2(){
        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));
    }

11.10其他常用类的使用

@Test
public void test2() {
    BigInteger bi = new BigInteger("1243324112234324324325235245346567657653");
    BigDecimal bd = new BigDecimal("12435.351");
    BigDecimal bd2 = new BigDecimal("11");
    System.out.println(bi);
    //除不尽报错
    //System.out.println(bd.divide(bd2));
    System.out.println(bd.divide(bd2, BigDecimal.ROUND_HALF_UP));
    //指定小数点后面位数
    System.out.println(bd.divide(bd2, 25, BigDecimal.ROUND_HALF_UP));
​
}