两种字符串创建方式的对比[java]

String对象两种实例化方式的对比

通过字面值直接赋值创建的方式:

这个时候如果有多个字符串变量以字面值创建方式创建,那么这些字符串变量其实是指向了同一个对象,指向了同一个地址(这个地址是字符串常量池中的一个地址)

  • 通过字面值创建的方式我们在创建时先要看在字符串常量池中有没有值和我们要创建的字符串对象的值一样的,如果没有,就在字符串常量池中创建出一个对象,如果已经有了的话,那么我们只需要将这个字符串引用指向字符串常量池中的这个对象的地址就可以了

  • 注意:字符串常量池中不允许有多个相同值的对象,每个值的对象在字符串常量池中最多有一个,第二次创建时只需要将引用指向已有的对象就可以了

这里我们可以来看一个例题:

public class Demo{
    public static void main(String [] args){
        String s1="123";
        String s2="123";
        System.out.println(s1==s2);//这里输出的结果是什么?
    }
} 

这里输出的结果也是true

由于我们这里通过字面量直接赋值的方式创建了两个相同值的对象,所以这里创建的两个字符串变量是指向了同一个对象的首地址,也就是指向了同一个内存区域,

通过new+构造器的方式创建的方式:

通过这种方式创建的多个相同值的字符串对象的地址不同,这种方式创建就是在堆区中创建字符串对象,在堆区中创建出来的对象每一个对象都是独一无二的

这里有一个例题:

public class Demo2{
    public static void main(Stirng[] args){
        String s1=new String("123");
        String s2=new String("123");
        System.out.println(s1==s2); //这里的输出结果是true还是false呐?
    }
}

上面的输出结果是false

  • 原因:这里我们通过new + 构造器的方式创建字符串对象是在堆区中创建的,每个对象都是独一无二的,这时候的输出结果也就为false

最后:这里由一道面试题

问题:String s =new String("abc");这条语句执行时创建了几个对象?
  • 答案是创建了两个对象
  • 因为这里我们在实质上是执行了 String str =new String(String original);
  • 而这条语句的本质是:this.value=original.value;
  • 也就是这里我们穿参的时候可以说是执行了 string original =“abc”; (在这里我们在字符串长两处中创建了第一个对象)
  • 接下来我们又通过new关键字创建了第二个对象(s),这个对象是在堆空间中创建的
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java中的集合类来实现两个字符串类型的列表的比较,并筛选出不同的元素。具体实现可以参考以下代码: ```java import java.util.ArrayList; import java.util.List; public class CompareStrings { public static void main(String[] args) { List<String> list1 = new ArrayList<String>(); List<String> list2 = new ArrayList<String>(); // 添加元素到列表1 list1.add("apple"); list1.add("banana"); list1.add("orange"); list1.add("grape"); // 添加元素到列表2 list2.add("apple"); list2.add("banana"); list2.add("watermelon"); // 筛选出列表1与列表2不同的元素 List<String> diffList = new ArrayList<String>(); for (String str : list1) { if (!list2.contains(str)) { diffList.add(str); } } System.out.println("列表1:" + list1.toString()); System.out.println("列表2:" + list2.toString()); System.out.println("不同的元素:" + diffList.toString()); } } ``` 上述代码中,我们首先创建了两个字符串类型的列表 `list1` 和 `list2`,并向它们中添加了一些元素。然后,我们使用一个循环遍历 `list1` 中的每个元素,判断其是否存在于 `list2` 中。如果不存在,则将该元素添加到 `diffList` 列表中。最后,我们输出 `list1`、`list2` 和 `diffList` 中的元素。 运行上述代码,输出结果如下: ``` 列表1:[apple, banana, orange, grape] 列表2:[apple, banana, watermelon] 不同的元素:[orange, grape] ``` 可以看到,我们成功地筛选出了 `list1` 与 `list2` 中不同的元素。需要注意的是,上述代码只是一种实现方法,还可以使用其他的集合类和算法来实现相同的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值