由一道面试题说开去:程序输出结果是good and gbc

Java测试题2答案 《Java测试题2》<br><br>一、 选择<br>1.欲构造ArrayList类的一个实例,此类继承了List接口,下列哪个方法是正确的 ? B<br>A ArrayList myList=new Object();<br>B List myList=new ArrayList();<br>C ArrayList myList=new List();<br>D List myList=new List();<br>2.paint()方法使用哪种类型的参数? A<br>A Graphics<br>B Graphics2D<br>C String<br>D Color<br>3.指出正确的表达式 D<br>A byte=128;<br>B Boolean=null;<br>C long l=0xfffL;<br>D double=0.9239d;<br>4.指出下列程序运行的结果 D<br>public class Example{<br>String str=new String("good");<br>char[]ch={'a','b','c'};<br>  public static void main(String args[]){<br>    Example ex=new Example();<br>    ex.change(ex.str,ex.ch);<br>    System.out.print(ex.str+" and ");<br>    Sytem.out.print(ex.ch);<br>  }<br>  public void change(String str,char ch[]){<br>    str="test ok";<br>    ch[0]='g';<br>  }<br>}<br>A good and abc<br>B good and gbc<br>C test ok and abc<br>D test ok and gbc<br>5.运行下列程序, 会产生什么结果 B<br>public class X extends Thread implements Runable{<br> public void run(){<br>  System.out.println("this is run()");<br> }<br> public static void main(String args[])<br> {<br>  Thread t=new Thread(new X());<br>  t.start();<br> }<br>}<br>A 第一行会产生编译错误B 第六行会产生编译错误C 第六行会产生运行错误D 程序会运行和启动6.要从文件" file.dat"文件中读出第10个字节到变量C中,下列哪个方法适合? A<br>A FileInputStream in=new FileInputStream("file.dat"); in.skip(9); int c=in.read();B FileInputStream in=new FileInputStream("file.dat"); in.skip(10); int c=in.read();C FileInputStream in=new FileInputStream("file.dat"); int c=in.read();D RandomAccessFile in=new RandomAccessFile("file.dat"); in.skip(9); int c=in.readByte();7.容器被重新设置大小后,哪种布局管理器的容器中的组件大小不随容器大小的变化而改变? B<br>A CardLayoutB FlowLayout<br>C BorderLayout<br>D GridLayout<br>8.给出下面代码: C<br>public class Person{<br>  static int arr[] = new int[10];<br><br>  public static void main(String a[])<br>  {<br>   System.out.println(arr[1]);<br>  }<br>}<br>那个语句是正确的?<br>A 编译时将产生错误;<br>B 编译时正确,运行时将产生错误;<br>C 输出零;<br>D 输出空。<br>9.哪个关键字可以对对象加互斥锁? B<br>A transient<br>B synchronized<br>C serialize<br>D static<br>10.下列哪些语句关于内存回收的说明是正确的? B<br>A 程序员必须创建一个线程来释放内存;<br>B 内存回收程序负责释放无用内存<br>C 内存回收程序允许程序员直接释放内存<br>D 内存回收程序可以在指定的时间释放内存对象<br>11.下列代码哪几行会出错: c<br>1) public void modify() {<br>2) int I, j, k;<br>3) I = 100;<br>4) while ( I > 0 ) {<br>5) j = I * 2;<br>6) System.out.println (" The value of j is " + j );<br>7) k = k + 1;<br>8) I--;<br>9) }<br>10) }<br>A line 4<br>B line 6<br>C line 7<br>D line 8<br>二、多项选择<br>1.执行下列代码后,哪个结论是正确的 String[] s=new String[10]; BD<br>A s[10] 为 "";<br>B s[9] 为 null;<br>C s[0] 为 未定义<br>D s.length 为10<br>2.下面的表达式哪个是正确的?AE<br>A String s="你好";int i=3; s+=i;<br>B String s="你好";int i=3; if(i==s){ s+=i};<br>C String s="你好";int i=3; s=i+s;<br>D String s="你好";int i=3; s=i+;<br>E. String s=null; int i=(s!=null)&&(s.length>0)?s.length():0;<br>3.选出合理的标识符AC<br>A _sys1_lll<br>B 2mail<br>C $change<br>D class<br>4.哪个布局管理器使用的是组件的最佳尺寸( preferred size) AE<br>A FlowLayout<br>B BorderLayout<br>C GridLayout<br>D CardLayout<br>E.GridBagLayout<br>5.下列哪个方法可用于创建一个可运行的类?AE<br>A public class X implements Runable{ public void run(){ ......} }<br>B public class X implements Thread{ public void run(){ ......} }<br>C public class X implements Thread{ public int run(){ ......} }<br>D public class X implements Runable{ protected void run(){ ......} }<br>E.public class X implements Thread{ public void run(){ ......} }<br>6.下面哪个方法可以在任何时候被任何线程调用?DEF<br>A notify()<br>B wait()<br>C notifyAll()<br>D sleep()<br>E.yield()<br>F.synchronized(this)<br>7.构造BufferedInputStream的合适参数是哪个? AC<br>A BufferedInputStream<br>B BufferedOutputStream<br>C FileInputStream<br>D FileOuterStream<br>E. File<br>8.下列说法正确的是 BC<br>A java.lang.Clonable是类<br>B java.lang.Runnable是接口<br>C Double对象在java.lang包中<br>D Double a=1.0是正确的java语句<br>9.指出正确的表达式AB<br><br>B Double a=new Double(1.0);<br>C byte a = 340;<br>D Byte a = 120;<br>10.定义一个类名为"MyClass.java"的类,并且该类可被一个工程中的所有类访问,那么该类的正确声明应为:CD<br>A double a=1.0;<br>A private class MyClass extends Object<br>B class MyClass extends Object<br>C public class MyClass<br>D public class MyClass extends Object<br>11.指出下列哪个方法与方法public void add(int a){}为合理的重载方法。 CD<br><br><br>A public int add(int a)<br>B public void add(long a)<br>C public void add(int a,int b)<br>D public void add(float a)<br>12.如果下列的方法能够正常运行,在控制台上将显示什么? ACD<br><br>public void example(){<br>  try{<br>    unsafe();<br>    System.out.println("Test1");<br>    }<br>    catch(SafeException e)<br>    {System.out.println("Test 2");}<br>  finally{System.out.println("Test 3");}<br>  System.out.println("Test 4");<br>}<br>A Test 1<br>B Test 2<br>C Test 3<br>D Test 4<br>13.下列哪些情况可以终止当前线程的运行? ABD<br>A 抛出一个例外时。<br>B 当该线程调用sleep()方法时。<br>C 当创建一个新线程时。<br>D 当一个优先级高的线程进入就绪状态时。<br>三、 填空题<br>1.执行下列代码后的结果是什么? int x,a=2,b=3,c=4; x=++a+b+++c++;<br>2. 包包含了Collection的接口和类的API<br>.main方法的声明格式包括<br>4.下列程序中构造了一个SET并且调用其方法add(),输出结果是<br>public class A{<br>public int hashCode(){return 1;}<br>public Boolean equals(Object b){return true}<br>public static void main(String args[]){ Set set=new HashSet();<br>set.add(new A());<br>set.add(new A());<br>set.add(new A());<br>System.out.println(set.size());<br>}<br>}<br>5.下列程序的运行结果是<br>class A{<br>class Dog{<br>  private String name;<br>  private int age;<br>  public int step;<br>  Dog(String s,int a){<br>   name=s;<br>   age=a;<br>   step=0;<br>   }<br>  public void run(Dog fast){<br>  fast.step++;<br>  }<br>}<br><br>  public static void main (String args[]){<br>  A a=new A();<br>  Dog d=a.new Dog("Tom",3);<br>  d.step=25;<br>  d.run(d);<br>  System.out.println(d.step);<br>  }<br>}<br><br>答案::填空第1题<br>x=10,a=3,b=4,c=5<br>填空第2题<br>java.util<br>填空第3题<br>(public )(static )(void)(main)(String args[])<br>填空第4题<br>1<br>填空第5题<br> 立即下载

这道面试题是这样子的:

public class Example {
    String str = "good";
    char[] ch ={'a','b','c'};

    public static void main(String[] args) {
        Example ex = new Example();
        ex.change(ex.str, ex.ch);
        System.out.print(ex.str + " and ");
        System.out.print(ex.ch);
    }

    public void  change(String str,char ch[]){
        str = "test ok";
        ch[0] = 'g';
    }
}

先公布答案再来分析为什么是这个结果。

程序输出结果是:good and gbc

已经有很多网友从String的不可变性以及Java的值传递等进行了解释,这里直接通过看画出程序执行过程中的JVM内容情况,来解释为什么str没改变而ch改变了。

  1. 执行Example ex = new Example(); 后没有执行方法change之前的内存情况如下图:

    [外链图片转存失败(img-h5jrB4MP-1564044090325)(https://s2.ax1x.com/2019/07/25/eeMKdf.png)]

  2. 在执行ex.change(ex.str,ex.ch)后,没有执行 str="test ok"之前时内存情况如下:

    eeMWTK.png

  3. 在执行完change方法中ch[0]='g’后,方法没有退出之前,内存情况如下:

    eeQmp4.png

  4. 在调用完change方法后,执行输出语句时,内存情况如下:

    eelCCD.png

注:JDK1.7后运行时常量池位于堆中,但是不影响最终的输出。

这道面试题的另一个版本可能是:

public class Example {
    String str = new String("good");
    char[] ch ={'a','b','c'};

    public static void main(String[] args) {
        Example ex = new Example();
        ex.change(ex.str, ex.ch);
        System.out.print(ex.str + " and ");
        System.out.print(ex.ch);
    }

    public void  change(String str,char ch[]){
        str = "test ok";
        ch[0] = 'g';
    }
}

唯一区别在于程序第二行创建str时用的是new String(“good”)。

程序的输出结果仍然是:good and gbc

内存情况的区别在于:

ee1Mo6.png

也就是用new String(“good”)的方式创建str时,是在常量池中创建了“good”的字符串常量(类加载时),并且在堆中分配了一块空间保存String对象,内容是“good"(运行时).

如果修改下change中代码,将str = "test ok"修改为this.str = “test ok”,则程序输出结果为:test ok and gbc

原因是:

  1. this返回的是当前调用对象的引用,其实也就是ex的引用,所以this.str就等价于ex.str。

  2. 注意change方法的两个参数str与ch都只是形参,是局部变量,在方法调用返回后局部变量的生命周期就结束了。

既然谈到了字符串,就看下另一段程序的输出结果:

public class TestString {

    public static void main(String[] args) {
       	String  a = "张三";
        String  b = "张";
        String  c = "三";
        String  d = b + c;
        System.out.println(a == d);
        String e = "张" + "三";
        String f = "张" + c;
        System.out.println(a == e);
        System.out.println(a == f);
        System.out.println(d == f);
    }
}

输出结果:

false
true
false
false

这是因为这段代码在编译时即可确认e是字符串常量“张三”,而对于d或f,因为使用“+”拼接字符串引用变量,实际在运行时会在底层调用new StringBuilder().append()方法实现字符串拼接,所以每次拼接都会创建StringBuilder的临时变量,存放于Java堆中。每次都是新创建的StringBuilder对象,其地址自然不一样。

对TestString.class反编译可以看到:
在这里插入图片描述

String e在编译时即指向了与a同样的字符串常量。

至于+号拼接字符串引用变量底层调用new StringBuilder().append()可以通过javap命令,查看程序运行时的汇编指令:

javap -c -l TestString

eeJKje.png

STM32F103C8T6实战指南:从零搭建最小系统与GPIO控制 本文详细介绍了STM32F103C8T6微控制器的实战应用,从零开始讲解如何搭建最小系统并进行GPIO控制。内容涵盖电源电路设计、时钟配置、GPIO工作模式详解及实战项目开发,帮助初学者快速掌握这款ARM Cortex-M3内核微控制器的核心开发技能,适用于物联网设备和嵌入式系统开发。 阅读详情

相关推荐

GPU运维面试题

【代码】GPU运维面试题。

u011220233的博客 699

Java基础题

题目:指出下面程序运行的结果是 结果:good and gbc这道题从内存模型来进行分析: 1)当代码执行到 Example ex = new Example(); 这句语句时,解释:ex作为对象引用保存在栈帧内的局部变量表内,指向在堆中的对象实例,而该对象内的成员str、ch分别指向堆中分配的另外两个对象实例(new String(“good”)、以及数组,数组和对象实例在堆中分配) 2)当主线程代码执行到ex.change(ex.str, ex.ch);这段代码,change方法执行,对应栈帧在主线程栈

weixin_45908296的博客 585

HarmonyOS NEXT 开发者预览版Beta招募应知测试

本次HarmonyOS NEXT 开发者预览版 Beta 招募活动为开发者预览版尝鲜升级,主要供开发者进行应用调测使用,除部分系统应用外,其他所有应用将被清除,因此在进行HarmonyOS NEXT 开发者预览版升级前,需进行数据备份。通过应知测试,并提交了参加HarmonyOS NEXT 开发者预览版招募 Beta 活动的报名信息,就会立刻审核通过并且收到新版本。手机在参加HarmonyOS NEXT 开发者预览版 Beta 招募活动前,需要对应机型升级到招募要求对应的基线版本,并预留内存空间。

长久公子的博客 8649

经典形参问题good and gbc

//指出以下程序运行的结果是 public class Example{ String str=new String("good"); char[]ch={'a','b','c'}; public static void main(String args[]){ Example ex=new Example(); ex.change(ex.str,ex.ch); System.out.print(ex.str+".

weixin_42338707的博客 939

深入了解神经网络:构建人工智能的基石

这篇博客将为您解释神经网络的构造,让您能够理解这个令人着迷的领域的基本工作原理。神经网络是人工智能领域的关键技术,它们的构造基于神经元的灵感,并结合了数学、统计和机器学习的原理。输入可以类比为神经元的树突,而输出可以类比为神经元的轴突,计算则可以类比为细胞核。较好的方法就是预先设定几个可选值,通过切换这几个值来看整个模型的预测效果,选择效果最好的值作为最终选择。:这是神经网络的核心部分,包含多个层次的神经元。、神经网络结构图中的拓扑与箭头代表着预测过程时数据的流向,跟训练时的数据流有一定的区别;

AI_dataloads的博客 2万+

Xilinx HydraMini试玩教程

HydraMini是Xilinx推出的基于Pynq-Z2开发板的自动驾驶开发小车,其有着简单易学、高灵活性、高扩展性、高性能等优良特性,是研究人员和学生进入自动驾驶领域的一个平台。本教程会通过最基础的讲解和步骤带领读者熟悉这个平台的基本开发流程。

qq_25762163的博客 1773

java定义string变量赋值吗_java中String类型变量的赋值问题

第一节 String类型的方法参数运行下面这段代码,其结果是什么?package com.test;public class Example {String str = new String("good");char[] ch = { 'a', 'b', 'c' };public static void main(String[] args) {Example ex = new Example()...

weixin_39738755的博客 1222

产品竞争策略方法论:构建“差异化 + 结构化 + 系统化”的竞争优势

本文系统探讨了IoT产品竞争策略,指出当前企业普遍存在硬件能力强但商业竞争能力不足的问题。文章构建了五层竞争模型(产品层、体验层、服务层、数据层、生态层),提出五大核心竞争策略(成本领先、差异化竞争、聚焦竞争、生态竞争、数据驱动竞争),并详细阐述了差异化设计方法。通过行业案例分析(小米、苹果、特斯拉)和五步落地方法,强调从硬件竞争向系统优势转变的重要性。文章指出IoT竞争胜负关键在后半场的数据运营和服务延伸,建议企业通过构建差异化能力、完善服务体系、建立数据体系、逐步构建生态来避免价格战陷阱,实现从跟随到领

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 360

java中程序输出为什么是good and gbc 而不是test ok and gbc

指出下列程序运行的结果() public class Example{ String str = new String("good"); char[ ] ch = { 'a' , 'b' , 'c' }; public static void main(String args[]){ Example ex = new Example(); ...

越来越好ing的博客 2934

Vue2 - 详细实现安装西瓜视频 xgplayer 插件详细配置及使用教程,利用西瓜视频播放器播放 mp4、flv、hls 格式视频文件及视频推流(直播或监控摄像头画面),支持移动端H5及PC网站!

vue2,nuxt2,西瓜视频,xgplayer,插件组件,xgplayer-hls,xgplayer-flv,xgplayer-mp4,播放视频点播和直播视频流,自定义播放器样式,截屏,监控视频,vue使用西瓜播放器播放flv、hls、mp4视频,截屏按钮,直播流,报错,黑屏,加载失败,苹果ios不兼容,重连,怎么改样式,很卡,详细教程,监控实时播放推流,倍速播放,在线flv在线推流地址,HLS播放,vue西瓜播放器,vue如何使用西瓜视频插件做直播推流回流,视频点播,flv在线视频流播放,截图功能,利用

🏆 前端领域优质创作者 1万+

【Power Compiler手册】13.UPF多电压设计实现(2)

在这个场景中,在约束传播期间,工具会比较BLOCK中的原子电源域与TOP设计中的原子电源域,并且确认所有属性都匹配。因此,域合并成功,工具会丢弃来自BLOCK的域。在这个场景中,在约束传播期间,工具会比较BLOCK中的原子电源域与TOP设计中的非原子电源域,发现电源域不匹配。在这个场景中,在约束传播期间,工具会比较BLOCK中的非原子电源域与TOP设计中的原子电源域,发现电源域不匹配。在这个场景中,在约束传播期间,工具会比较BLOCK中的原子电源域与TOP设计中的原子电源域,发现它们的一些属性不匹配。

QRBQ 750

java程序题解析:good and gbc

程序如下:public class GoodAndGbc { String str = new String("good"); char[] ch = { 'a', 'b', 'c' }; public static void main(String[] args) { GoodAndGbc t = new GoodAndGbc(); t.chan

zhangbinu 1288

【HEC】HECRAS中的降雨边界

网格降雨可能是城市地区建模的一个好选择。这是因为传统的一维(1D)建模并不能完全捕捉城市地区通常出现的复杂流动模式。使用网格降雨建模方法在构建包含多个未定义流动路径的模型时也非常有用。对于流量分支非常复杂的水道,设定边界条件可能会很困难。 HECRAS提供两种降雨边界添加的方法 - 在指定SA/2D FLOW AREA添加降雨边界 - 在hec-ras 6.0以上版本中 “气象数据” 的选项卡,可以添加具有空间变化的降水量、蒸散量和风。 两种方法只能选择一种,以下分别介绍

```On Earth, Be Water, By Coding``` 1399

java面试题good and gbc

面试中碰到一个题   public class Example { String str = new String("good"); char[] ch = { 'a', 'b', 'c' }; public static void main(String[] args) { Example ex = new Example(); e

提升心智 2758

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java面试题之为什么输出结果会是 good and gbc?

题目如下,求输出结果:(从内存情况分析)public class Example { String str=new String ("good"); //String str 时,把str引用放在栈空间,值为null,当new String 时,在堆空间生成一个 good,并且Str指向它 char[] ch={'a','b','c'}; //char[]ch 时,把ch引用放在栈空间,在堆...

Lingbulei的博客 1168

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

java gbc_java面试题good and gbc

面试中碰到一个题public class Example{String str = new String("good");char[] ch = { 'a', 'b', 'c' };public static void main(String[] args) {Example ex = new Example();ex.change(ex.str, ex.ch);System.out.print...

weixin_29110051的博客 310

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

一道及易掉坑常见的关于值传递的面试题

快到坑里来

一个平平无奇的攻城狮 3378

对于笔试题--“good and abc”的理解

今天朋友问了一个面试题,题目如下: public class Example{   String str=new String("good");   char[]ch={'a','b','c'};   public static void main(String args[]){     Example ex=new Example();     ex...

diaoxun2304的博客 367

Java三十个常见面试题总结

这篇Java面试题解析涵盖了多个核心知识点: 类初始化顺序:静态代码块→构造代码块→构造函数,父类优先于子类执行。 异常处理:多个catch块按顺序匹配,IOException会优先匹配自身而非父类Exception。 变量初始化:局部变量必须初始化才能使用,否则编译不通过。 字符串拼接:"5"+2会输出字符串"52"。 参数传递:Java只有值传递,String类型按值传递,数组按引用传递。 抽象类规则:可以包含抽象方法和实现方法,但不能实例化。 序列化:trans

2401_89221867的博客 1059

Java_内存管理String and Array

题目1.指出下列程序运行的结果()public class Example { String str = new String("good"); char[] ch = { 'a', 'b', 'c' }; public static void main(String args[]) { Example ex = new Examp...

weixin_30539835的博客 101

一个java面试题引发的思考

一个java面试题引出的JVM思考。

ck1600259860的博客 797

Java面试题带答案-基础知识考察

java面试题 一,指出下面程序的运行结果 class A { static { System.out.print(“1”); } public A() { System.out.print(“2”); } } class B extends A{ static { System.out.print(“a”); } public B() { System.out.print(“b”); } } public class Hello { public static void main(String[] arg

大团猿的博客 573

java面试题总结(三)----本文都是笔试题,值得学习

1. 下面哪些是Thread类的方法() A start() B run() C exit() D getPriority() 答案:ABD 解析:看Java API docs吧:http://docs.oracle.com/javase/7/docs/api/,exit()是System类的方法,如System.exit(0)。 2. 下面关于j...

ywl470812087的博客 11万+

Java基础笔试练习(一)

即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!

ghfgjfg679的博客 221

JAVA面试题(1)

1.新建一个流对象,下面哪个选项的代码是错误的?(B) A)new BufferedWriter(new FileWriter("a.txt")); B)new BufferedReader(new FileInputStream("a.dat")); C)new GZIPOutputStream(new FileOutputStream("a.zip")); D)new Ob...

weixin_34417183的博客 412

练习(五)(Java)

1、 下面的程序 编译运行后,在屏幕上显示的结果是(A 0) public class test { public static void main(String args[]) { int x,y; x=5>>2; y=x>>>2; System.out.println(y); } } A 0 B 2 C 5 D 80 几种移位运算符(运行结果都是按16进制打印的): (1)左移 <<: 左侧位不要了, 右侧补

zz070的博客 253
上一篇: SpringCloud与Docker微服务架构实战读书笔记(四)
下一篇: 此安装程序必须使用 Java 开发工具包 (JDK) 执行, 但 C:\Program Files\Java\jre1.8.0_172 不是有效的 JDK Java 主目录。
yplovezz
博客等级 码龄16年 40粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值