day16-

Java常用类

1.字符串相关类练习

1.1StringBuilder练习

package li.normalclass.stringbuilder;

public class TestBuffer {
    public static void main(String[] args) {
        StringBuffer a = new StringBuffer("A");
        StringBuffer b = new StringBuffer("B");
        mb_operate(a,b);
        System.out.println(a+"."+b);
}

    private static void mb_operate(StringBuffer x, StringBuffer y) {
        x.append(y);
        y=x;
    }
}

问: System.out.println(a+"."+b);的输出结果是?

答:AB.B

原因如下:

当运行main方法时,在栈中开辟了两个内存空间,分别是a和b,指向在堆中创建的两个对象,对象又分别指向了两个字符数组,数组中存储的就是新建对象时传入的参数。

接着运行mb_operate方法,在栈中另外开辟两个内存空间,命名为x和y。其中x指向的是a指向的对象,y指向的是b指向的对象。 x.append(y);就是在a对象指向的数组中追加b对象指向的数组中的值,此时a对象指向的数组值为AB;y=x;就是将x中存储的地址赋值给y,之后y就指向了x指向的对象,即a指向的对象。

System.out.println(a+"."+b);输出a对象和b对象的值,此时a对象中的值为AB,b对象中的值为B,因此输出的内容为AB.B

image-20220807155800679

1.2String和字符数组练习

package li.normalclass.stringbuilder;

public class Example {
    String str = new String("good");
    char[] ch = {"a","b","c"};
    public static void main(String[] args) {
        Example ex = new Example();
        ex.change(ex.str,ex.ch);
        System.out.print(ex.str+"and");
        System.out.print(ex.ch);
    }

    public void change(String str,char ch[]){
        str = "test ok";
        ch[0] = "g";
    }
}

问:

System.out.print(ex.str+"and");

“System.out.print(ex.ch);`

的输出结果是?

答:goodandgbc

原因如下:

dfgbfgdnbi

首先,当main方法创建ex对象,ex指向的对象中的str会再创建一个String类型对象,str指向这个String对象,然后String对象又指向good字符串的地址。

ex指向的对象中的ch则会创建一个字节数组,该数组中存储了abc三个字符。

当运行change()方法时,又在栈中开辟了两个局部变量空间,分别为str和ch,然后传入参数。将ex.str指向的地址0x2012赋给局部变量str,将ex.ch指向的地址0x4012赋给局部变量ch。在change方法体中,str = "test ok";则是在常量池中新建了一个字符串,将新建字符串的地址赋给了局部变量str,因此此时局部变量str指向的地址为0x5012;而 ch[0] = "g";,则是将局部变量ch指向的字符数组中的ch[0]数据改变为g。

此时,运行语句System.out.print(ex.str+"and");则输出的是仍ex.str指向的String对象指向的字符串good

运行语句 System.out.print(ex.ch);,输出的是被局部变量改变的数组gbc,因为ex.ch和局部变量ch指向的地址相同。

image-20220807155735552

1.3再次理解String和StringBuilder的不同之处

1.3.1String

package li.normalclass.stringbuilder;

public class TestStringAndBuilder {
    public static void main(String[] args) {
        String str5 = new String("北京");
        str5 = str5.concat("故宫");
        str5 = str5.concat("博物院");
        System.out.println(str5);//北京故宫博物院
    }
}

bdfopjso

采用字面值的方式创建一个字符串时,JVM首先会去字符串池中查找是否存在”北京”这个对象,如果不存在,则在字符串池中创建”北京”这个对象,然后将池中”北京”这个对象的引用地址返回给”北京”对象的引用str5。使用concat()方法可以追加子字符串,但是String是不可变长序列,所以是实际上是在常量池重新创建了一个对象,并把追加的字符串连同原字符串一同赋值给新的对象,然后将新对象的引用地址返回给str5,这样str5就指向了一个新的地址空间。每次使用concat()方法追加子串都会经历上述过程,str5的指向不断改变,最终会指向最后一次开辟的对象地址

因此使用concat()追加子串的方法效率无疑是很低的,那么有没有一种办法可以直接在创建的对象里添加子串呢?这就是我们要涉及到的StringBuilder类

1.3.2StringBuilder

package li.normalclass.stringbuilder;

public class TestStringAndBuilder {
    public static void main(String[] args) {
 
        StringBuilder builder = new StringBuilder("北京");
        builder.append("故宫");
        builder.append("地址为北京市东城区景山前街4号");
        System.out.println(builder.toString());
    }
}

zsfddawg12

StringBuilder对象指向的字符数组是可变的,在创建时的长度为创建时传入的字符长度+16,之后每次增加字符进去,直到要增加的字符长度超过当前字符数组的内存空间容量,就会重新开辟一块地址空间,容量为当前容量的两倍再加上2,然后将StringBuilder对象指向新开辟的内存地址,而在栈内存中的builder存储的地址保持不变,指向StringBuilder对象。

2.JDK8新日期类

针对JDK8以前的时间日期类设计的不足,比如不支持时区,线程不安全等,JDK8引入了java.time包来作为新的日期时间处理类。

image-20220807192842310

描述
Instant 时间戳(瞬时时间,带时区)
LocalDate 日期(比如:2018-09-24,不带时区)
LocalTime 时间(比如:10:32:10,不带时区)
LocalDateTime 日期时间(比如:2018-09-24 10:32:10,不带时区)
Duration 两个时间的差,精确到秒或纳秒
Peroid 两个日期的差(精确到日)
DateTimeFormatter 日期时间格式化类(日期和字符串格式转换)
ZoneId 时区
ZoneOffset 时区偏移量(比如:+8:00)
ZonedDateTime 带时区的日期时间
ChronoUnit 日期枚举类(在时间加减操作可用到)
MonthDay 月日
YearMonth 年月
Clock 代表时钟(比如:获取当前美国纽约的时间)

例子:

package li.normalclass.date;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class TestNewDate {
    public static void main(String[] args) {
        //获取当前的时间
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println(localDateTime);//2022-08-07T19:08:14.571
        System.out.println(localDateTime.getDayOfWeek());//SUNDAY

        //获取指定的时间
        LocalDateTime localDateTime1 = LocalDateTime.of(1111,11,11,11,11,11);
        System.out.println(localDateTime1);//1111-11-11T11:11:11
        System.out.println(localDateTime1.getDayOfYear());//315
        System.out.println(localDateTime1.getDayOfWeek());//SATURDAY


        //字符串转换为日期类
        String str = "1999年12月23日";
        DateTimeFormatter dtfr = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
        //String--->Date Parse
        LocalDate localDate = LocalDate.parse(str,dtfr);
        System.out.println(localDate);//1999-12-23
        //Date--->String format
        String datestr = localDate.format(dtfr);
        System.out.println(datestr);//1999年12月23日
    }
}
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » day16-