原文地址:https://www.cnblogs.com/OnlyCT/p/5433410.html

String是一个非常常用的类,应该深入的去了解String

如:

String str =new String("abc")

String str1 = "abc"

System.out.println(str == str1)

System.out.println(str.equal(str1))

结果:

false

true

原因解析:

  • Java运行环境有一个字符串池,由String类维护。

1. 执行语句String str="abc";时。首先查看字符串池中是否存在字符串"abc",如果存在则直接将“abc”赋给str,如果不存在则先在  字 符串池中新建一个字符串"abc",然后再将其赋给str.

2. 执行语句String str = new String("abc");时。不管字符串池中是否存在字符串“abc”,直接新建一个字符串“abc”,(注意,新建的字符串“abc”不是在字符串池中), 然后将其赋给str。由此可见 1.的效率要高于2的效率。

3. String str1="java";//指向字符串池
     String str2="blog";//指向字符串池
       String   s = str1+str2;

  +运算符会在堆中建立起两个String对象,这两个对象的值分别是“java”,"blog",也就是说从字符串常量池中复制这两个值,然后再堆中创建两个对象。然后再建立对象s,然后将“javablog”的堆地址赋给s.  这句话共创建了3个String对象。

System.out.println(s=="javablog");//结果是false;

JVM确实对形如String str="javablog";的对象放在常量池中,但是它是在编译时name做的。而String s=str1+str2;是在运行时候才能知道的,也就是说str1+str2是在堆里创建的,所以结果为false了。
      String s="java"+"blog";//直接将javablog对象放入字符串池中。        System.out.println(s=="javablog");//结果是true;

String s=str1+"blog";//不放在字符串池中,而是在堆中分分配。       System.out.println(s=="javablog");//结果是false;

 总之,创建字符串有两种方式:两种内存区域(pool,heap)
      1.""创建的字符串在字符串池中。
      2.new 创建字符串时,首先查看池中是否有相同的字符串,如果有则拷贝一份放到堆中,然后返回堆中的地址;如果池中没有则在堆中创建一分,然后返回堆中的地址,
      3.在对字符串赋值时,如果右操作数含有一个或一个以上的字符串引用时,则在堆中再建立一个字符串对象,返回引用如:String s= str1+"blog";

之间的区别

第1种:

  String a="abc";
String b="abc";
System.out.print(a==b); 结果:true 原因:编译时,这两个"abc"被认为是同一个对象保存到了常量池中;运行时JVM则认为这两个变量赋的是同一个对象,所以返回true。 ---------------------
第2种: String a=new String("abc");
String b=new String("abc");
System.out.print(a==b); 结果:false 原因:用构造器创建的对象,是不会被放入常理池中的,也很明显这完全是两个对象,只是内容相同罢了,结果当然为false了。用equals()或者System.out.print(a.intern()==b.intern());就返回true了。 ------------------------------
第3种 String a="abc";
String b=new String("abc");
System.out.print(a==b); 结果:false 原因:同上。此外,a的类加载时就完成了初始化,而b要在执行引擎执行到那一行代码时才完成初始化。 ---------------------------
第4种 String a="abcdef";
System.out.print(a=="abcdef"); 结果:true 原因:运行出现的字符串常量,若是在常量池中出现过,则JVM会认为同一个对象,以节省内存开销,所以这两个字符串会被认为是同一个对象。 -------------------------------------------
第5种 String a="abcdef";
String b="";
String c=a+b;
System.out.print(c=="abcdef"); 结果:false 原因:编译时,先将"abcedf"放在常量池中,而c的值则是在运行时在堆里创建的。所以为false。
  • Object o与Object o=null的区别

具体差别如下:
class Test {

public static void main(String[] args) {
  Object o1;
  o1.toString(); /*这里编译不能通过,编译器只认定o1是个引用,没指向任何对象,所以不能调用方法。*/
  Object o2 = null;
  o2.toString(); /*这里编译可以过,但是有空指针异常,编译器认定o2是一个对象,虽然是一个空对象。*/
  }
}
null对象是一个特殊的对象,他可以是任何类型。他只是作为一个标记而已,只是为了标记不存在而存在的。也没必要去追究他在内存是什么样。null就是一个标记而已。容器可以接受一个空对象,但是一个空引用则是不接受的。
Object o; //这种写法只是分配一个引用,没有分配内存。
Object o = null; //这么写则是给引用指向了一个空对象。分配了内存(空对象),所以编译不会报错,运行时报空指针异常。

关于String str =new String("abc")和 String str = "abc"的比较--转的更多相关文章

  1. 关于String str =new String("abc")和 String str = "abc"的比较

    String是一个非常常用的类,应该深入的去了解String 如: String str =new String("abc") String str1 = "abc&qu ...

  2. Java中String直接赋字符串和new String的区别 如String str=new String("a")和String str = "a"有什么区别?

    百度的面试官问 String A="ABC"; String B=new String("ABC"); 这两个值,A,B 是否相等,如果都往HashSet里面放 ...

  3. java中String s="abc"及String s=new String("abc")详解

    1.   栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2.   栈的优势是,存取速度比堆要快,仅次于直 ...

  4. JAVA基础知识 String s = new String("ABC") VS String s = "abc"

    一:   String s = new String("ABC")  VS  String  s = "abc" String  s = "abc&q ...

  5. Python3中内置类型bytes和str用法及byte和string之间各种编码转换,python--列表,元组,字符串互相转换

    Python3中内置类型bytes和str用法及byte和string之间各种编码转换 python--列表,元组,字符串互相转换 列表,元组和字符串python中有三个内建函数:,他们之间的互相转换 ...

  6. String的内存模型,为什么String被设计成不可变的

    String是Java中最常用的类,是不可变的(Immutable), 那么String是如何实现Immutable呢,String为什么要设计成不可变呢? 前言 关于String,收集一波基础,来源 ...

  7. C++读写TXT文件中的string或者int型数据以及string流的用法

    对文件的读写操作是我们在做项目时经常用到的,在网上看了很多博客,结合自身的项目经验总结了一下,因此写了这篇博客,有些地方可能直接从别的博客中复制过来,但是都会注明出处. 一.文件的输入输出 fstre ...

  8. c++中几种常见的类型转换。int与string的转换,float与string的转换以及string和long类型之间的相互转换。to_string函数的实现和应用。

    1.string转换为int a.采用标准库中atoi函数,对于float和龙类型也都有相应的标准库函数,比如浮点型atof(),long型atol(). 他的主要功能是将一个字符串转化为一个数字,在 ...

  9. String直接赋字符串和new String的区别

    String A="ABC"; String B=new String("ABC"); String A = "ABC";内存会去查找常量池 ...

随机推荐

  1. bzoj1601

    题解: 简单生成树 代码: #include<bits/stdc++.h> using namespace std; ; int n,dis[N],f[N],a[N][N],ans; in ...

  2. LA3905

    题意: 给出n颗流星,第i颗在第T秒时飞到(xi+ai*t,yi+bi*t),给出一个矩形,问在某一时刻这个矩形中的流星数目最多有多少 题解: 首先计算出每一颗流星经过时间 然后左端点移动,计算出少了 ...

  3. Sring类的codePointAt()方法

    工作中遇到一段代码 private static String getClassNameWithoutPackage(Class cl) { String className = cl.getName ...

  4. netstat 问题处理

    MySQL SQL Writing to net Creating sort index StatisticsPreparing

  5. Python3.5+SQL+Prometheus+Grafana报表/监控

    参考资料: pymysql 单独获取表的栏位名称 pymysql返回数据为字典形式(key:value--列:值)   行列结合,作为prometheus_client的输出. 话不多说,直接上脚本. ...

  6. (C/C++学习笔记) 九. 变量的存储类型

    九. 变量的存储类型 ● 变量的存储类型(见附页) ● 注释 ①对于自动变量,它属于动态存储方式. 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式.由此看来,一个 ...

  7. C/C++除法实现方式及负数取模详解

    一.下面的题目你能全做对吗? 1.7/4=? 2.7/(-4)=? 3.7%4=? 4.7%(-4)=? 5.(-7)/4=? 6.(-7)%4=? 7.(-7)/(unsigned)4=? 答案: ...

  8. <NET CLR via c# 第4版>笔记 第17章 委托

    17.1 初识委托 .net 通过委托来提供回调函数机制. 委托确保回调方法是类型安全的. 委托允许顺序调用多个方法. 17.2 用委托回调静态方法 将方法绑定到委托时,C# 和 CLR 都允许引用类 ...

  9. ThreadPoolTaskExecutor多线程使用,及线程池配置

    1.配置 ThreadPoolTaskExecutor bean <?xml version="1.0" encoding="UTF-8"?> &l ...

  10. Android开发入门要点记录:四大组件

    cocos2dx跨平台开发中需要了解android开发,昨天快速的浏览了一本Android开发入门教程,因为之前也似懂非懂的写过Activity,Intent,XML文件,还有里面许多控件甚至编程思想 ...