• 0074 几道面试题


    昨天参加了惠装网的面试,有些题不会做的,记录下来

    switch语句能否作用在byte、long、String上

    Java1.7以前:byte、short、int、char
    Java1.7开始:新增String
    因此switch语句不能作用在long上,看下面代码:

    public class Test {
        public static void main(String[] args)  {
    
            long b=126L;							//将b的类型改为byte、short、int、char都可以正常执行
            switch(b){								//b类型为long时,提示编译错误:Incompatible Types,Found"long", required "byte、short、int、char"
                case 125:
                    System.out.println("A");
                    break;
                case 126:
                    System.out.println("B");
                    break;
                case 127:
                    System.out.println("C");
                    break;
            }
        }
    }
    

    Java中如何跳出当前的多重嵌套循环

    先看代码:

    public class Test {
        public static void main(String[] args)  {
    
            lable1:for(int i=0;i<8;i++) {									//循环1
                System.out.println("i= "+i);	
                lable2:for(int j=0;j<5;j++) {								//循环2
                    System.out.println("    j= " + j);	
                    lable3:for(int m=0;m<2;m++) {							//循环3
                        if (j == 2) {
                            System.out.println("    j==2  break lable2;");
                            break lable2;									//j==2时,退出循环2,也就是上层循环
                        }
                        System.out.println("        m= " + m);
                    }
                }
            }
        }
    }
    

    break语句一般只能退出当前循环
    嵌套循环中如果要退出上面几层的循环,那得先给该层循环定义一个标签,在break语句处指定标签名即可
    注意的是,break只能退出包含了这个break语句的代码块,包括直接和间接的
    break除了可用于退出嵌套循环,实际上可用于用标签定义的代码块,比如下面这样

    public class Test {
        public static void main(String[] args)  {
    
            lable1:{
                lable2:{
                    lable3:{
                        for(int i=0;i<=3;i++) {
    
                            if (i==2) {
                                break lable2;
                            }else{
                                System.out.println("i=  " + i);
                            }
                        }
                    }
                    System.out.println("lable2的输出,不会被执行");
                }
                System.out.println("lable3的i==2,终止lable2的执行");
            }
        }
    }
    

    HashTable与HashMap的区别

    同步:HashTable的方法是同步的,而HashMap不是
    null:HashTable的key和value都不能有null,而HashMap的key可以有一个null,value可以有多个null
    遍历:HashTable和HashMap都有values()、entrySet()、keySet()方法返回key的集合进行遍历,但HashTable多了个elements()方法,可以返回Enumeration对象进行遍历
    hash值:HashTable直接使用Object的hashCode()的返回值,但HashMap还要进行一番计算
    数组大小:HashTable默认大小是11,增加方式是2*old+1; 而HashMap默认是16,成倍增加
    参考:http://blog.csdn.net/tianfeng701/article/details/7588091

    hashCode()方法的作用

    在HashMap、HashTable等集合类中,用于确定元素的存放位置,可以实现快速查找

    其他: 两个对象equals那么其hashCode一定要想等,反过来,hashCode相等,不一定equals,一个桶里可以放多个不equals的对象

    序列化接口的id有什么用

    可以将一个对象保存到硬盘或者在网络上传输,这就需要对象的序列化。
    查看Java标准库中的类,很多都有一个“serialVersionUID”的属性,比如HashMap是这样的:

    private static final long serialVersionUID = 362498820763181265L;
    

    这个serialVersionUID的作用是什么呢?
    就是为了保证对象在反序列化后的类跟序列化前的类能够兼容。谁知道一个对象序列化后多久会反序列化呢,几秒、几天还是几年,万一反序列化的时候,原来的那个类进行了很多修改呢,还能反序列化为那个类型吗?
    简单的说,这个id就是为了版本的兼容性。
    那么如何指定这个id呢?
    如果不特别指定,那系统会根据这个类的成员变量等信息计算一个hash。这种情况下,如果一个类后来增加删除了几个属性,就很可能导致反序列化的失败。因此最好还是自己指定一个id。
    是不是id相同,就一定能反序列化成功呢?不是。如果那个类进行了一些非兼容性改动,那即使id相同,也会失败。

    构造器是否能被重写

    不能。构造器不能被继承,不能被重写。可以重载

    Java中是否存在内存泄漏

    Java有垃圾回收机制,不可达对象都会被垃圾回收器自动回收,一般而言,不会出现内存泄漏,但还是有可能的。
    如果内存中存在大量的无用但可达的对象、长生命周期对象持有短生命周期对象,内存就可能会爆掉。考虑这两种情况

    1. 一个类的静态属性指向了一个集合对象,而这个对象还会持续增大。
    2. 一个单例类持有外部对象的引用,这些外部对象在这个单例类的生命期内都是可达的,如果这些外部对象特别大或者持续增长而不能减小。
  • 相关阅读:
    Ubuntu 18.04 新系统 允许root远程登录设置方法
    《软件需求》读书笔记03
    第十一周总结
    python 遍历迭代器iteration与list的区别
    第九周总结
    大学生运动情况调研计划
    系统需求分析08
    系统需求分析07
    系统需求分析06
    系统需求分析05
  • 原文地址:https://www.cnblogs.com/sonng/p/7246238.html
Copyright © 2020-2023  润新知