美文网首页程序员
Java编程语言:4道java小测试,小测试

Java编程语言:4道java小测试,小测试

作者: 启示录是真的 | 来源:发表于2018-05-23 14:23 被阅读123次

    Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

    4道java小测试

    1.Integer a=1000,b=1000; Integer c=100,d=100;

    System.out.println(a==b);System.out.println(c==d);

    false,true

    按照常理来说,这四个数都是新建的对象,应该是false才对,官方的解释是:小编推荐一个学JAVA的学习裙【 一三三,九三零,六九三】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

    由于小数使用的较多,所以把-128--127之间的数缓存了下来,这时引用的就是同一个对象,所以是false和true;

    2.

    String s1="abc";

    String s2="abc";

    String s3=new String("abc");

    System.out.println(s1==s2);

    System.out.println(s1==s3);

    结果是true,false

    我们知道:基本类型变量和对象的引用变量都是在函数的栈内存中分配的,而堆内存中则存放new出来的对象和数组,其实还有一块区域叫常量池;

    当我们创建String s1="abc";时,其实abc被存到了字符串常量池中,这样当我们再次创建Strings2="abc";时,此时的abc来自常量池。

    而new出来的字符串,abc来自常量池,但是是在堆中存储的;

    3.int[]arr1={1,2,3,4,5,6};

    int[]arr2={1,2,3,4,5,6};

    System.out.println(arr1==arr2);

    System.out.println(arr1.equals(arr2));

    false;false

    因为数组没有重写equals方法,所以和==是一样的;

    比较两个数组是否相等用Arrays.equals(arr1,arr2); true 而且此方法只能比较一层,多层嵌套的数组就不起作用了;

    深层嵌套数组的比较Arrays.deeEquals(arr1,arr2);就像下面这样,但是此方法参数必须是包装类,

    int[]arr1={1,2,3,4,5,6};

    int[]arr2={1,2,3,4,5,6};

    System.out.println(Arrays.deepEquals(arr, arr2));

    4.小编推荐一个学JAVA的学习裙【 一三三,九三零,六九三】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

    [java]

    1. public class Run {

    2.

    3. public static void main(String[] args) {

    4. // TODO Auto-generated method stub

    5. Run run=new Run();

    6. run.mRun("机器");

    7. }

    8. public void mRun(final String name){

    9. new Thread(){

    10. public void run(){

    11. try {

    12. Thread.sleep(1000);

    13. } catch (InterruptedException e) {

    14. // TODO Auto-generated catch block

    15. e.printStackTrace();

    16. }

    17. System.out.println(name);

    18. }

    19. }.start();

    20.

    21. }

    22. }

    当内部类访问局部变量时,要在局部变量前加final,不然编译器会报错,原因是什么呢?

    内部类的生命周期是成员级别的,而局部变量的生命周期是在方法体之内,

    当mRun执行时,run线程也执行,新线程会在里面睡一秒,主线程继续执行,mRun执行完毕,name属性的生命周期结束,

    1秒之后执行System.out.println(name);但是此时name已经不在内存中了,java为了杜绝这种错误,内部类使用到局部变量

    时要用final修饰,这样该变量就在内存中有一份复制品,仿佛生命周期延长了。

    5.Integer a=new Integer(1000);

    int b=1000;小编推荐一个学JAVA的学习裙【 一三三,九三零,六九三】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

    System.out.println(a==b);

    true;原因:由于是1000,所以不存在缓存问题,Integer和int比较时,会将Integer拆箱为int,所以是true;

    相关文章

      网友评论

        本文标题:Java编程语言:4道java小测试,小测试

        本文链接:https://www.haomeiwen.com/subject/iksrjftx.html