当前位置: 首页 > news >正文

操蛋的面试题(更新)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

String ww ="hello world";
String ww1 = "hello"+new String(" world");
String ww2 = "hello world";
String ww3 = "hello"+" world";
System.out.println(ww.equals(ww1));
System.out.println(ww==ww1);
System.out.println(ww==ww2);
System.out.println(ww==ww3);
true
false
true
true


谁能告诉我第二个为什么是false??

-------------------------------------------------------------------------------------------------------

华丽的分割线

-------------------------------------------------------------------------------------------------------

百度了一天,我大致总结一下:

Java内存分配:

1. 寄存器:我们在程序中无法控制
2. 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中
3. 堆:存放用new产生的数据
4. 静态域:存放在对象中用static定义的静态成员
5. 常量池:存放常量
6. 非RAM(随机存取存储器)存储:硬盘等永久存储空间

22165816_9pR6.png

String是一个特殊的包装类数据。可以用: 

String ww ="hello world";
String ww1 = new String("hello world");


两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。 
而第二种是先在栈中创建一个对String类的对象引用变量str,然后通过符号引用去字符串常量池里找有没有"hello world",如果没有,则将"hello world"存放进字符串常量池,并令str指向”hello world”,如果已经有”hello world” 则直接令str指向“hello world”。 


最烦就是这个不太理解

String ww ="hello world";
String ww1 = "hello"+new String(" world");

ww 还是常量池中"hello world”的引用,ww1因为后半部分 new String(” world”)无法在编译期确定,所以也是一个新创建对象”hello world””的引用,这是网上的说法

后面我找到javap -c 命令查看java真正生成的指令,目前没找到汇编代码:

java指令java指令

  public static void main(java.lang.String[]);
    Code:
       0: ldc           #16                 // String hello world
       2: astore_1      
       3: new           #18                 // class java/lang/StringBuilder
       6: dup           
       7: ldc           #20                 // String hello
       9: invokespecial #22                 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
      12: new           #25                 // class java/lang/String
      15: dup           
      16: ldc           #27                 // String  world
      18: invokespecial #29                 // Method java/lang/String."<init>":(Ljava/lang/String;)V
      21: invokevirtual #30                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      24: invokevirtual #34                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      27: astore_2      
      28: return        
}

ldc

将int, float或String型常量值从常量池中推送至栈顶

String ww ="hello world";

所以这个是放在常量池中的

其余的操作我YY下啊

先是从常量池中取出 "hello",然后创建一个StringBuilder,把hello作为参数放里面

StringBuilder sb = new StringBuilder("hello");

然后从常量池中取出 " world",赋值给一个String对面,

String new = new String(" world");

然后sb.append(new);

String ww1= sb.toString();

所以ww1是一个String对面的引用和ww常量池中的引用是不一样的

终于明白了,然并卵,面试失败

转载于:https://my.oschina.net/u/204616/blog/548715

相关文章:

  • 深入剖析Java中的装箱和拆箱
  • 跨平台应用——Qt VS HTML5(上)
  • Python学习之路(2017.7.15)
  • MySQL中文全文检索
  • http和scoket通信的区别
  • 使用Anaconda搭建TensorFlow-GPU环境
  • 启动Oracle时提示“ORA-00600: internal error code, argume
  • TextInputLayout 和 TextInputEditText 的简单介绍以及使用
  • golang开发环境配置及Beego框架安装
  • 面向对象编程(十二)——final关键字
  • 【Unity笔记】获得鼠标点击屏幕的位置,并转成世界坐标
  • Win7下不能查看xp系统共享的文件,解决方法
  • 加载 xib 文件 UIView
  • 最优化局部极小点的条件(二)
  • 如何从Apache官网下载windows版apache服务器
  • 时间复杂度分析经典问题——最大子序列和
  • ES2017异步函数现已正式可用
  • k8s如何管理Pod
  • k个最大的数及变种小结
  • Lucene解析 - 基本概念
  • node 版本过低
  • 关于for循环的简单归纳
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 深度学习入门:10门免费线上课程推荐
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 在electron中实现跨域请求,无需更改服务器端设置
  • MPAndroidChart 教程:Y轴 YAxis
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (2)(2.10) LTM telemetry
  • (2.2w字)前端单元测试之Jest详解篇
  • (3)选择元素——(17)练习(Exercises)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .gitignore文件设置了忽略但不生效
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net 受管制代码
  • .net反编译的九款神器
  • .net生成的类,跨工程调用显示注释
  • .NET序列化 serializable,反序列化
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @synthesize和@dynamic分别有什么作用?
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [codevs 1288] 埃及分数 [IDdfs 迭代加深搜索 ]
  • [go] 迭代器模式
  • [java] 23种设计模式之责任链模式
  • [JavaScript]_[初级]_[不使用JQuery原生Ajax提交表单文件并监听进度]
  • [LeetCode] 2.两数相加
  • [RoarCTF 2019]Easy Calc
  • [SCOI2005]繁忙的都市
  • [Spark SQL]Spark SQL读取Kudu,写入Hive
  • [SQL]mysql密码读取
  • [STL]C++ STL中常见容器的时间复杂度
  • [UVa11292] Dragon of Loowater