网站建设硬件预算,做网站后台开发工资,网站备案证书下载不了,网站的前端怎么做这是以前刚学Java那会经常被问到的问题#xff0c;并且也会经常出现在面试中。这个问题不仅仅只局限于Java#xff0c;可以适用于其他大部分语言#xff0c;正好最近有个小朋友在学编程#xff0c;特此整理一下。String s1 abc ;String s2 new String(…这是以前刚学Java那会经常被问到的问题并且也会经常出现在面试中。这个问题不仅仅只局限于Java可以适用于其他大部分语言正好最近有个小朋友在学编程特此整理一下。String s1 abc ;String s2 new String(abc);首先我们先看看以上两句分别做了什么String s1 abc 做了什么在栈中创建了一个名为 s1 的变量(引用)如果 String池 中没有 abc 存在则在常量池中创建一个 String 类型的 abc 对象有就不创建将 abc 的地址赋给 s1所以此句到底创建了几个对象根据 abc 的情况而定abc 之前存在就是一个否则就没有创建。String s2 new String(abc) 做了什么创建了一个名为 s2 的变量(引用)如果 String池 中没有 abc 存在则在 String池 中创建一个 String 类型的 abc 有就不创建使用 new关键字 在堆中创建了一个 String 对象将用 new 创建的 String 对象的地址赋给 s2所以此句到底创建了几个对象根据 abc 的情况而定abc 之前存在就是1个不存在就是2个。栈存放基本类型的数据和对象的引用但对象本身不存放在栈中而是存放在堆中堆存放用 new 产生的数据s1 s2 与 s1.equals(s2)s1 与 s2 看着都是内容为 abc 的字符串但是使用 和 equals() 来判断它们是否相等时会发现结果并不一样。s1 s2结果为false根据上述内容我们可以知道两者虽然内容一致但是其实两者的指向的内存地址并不一致而 会检查两者的内存地址是否一致一致为true不一致为falses1.equals(s2)结果为true因为 equals() 在检查地址不相等后还会检查两者的内容两者内容相等则仍然返回true毫无疑问两者的内容是一致的。关于 String s3 abc xyz;还有一个与上述问题类似的问题就是 String s3 abc xyz; 到底创建了几个对象关于 abc 与 xyz 在上述中已经提到如果之前存在就不用创建不存在则创建。我们更需要关心的是这两个字符串的拼接。使用 拼接字符串实际是创建了一个新字符串 abcxyz(使用 号会在底层做 new StringBuilder().append(abc).append(xyz) 操作)所以至少会创建一个对象如果 abc 与 xyz 之前都不存在则就是创建3个对象如果两个中只有一个存在则是2个。关于 符号的小拓展对于 我们并不陌生但是编程语言中的 我们不能单纯的当做数学中的等号我们更习惯理解为赋值号主要赋值的东西是内存地址而不是内容本身。我们可以这样粗暴的理解当一个对象被创建出来时它可以简单的分成两部份地址与内容。当我们使用a 对象时a 得到的并不是对象的内容而是对象的地址在我们操作 a 的时候程序会通过 a(即对象的地址)来在内存中找到对象所表示的内容并对其操作。下面我们来看一个小例子String a xyz;String b a;System.out.println( a a);System.out.println( b b);a qwe;System.out.println( a a);System.out.println( b b);打印结果a xyzb xyza qweb xyz那么在这过程中发生了什么a 获取了 xyz 的内存地址a 将 xyz 的内存地址给了 b此时 a 与 b的内存地址都是指向 xyzqwe 将它的地址赋给了 a此时 a 的地址就指向 qwe但是 b 仍然指向 xyz所以 b 打印出来的值为 xyz。推荐文章