先看下面2个程序

  1. public static void main(String[] args) {
  2. String a = "a1";
  3. String b = "a" + 1;
  4. System.out.println(a == b);
  5. }
  1. public static void main(String[] args) {
  2. String a = "a1";
  3. String b = "1";
  4. String c = "a" + b;
  5. System.out.println(a == c);
  6. }

第一个程序输出是true,由于“a” 和1算是字符串常量,所以在编译期b的值就确定了,在运行期不会产生StringBuilder对象,所以在运行期,由于“a1“已经在String Pool中存在, 所以对象”a1“的引用同时指向a和b。

第二个程序中输出是false。因为在运行期才能确定"a"+b的值,所以为了提高效率,在运行期会产生一个StringBuilder对象,对它调用append方法,最后调用toString()方法,返回一个String对象的引用。

下面开始说几个面试题:

1.

  1. public static void main(String[] args) {
  2. //打印true,原因见上面分析
  3. String a = "a1";
  4. String b = "a" + 1;
  5. System.out.println(a == b);
  6. }

2

  1. public static void main(String[] args) {
  2. //打印false,原因见上面分析
  3. String a = "ab";
  4. String bb = "b";
  5. String b = "a" + bb;
  6. System.out.println(a == b);
  7. }

3.

  1. public static void main(String[] args) {
  2. //打印true,final说明bb始终指向”b“,不能把其他对象的引用给bb,所以,在编译期,bb的值是确定的,即
  3. //"a" + bb的值也是确定的,所以和上面1同理
  4. String a = "ab";
  5. final String bb = "b";
  6. String b = "a" + bb;
  7. System.out.println(a == b);
  8. }

4

  1. public static void main(String[] args) {
  2. //打印false, 简言之,就是编译期不能确定,在运行期才能确定,因此会产生StringBulder对象,通过toSring()返回一个String
  3. //的引用,肯定他a和b的内存地址是不同的。
  4. String a = "ab";
  5. final String bb = getBB();
  6. String b = "a" + bb;
  7. System.out.println(a == b);
  8. }
  9. private static String getBB() {
  10. return "b";
  11. }

5

  1. public class Test {
  2. private static String a = "ab";
  3. public static void main(String[] args) {
  4. //打印false,true, static数据放在方法区中,其他和不是static的变脸一样
  5. String s1 = "a";
  6. String s2 = "b";
  7. String s = s1 + s2;
  8. System.out.println(s == a);
  9. System.out.println(s.intern() == a);
  10. }
  11. }

分析图如下:

6

  1. public class Test {
  2. private static String a = new String("ab");
  3. public static void main(String[] args) {
  4. //打印false,false,true。分析看后面的分析图
  5. String s1 = "a";
  6. String s2 = "b";
  7. String s = s1 + s2;
  8. System.out.println(s == a);
  9. System.out.println(s.intern() == a);
  10. System.out.println(s.intern() == a.intern());
  11. }
  12. }

Java字符串面试(二)的更多相关文章

  1. Java字符串面试问答

    字符串是使用最广泛的Java的类之一.在这里,我列出了一些重要的Java的字符串面试问答. 这将有助于您全面了解String并解决面试中与String有关的任何问题. Java基础面试问题 Java中 ...

  2. Java 字符串(二)字符串常用操作

    一.连接字符串 1.连接多个字符串 使用“+”运算符可以实现连接多个字符串的功能.“+” 运算符可以连接多个运算符并产生一个 String 对象. 2.连接其他数据类型 字符串与其他基本数据类型进行连 ...

  3. JAVA基础面试(二)

    11.是否可以从一个static方法内部发出对非static方法的调用? 不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用 ...

  4. java笔试面试二

    http://www.cnblogs.com/lanxuezaipiao/p/3371224.html

  5. 面试官刁难:Java字符串可以引用传递吗?

    老读者都知道了,六年前,我从苏州回到洛阳,抱着一幅"海归"的心态,投了不少简历,也"约谈"了不少面试官,但仅有两三个令我感到满意.其中有一位叫老马,至今还活在我 ...

  6. Java基础语法<二> 字符串String

    1. 代码点与代码单元 Java字符串由char序列组成.大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示. length()方法将返回采用UTF-16编码表示 ...

  7. 为什么Java字符串是不可变对象?

    转自 http://developer.51cto.com/art/201503/468905.htm 本文主要来介绍一下Java中的不可变对象,以及Java中String类的不可变性,那么为什么Ja ...

  8. java 美团面试常见问题总

    一 基础篇 1. System.out.println(3|9)输出什么? 2. 说一下转发(Forward)和重定向(Redirect)的区别 3. 在浏览器中输入url地址到显示主页的过程,整个过 ...

  9. Java基础系列二:Java泛型

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.泛型概述 1.定 ...

随机推荐

  1. 移动端API开发

    手机APP接口   接口:客户端发送一个请求到服务器 接口:1.URL地址:http://域名/控制器/方法  或者 https://    2.test.php处理客户端发送数据    3.数据返回 ...

  2. html页面实现自动刷新的几种方法

    使用场景: 1. 页面需要定时刷新,实时加载数据(H5中的WebSocket和SSE可以实现局部刷新) 2. 一定时间之后跳转到指定页面(登录注册之类) 3. 前端开发使用伪数据调试html页面(修改 ...

  3. HTML 学习笔记 CSS3 (2D Matrix)

    Matrix 矩阵 那么什么是矩阵呢? 矩阵可以理解为方阵,只不过 平时方阵里面站着人 矩阵中是数值: CSS3中的矩阵: css3中的矩阵指的是一个方法,书写为matrix() 和 matrix3d ...

  4. ios蓝牙开发(五)BabyBluetooth蓝牙库介绍

    BabyBluetooth 是一个最简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容ios和mac osx. 特色: 基于原生CoreBluetooth框架封装的轻量级的开源库,可以帮你 ...

  5. 20145221 《信息安全系统设计基础》实验五 简单嵌入式WEB服务器实验

    20145221 <信息安全系统设计基础>实验五 简单嵌入式WEB服务器实验 实验报告 队友博客:20145326蔡馨熠 实验博客:<信息安全系统设计基础>实验五 简单嵌入式W ...

  6. 模拟MVC-WebForm实现ModelBinding

    (一) 前言                                                                           用ASP.NET MVC的时候,我们都 ...

  7. 获取图片base64编码的几种方法

    前文中我们聊了 Data URI 和 base64编码,稍微回顾下.base64编码 是将数据用 64 个可打印的字符进行编码的方式,任何数据底层实现都是二进制,所以都可以进行 base64编码,ba ...

  8. 解决服务器上 w3wp.exe 和 sqlservr.exe 的内存占用率居高不下的方案

    SQL Server是如何使用内存 最大的开销一般是用于数据缓存,如果内存足够,它会把用过的数据和觉得你会用到的数据统统扔到内存中,直到内存不足的时候,才把命中率低的数据给清掉.所以一般我们在看sta ...

  9. AJAX——核心XMLHttpRequest对象

    AJAX大家已经都知道了,是为了实现异步通讯,提高用户体验度,而将很多旧知识(XML,DOM,JavaScript,HTML,Jquery,Css……)重新融合的一个新的知识框架.而,XMLHttpR ...

  10. 54-locate 简明笔记

    在mlocate数据库中搜索条目 locate [option] pattern 参数 pattern 是locate需要搜索的文件名或者正则表达式 选项 -i              忽略大小写 ...