字符串的创建与初始化

字符串的创建与初始化

[^1.字符串是常量,可以存储任意长度的字符信息包括汉字,创建后其值不能被改变,长度也不能被改变,2. String类是final类,且其类中所有成员方法都是默认为final方法,3. String类实际上是通过char字符数组来保存字符串的]:

字符串的创建

  • 创建非空的字符串

    public static void main(String[] args) {
            String date = "2022/8/10";
            System.out.println(date);
        }
    

    小结 :

    1.上面实例用双引号创建了一个字符串“2022/8/10”,同时将这个字符串内存引用地址赋值给了date

  • 创建空的字符串

        String years;
        static String days;
        public static void main(String[] args) {
            String name;
            String nameStr = null;
            //System.out.println(name);java: 可能尚未初始化变量name
            System.out.println(nameStr);//null
            System.out.println(nameStr.substring(0, 1));//java.lang.NullPointerException
            System.out.println(new JustPlay().years);//null
            System.out.println(days);//null
        } 
    

结论:

1.如果不初始化字符串对象,变量就不会指向任何一个内存地址,此时调用该变量就会出现编译报错

 ####   2.全局变量可以不必强制声明,默认赋值为null,局部变量必须初始化对象否则报错!!!

3.创建一个空的字符串变量可以使用null进行赋值,但是null并不可以被调用,null没有任何内容,调用null时会抛出空指针异常!!!


初始化字符串

所有的基本数据类型都可以被转换为字符串

在这里插入图片描述在这里插入图片描述

  • 1.直接赋值法

      //使用直接赋值获得字符串对象
        String s1 = "abc";
    
        System.out.println(demo01.s1);//abc
    
  • 2.使用new关键字创建

    
        //使用new的方式获得一个字符串对象
        //1.空参构造:可以获得一个空的字符串对象
        String s2 = new String();
    
        //2.有参构造器:传递一个字符串,根据传递的字符串内存再创建一个字符串对象
        String s3 = new String("123");
        //3.传递一个字符数组,根据字符数组的内在创建一个新的字符串对象
        char[] chs = new char[]{'a','b','c','d'};
        String s4 = new String(chs);
        String s4a = new String(chs);
    
        //需求:我要修改字符串的内容:abc——》qbc
        //abc——》{'a','b','c'};——》{'q','b','c'};——》“qbc”;
    
        //4.创建一个字节数组,根据字节数组的内容在创建一个新的字符串对象
        byte[] bytes = new byte[]{97,98,99,100};
        String s5 = new String(bytes);
        //转换为字符串
        //应用:以后在网络当中传输数据其实都是字节信息
        //需求:我们一般把字节信息转化为字符串信息,就需要使用这个构造器
    
            Demo01 demo01 = new Demo01();
            System.out.println(demo01.s1);//abc
            System.out.println("@"+demo01.s2+"~!");//@~!
            System.out.println(demo01.s3);//123
            System.out.println(demo01.s4);//abcd
            System.out.println(demo01.s5);//abcd
    

String对象两种赋值方法的内存分析

这里是String内存分析
1.使用直接赋值的方式时,系统会检查字符串内容是否在串池存在
不存在:在池创建新的,存在复用
2.使用构造方法时,创建的字符串对象不会复用,如果存在很多对象内容相同的情况会导致内存浪费

instanceof

  • instanceof标识此对象是否属于该类
        Demo01 demo02 = new Demo01();       
        String s9 = "abc";      
        System.out.println(demo01.s9 instanceof String);//true
        System.out.println(demo01 instanceof Demo01);//true
        System.out.println(demo02 instanceof Demo01);//true

对象的比较

  • 引用类型对象的比较分为两类
  • {值类型比较:如果两个对象的内容相同,则认为他们的值都是相等的 equals()
  • {引用类型比较:判断两个对象是否在内存空间的地址是否相同 ==
引用类型比较
  • {值类型比较:如果两个对象的内容相同,则认为他们的值都是相等的 equals()

            //引用类型比较
    
            Demo01 demo02 = new Demo01(); 
    
            String s9 = "abc";
    
            String s4a = new String(chs);
    
            System.out.println(demo01.s1==demo01.s9);//true
    
            System.out.println(demo01 == demo02);//false
    
            System.out.println(demo01.s4 == demo01.s4a);//false
    
    
值类型比较
  • {引用类型比较:判断两个对象是否在内存空间的地址是否相同 ==

         // 值类型比较     
    equals();
         Demo01 demo02 = new Demo01(); 
    
         String s9 = "abc";
    
         String s4a = new String(chs);     
    
         System.out.println(demo01.s9.equals(demo01.s1));//true
    
         System.out.println(demo02.s3.equals(demo01.s3));//true
    
         System.out.println(demo01.s4a.equals(demo01.s4));//true
    
    equalsIgnoreCase(s2); //忽略大小写 1,一,壹中文不行!!!
            String s7 = new String("Abc");
           
            boolean b = demo02.s3.equals(demo02.s1);
    
            System.out.println(b);//false
    
            System.out.println(demo02.s1.equalsIgnoreCase(demo02.s7)//true
    
    
  • 作业:假设我现在键盘输入一个abc,代码在定义一个String类的“abc”,用==和equals()比较?

      Scanner sc = new Scanner(System.in);
            String next = sc.next();
            String name = "abc";
            boolean flag2 = next==name?true:false;
            System.out.println(flag2);//false
            boolean flag = next.equals("abc");
            System.out.println(flag);//true
            sc.close();
    

版权声明:本文为m0_72892442原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。