Java字符串面试(二)
先看下面2个程序
- public static void main(String[] args) {
- String a = "a1";
- String b = "a" + 1;
- System.out.println(a == b);
- }
- public static void main(String[] args) {
- String a = "a1";
- String b = "1";
- String c = "a" + b;
- System.out.println(a == c);
- }
第一个程序输出是true,由于“a” 和1算是字符串常量,所以在编译期b的值就确定了,在运行期不会产生StringBuilder对象,所以在运行期,由于“a1“已经在String Pool中存在, 所以对象”a1“的引用同时指向a和b。
第二个程序中输出是false。因为在运行期才能确定"a"+b的值,所以为了提高效率,在运行期会产生一个StringBuilder对象,对它调用append方法,最后调用toString()方法,返回一个String对象的引用。
下面开始说几个面试题:
1.
- public static void main(String[] args) {
- //打印true,原因见上面分析
- String a = "a1";
- String b = "a" + 1;
- System.out.println(a == b);
- }
2
- public static void main(String[] args) {
- //打印false,原因见上面分析
- String a = "ab";
- String bb = "b";
- String b = "a" + bb;
- System.out.println(a == b);
- }
3.
- public static void main(String[] args) {
- //打印true,final说明bb始终指向”b“,不能把其他对象的引用给bb,所以,在编译期,bb的值是确定的,即
- //"a" + bb的值也是确定的,所以和上面1同理
- String a = "ab";
- final String bb = "b";
- String b = "a" + bb;
- System.out.println(a == b);
- }
4
- public static void main(String[] args) {
- //打印false, 简言之,就是编译期不能确定,在运行期才能确定,因此会产生StringBulder对象,通过toSring()返回一个String
- //的引用,肯定他a和b的内存地址是不同的。
- String a = "ab";
- final String bb = getBB();
- String b = "a" + bb;
- System.out.println(a == b);
- }
- private static String getBB() {
- return "b";
- }
5
- public class Test {
- private static String a = "ab";
- public static void main(String[] args) {
- //打印false,true, static数据放在方法区中,其他和不是static的变脸一样
- String s1 = "a";
- String s2 = "b";
- String s = s1 + s2;
- System.out.println(s == a);
- System.out.println(s.intern() == a);
- }
- }
分析图如下:

6
- public class Test {
- private static String a = new String("ab");
- public static void main(String[] args) {
- //打印false,false,true。分析看后面的分析图
- String s1 = "a";
- String s2 = "b";
- String s = s1 + s2;
- System.out.println(s == a);
- System.out.println(s.intern() == a);
- System.out.println(s.intern() == a.intern());
- }
- }

Java字符串面试(二)的更多相关文章
- Java字符串面试问答
字符串是使用最广泛的Java的类之一.在这里,我列出了一些重要的Java的字符串面试问答. 这将有助于您全面了解String并解决面试中与String有关的任何问题. Java基础面试问题 Java中 ...
- Java 字符串(二)字符串常用操作
一.连接字符串 1.连接多个字符串 使用“+”运算符可以实现连接多个字符串的功能.“+” 运算符可以连接多个运算符并产生一个 String 对象. 2.连接其他数据类型 字符串与其他基本数据类型进行连 ...
- JAVA基础面试(二)
11.是否可以从一个static方法内部发出对非static方法的调用? 不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用 ...
- java笔试面试二
http://www.cnblogs.com/lanxuezaipiao/p/3371224.html
- 面试官刁难:Java字符串可以引用传递吗?
老读者都知道了,六年前,我从苏州回到洛阳,抱着一幅"海归"的心态,投了不少简历,也"约谈"了不少面试官,但仅有两三个令我感到满意.其中有一位叫老马,至今还活在我 ...
- Java基础语法<二> 字符串String
1. 代码点与代码单元 Java字符串由char序列组成.大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示. length()方法将返回采用UTF-16编码表示 ...
- 为什么Java字符串是不可变对象?
转自 http://developer.51cto.com/art/201503/468905.htm 本文主要来介绍一下Java中的不可变对象,以及Java中String类的不可变性,那么为什么Ja ...
- java 美团面试常见问题总
一 基础篇 1. System.out.println(3|9)输出什么? 2. 说一下转发(Forward)和重定向(Redirect)的区别 3. 在浏览器中输入url地址到显示主页的过程,整个过 ...
- Java基础系列二:Java泛型
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.泛型概述 1.定 ...
随机推荐
- [No00002B]知乎精选:如果兔子都在拼命奔跑,乌龟该如何前进
最近看到友人分享的一篇好文章,看了不下三遍,想开了很多的事情…… 在这个世界上永远存在一些比你更加牛的人,无论什么方面.如果把人生比作攀登,也许你穷其一生可以达到一定的高度,但对某些人来说珠峰都不成问 ...
- Android图片异步加载框架Android-Universal-Image-Loader
版权声明:本文为博主原创文章,未经博主允许不得转载. Android-Universal-Image-Loader是一个图片异步加载,缓存和显示的框架.这个框架已经被很多开发者所使用,是最常用的几个 ...
- 机器学习实战--logistic回归
#encoding:utf-8 from numpy import * def loadDataSet(): #加载数据 dataMat = []; labelMat = [] fr = open(' ...
- Mysql备份系列(1)--备份方案总结性梳理
mysql数据库备份有多么重要已不需过多赘述了,废话不多说!以下总结了mysql数据库的几种备份方案: 一.binlog二进制日志通常作为备份的重要资源,所以再说备份方案之前先总结一下binlog日志 ...
- 树莓派B+安装archlinux arm版
按Archlinux官网操作而来,如有疑问参照官网:http://archlinuxarm.org/platforms/armv6/raspberry-pi 以我自己安装过程举例,我的SD卡挂载在ub ...
- header
本文分享几个php header函数的例子,有需要的朋友参考学习下. 转自:http://www.jbxue.com/article/php_header_x5hV63c.html 1,可以使用hed ...
- 032医疗项目-模块三:药品供应商目录模块——供货商药品目录查询功能----------Service层和Action层和调试
我们上一篇文章讲了Dao层代码: 这一篇我们讲解Service层和Action层: Service层: 分为接口和实现类,我们主要看实现类:GysemplServiceImpl package yyc ...
- Cordova - 使用Cordova开发iOS应用实战1(配置、开发第一个应用)
Cordova - 使用Cordova开发iOS应用实战1(配置.开发第一个应用) 现在比较流行使用 html5 开发移动应用,毕竟只要写一套html页面就可以适配各种移动设备,大大节省了跨平台应用的 ...
- CoffeeScript的类继承的工具函数extends
__hasProp = {}.hasOwnProperty, __extends = function(child, parent) { // 派生类时,如果基类的类属性值是对象,那么子类的类属性只是 ...
- 学习C++.Primer.Plus 5 循环和关系表达式
C++将赋值表达式的值定义为左侧成员的值 赋值操作符是自右向左结合的 cout.setf(ios:: boolalpha);//调用设置标记,命令cout输出true或false,而非1或0. 任何表 ...