今天小菜去北京某知名公司面试,做了公司的面试题,然后就是轻松的面试。

面试过程中,面试官让我讲讲其中一个题是怎么选的答案,代码大致内容如下:

 public class StringTest{
public static void main(String[] args){
String str = "s"; changeStr(str); System.out.println(str); } private static void changeStr(String old){
old = old + "-change";
} }

真实的输出结果应该是s,而小菜则错误的认为是s-change,还跟面试官讲了一堆道理。

事后瞬间感觉学艺不精,羞愧难当。。。。

这个结果为什么s呢?经过查阅资料,原来是String虽然以对象的形式存在,但仍认为是基本数据类型,就像Integer、Double那样,虽然是基本类型的包装类,但仍然认为是基本数据类型。

既然认为是基本数据类型,因此无论在方法中如何操作,都不会影响到外界。

其实,换个角度,也可以发现这样是错误的。

首先,大家都知道字符串是不可改变的,简单理解即可,不做深入讨论。

当我们把字符串当成参数传入方法时,传递的是值,是一个指针,这个指针指向了堆区的真实字符串,因此在方法中可以读到这个字符串,但是仅仅是能读到而已,当我们试图做如下操作时:

str = str.replace(“a”,”b”);

后边的str中保存的是原来的指针,的确是可以读到原来的字符串,然后执行替换操作,但是替换操作执行时,绝对不可能去修改原来的字符串,因为字符串是不可变的,因此只能是在堆区产生一个新的字符串,然后把新字符串的地址(指针)赋给str。

此时str中保存的已经不再是原来的指针,因此读出的内容发生了变化,但不代表原来指针指向的内容发生了变化。

另外,小菜顺便再补充一个知识点。

关于Integer i = 1;和Integer i = new Integer(1);的区别。

Integer i = 1;会直接从常量池中找到1,然后把地址赋给i,这样充分利用常量池,节省内存,注意除了字符串,其他类型的常量池都是有范围的,超范围了失效。

Integer i = new Integer(1);这样写,写多少次,就在内存中创建多少个对象,每个对象里都保存了一个数字1,因此这样是极其浪费内存的,不推荐使用。

常量池是保存在堆中的。

小菜水平有限,不当之处多多包涵!

一道印象深刻的面试题:String参数传递问题的更多相关文章

  1. 9个让人印象深刻的网站 JS 视觉效果

    网页设计已经提升到一个整体新的水平,Flash 渐渐失去了地位,逐渐被 HTML/JavaScript/CSS 所超越,而且一样可以实现出 Flash 复杂的特效. 本文介绍 8 个让人印象深刻的网站 ...

  2. Skytte:一款令人印象深刻的 HTML5 射击游戏

    Skytte 是一款浏览器里的 2D 射击游戏.使用 Canvas 元素和大量的 JavaScript 代码实现.Skytte 是用我们的开源和现代的前端技术创造的.经典,快节奏的横向滚动射击游戏,探 ...

  3. OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)

    摘要 本文先给出一个看似很简单实则有深意的Java笔试面试题,引出JDK内部的缓存. JDK内部的缓存,主要是为了提高Java程序的性能. 你能答对这道"看似简单,实则有深意"的J ...

  4. 从一道看似简单的面试题重新理解JS执行机制与定时器

     壹 ❀ 引 最近在看前端进阶的系列专栏,碰巧看到了几篇关于JS事件执行机制的面试文章,因为我在之前一篇 JS执行机制详解,定时器时间间隔的真正含义 博文中也有记录JS执行机制,所以正好用于作为测试自 ...

  5. 那晚征服的一道js经典的面试题

    今天朋友共享了一道js中经典的面试题,需求是这样的 给定你任意一个字符串,让你写出一个算法,求算出该字符串中出现次数最多的一个字符,并将其结果输出 刚拿到这道题的第一感觉便是定义一个count计时器, ...

  6. 印象深刻的bug

    测试中测到一个印象比较深刻的bug,问题出现在web端的电商平台,展示商品的时候每点击一个商品相应的url=~/productid.html,如果知道productid可以直接在url输入跳转到商品详 ...

  7. 一道百度的java面试题的几种解法

    考试结束,班级平均分只拿到了年级第二,班主任于是问道:大家都知道世界第一高峰珠穆朗玛峰,有人知道世界第二高峰是什么吗?正当班主任要继续发话,只听到角落默默想起来一个声音:”乔戈里峰” 前言 文章出自: ...

  8. C++学习笔记(9)----关于变量和数组大小的一道容易出错的面试题

    一道容易出错的C++笔试题 求下面代码的输出内容: int main(int argc,char* argv[]) { char str1[]="Hello"; char* str ...

  9. 一道简单的JavaScript面试题

    好久没更新博客了,随便写点东西吧. 自从工作之后就特别忙,忙的过程中有时候挺迷茫的,可能是大多数时候写的都是简单的业务代码,很久没好好充电了.最近一直在零碎的上班路上等电梯时间里面学习<图解HT ...

随机推荐

  1. C语言基础_2

    scanf函数可以从键盘上读取数据并记录到变量中.为了使用这个函数也需要在文件开头使用如下的预处理指令#include <stdio.h>scanf函数使用的时候所需要的初始数据和prin ...

  2. ORACLE恢复数据

    ORACLE恢复删除表或表记录 一:表的恢复      对误删的表,只要没有使用PURGE永久删除选项,那么从flash back区恢复回来希望是挺大的.一般步骤有: 1.从flash back里查询 ...

  3. Spark-1.0.1 的make-distribution.sh编译、SBT编译、Maven编译 三种编译方法

    fesh个人实践,欢迎经验交流!本文Blog地址:http://www.cnblogs.com/fesh/p/3775343.html 本文编译方法所支持的hadoop环境是Hadoop-2.2.0, ...

  4. INNO SETUP 5.5.0以上版本中文语言包

    ; *** Inno Setup version 5.5.0+ Chinese messages ***;; To download user-contributed translations of ...

  5. BES

    自主开发一套消息中间件系统. 需求: 1.保证能在大规模分布式环境下发送接收消息. 2.消息发送者(Producer)能够简单.容易的发送Event. 3.所有的Event都能被注册监听该Event的 ...

  6. 【MVC】 js,css 压缩

    [MVC] js,css 压缩 一. 引用 System.Web.Optimization.dll : 使用 Nuget ,在控制台输入 Install-Package Microsoft.AspNe ...

  7. CF(协同过滤算法)

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  8. UVA 753 A Plug for UNIX(二分图匹配)

    A Plug for UNIX You are in charge of setting up the press room for the inaugural meeting of the Unit ...

  9. DB2 UDB DBA 核对清单

    本文摘自 http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0404snow/index.htmlDB2 UDB ...

  10. POJ2309 -- BST

    找找规律,实际上是二分查找的过程,只要找到了mid与输入的n相同的话,直接输出left和right就可以了. 代码如下: #include <iostream> using namespa ...