字符串的创建与初始化
[^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版权协议,转载请附上原文出处链接和本声明。