2021-04-12

创建字符串

创建字符串有两种方式:
1.直接创建
2.引用对象创建

String s1 = "lalala";              // String 直接创建
String s2 = "lalalala";              // String 直接创建
String s3 = s1;                    // 相同引用
String s4 = new String("lalala");   // String 对象创建
String s5 = new String("lalala");   // String 对象创建

public class StringDemo {//String类构造方法来初始化字符串
    public static void main(String[] args) {
    char[] helloArray={'a','b','c','d'};
    String helloString=new String (helloArray);
    System.out.println (helloArray);
    }
}

注意:String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了

字符串长度

String 类的一个访问器方法是 length() 方法,它返回字符串对象包含的字符数。

public class StringDemo1 {
    public static void main(String[] args) {
     String site="www.baidu.com";
     int len=site.length ();
     System.out.println ("输出的字符串长度为"+len);
    }
}

那么length() 方法,length 属性和 size() 方法有什么区别呢?
1、length() 方法是针对字符串来说的,要求一个字符串的长度就要用到它的length()方法;
2、length 属性是针对 Java 中的数组来说的,要求数组的长度可以用其 length 属性;
3、Java 中的 size() 方法是针对泛型集合说的, 如果想看这个泛型有多少个元素, 就调用此方法来查看!

下面举一个例子

ublic class StringDemo1 {
    public static void main(String[] args) {
        String array[]={"one","two","three"};
        String A="HelloWorld";
        List<String> list=new ArrayList<String> ();
        list.add (A);
        System.out.println ("数组array的长度为"+array.length);
        System.out.println ("字符串的长度为"+A.length ());
        System.out.println ("list中元素个数为"+list.size ());
    }
}
输出结果为:数组array的长度为3
           字符串的长度为10
           list中元素个数为1

String类常见的问题

String s1 = "abc";            // 常量池
String s2 = new String("abc");     // 堆内存中
System.out.println(s1==s2);        // false两个对象的地址值不一样。
System.out.println(s1.equals(s2)); // true
String s1="ab";
String s2="abc";
String s3=s1+"c";
System.out.println(s3==s2);         // false
System.out.println(s3.equals(s2));  // true

先在常量池中创建 ab ,地址指向 s1, 再创建 abc ,指向 s2。对于 s3,先创建StringBuilder(或 StringBuffer)对象,通过 append 连接得到 abc ,再调用 toString() 转换得到的地址指向 s3。故 (s3==s2) 为 false。

public class Main {
    public static void main(String[] args) {
            String str1 = "hello world";
            String str2 = new String("hello world");
            String str3 = "hello world";
            String str4 = new String("hello world");
            System.out.println(str1==str2);//false
            System.out.println(str1==str3);//true
            System.out.println(str2==str4);//false
    }
}

String str1 = “hello world”; 和 String str3 = “hello world”; 都在编译期间生成了字面常量和符号引用,运行期间字面常量 “hello world” 被存储在运行时常量池(当然只保存了一份)。通过这种方式来将 String 对象跟引用绑定的话,JVM 执行引擎会先在运行时常量池查找是否存在相同的字面常量,如果存在,则直接将引用指向已经存在的字面常量;否则在运行时常量池开辟一个空间来存储该字面常量,并将引用指向该字面常量。

众所周知,通过 new 关键字来生成对象是在堆区进行的,而在堆区进行对象生成的过程是不会去检测该对象是否已经存在的。因此通过 new 来创建对象,创建出的一定是不同的对象,即使字符串的内容是相同的。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值