一、字符串相关的类

String类及常用方法

1.1String的使用

1.String:字符串,使用一对“”引起来表示。

2.String声明为final,不可被继承。

3.String实现了Serializable接口,表示字符串是支持序列化的。

    实现了Comparable接口,表示String可以比较大小

4.String:代表不可变的字符串序列。简称:不可变性。

  体现:①当对字符串重新赋值时,需要重新指定内存区域,然后进行赋值,不能使用原有的value进行赋值。

    ②当对现有字符串拼接操作时,也需要重新指定区域,然后进行赋值,不能使用原有的value进行赋值。

    ③当调用String的replace方法修改指定的字符或字符串时,也需要重新指定区域进行赋值,不能使用原有的value进行赋值。

5.通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。

6.字符串常量池中是不会存储相同内容的字符串的。

java常用类_java

1.2String对象的创建

String 的实例化方式
方式一:通过字面量定义的方式
方式二:通过new+构造器的方式
/*String 的实例化方式
    方式一:通过字面量定义的方式
    方式二:通过new+构造器的方式

    面试题:String s = new String("abc");方式创建对象,在内存中创建了几个对象?
    两个:一个是堆空间中new的结构,另一个是char[]对应的常量池中的数据"abc"     */@Testpublic void test2(){//字面量的方式:此时的s1和s2的数据“abc”声明在方法去中的字符串常量池中String s1 = "abc";
        String s2 = "abc";//通过new + 构造器的方式:此时的s3和s4保存的是地址值,是数据在堆空间中开辟空间以后对应的地址值。String s3 = new String("abc");
        String s4 = new String("abc");

        Person p1 = new Person("Tom",12);
        Person p2 = new Person("Tom",13);

        System.out.println(s1==s2); //trueSystem.out.println(s1 ==s3); //falseSystem.out.println(s1 ==s4); //fSystem.out.println(s2 == s3);//fSystem.out.println(s3 ==s4); //fSystem.out.println(s1.equals(s3)); //tSystem.out.println("****************************");
        System.out.println(p1.name == p2.name); //注意这里为啥是true,因为通过字面量的方式都是存放在字符串常量池中System.out.println(p1.name.equals(p2.name));//true}

String不同拼接操作的对比:

内存方面的结构要清楚。

结论:

1.常量与常量的拼接结果在常量池.且常量池中不会存在相同内容的常量 。
2.只要其中有一个是变量 结果就在堆中.
3.如果拼接的结果调用 intern() 方,返回值就在常量池中。

/*结论:
    1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量 。
    2.只要其中有一个是变量结果就在堆中
    3.如果拼接的结果调用 intern(),返回值就在常量池中     */@Testpublic void test3(){
        String s1 = "javaEE";
        String s2 = "hadoop";

        String s3 = "javaEEhadoop";
        String s4 = "javaEE" + "hadoop"; //常量与常量拼接还在常量池String s5 = s1 + "hadoop"; //有变量参与相当于new ,在堆空间中String s6 = "javaEE" + s2;
        String s7 = s1 +s2;

        System.out.println(s3 == s4); //tSystem.out.println(s3 == s5); //fSystem.out.println(s3 == s6); //falseSystem.out.println(s5 == s6); //falseSystem.out.println(s5 == s7); //falseSystem.out.println(s6 == s7); //falseString s8 = s5.intern(); //返回值得到的s8使用的常量池中已经存在的“javaEEhadoop”System.out.println(s3 == s8); //true}

 

一道面试题:

/**
 * 一道面试题
 * @author ldbstart
 * @create 2021-03-06 23:49 */public class StringTest {
  String str = new String("good");  char[] ch = {'t','e','s','t'};  public void change(String str ,char ch[]){
      str = "test ok";
      ch[0] = 'b';
  }public static void main(String[] args) {
        StringTest ex = new StringTest();
        ex.change(ex.str,ex.ch);
        System.out.println(ex.str); //"good"System.out.println(ex.ch); //best    }
}

 

JVM中涉及到字符串的内存结构

三种JVM

Sun公司的HotSpot(默认的。不用说)

BEA公司的JRockit

IBM公司的J9 VM

 

 

StringBuffer

StringBuilder

二、JDK8之前的日期时间API三、JDK8之后的日期时间API四、Java比较器五、System类六、Math类七、BigInteger与BigDecimal