每日十道面试题(一)

By | 03月07日
Advertisement

1. 谈谈final,finally,finalize的区别

  1. final(修饰词):

    如果一个类被声明为final,那么这个类无法被继承,所以一个类无法同时既是abstract的,也是final的,如果使用final修饰方法或者变量,可以保证它们不会被修改,但是需要注意的是引用类型的变量final对其引用生效,比如数组int []a,对于数组a,a为对整个数组的引用,但是可以修改a[0]之类的值。被声明为final的方法不可以被重载。

        final Test test = new Test(3);
           System.out.println("data = " + test.getA());
           test.setA(5);
           System.out.println("data = " + test.getA());

    结果:

    data = 3

    data = 5

  2. finally(异常处理部分):

    在异常处理的时候,finally用于执行任何清除操作,在异常处理的时候,无论怎样,最后都会经历finally流程,所以如果在try中返回一个值,finally中返回一个值,finally中的返回值会覆盖之前的返回值。

  3. finalize(方法名):

    finalize是Object中的基本方法(toString,hashCode,wait,notify,notifyAll,getClass,equals),该方法用于在垃圾回收器将对象回收之前做必要的清理工作,这个方法是在垃圾收集器确定对象没有被引用时对这个对象调用的。

2. Anonymous Inner Class(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)

匿名的内部类是没有名字的内部类,不能继承其它类,但一个内部类可以作为一个接口,由另一个内部类实现。

public class Test {
    class Demo1{
        public void print(){
            System.out.println("内部类1");
        }
    }

    public void print(){
        new Demo1(){
            @Override
            public void print() {
//                super.print();
                System.out.println("内部类2");
            }
        }.print();
    }
}

3. Static Nested Class 和 Inner Class的不同

Static Nested Classes(静态嵌套类): 就是用static修饰的成员嵌套类,创建一个静态嵌套类的对象,不需要一个外部类的对象,不能从一个静态内部类的一个对象访问一个外部类的对象。

InnerClass:静态嵌套类之外所有的嵌套类的总称,也就是没有用static定义的nested class,Inner Class 不能定义为static,不能有static方法和static初始化语句块。

4. &和&&的区别

&是按位与,&&是布尔逻辑与。&&有短路性

5. HashMap和HashTable的区别

都实现了Map接口的类,实现了将唯一键映射到特定值上。

HashMap没有分类和排序,它允许存储null键和多个null值。HashMap每次进行put的时候可以选择在key相同的时候是否更新数据,默认为更新数据。

HashTable类似与HashMap,但是不允许存储null键和null值,它比HashMap慢,因为它是同步的。

6. Collection和Collections的区别

Collections是一个类,它包含各种有关集合操作的静态方法。

Collection是一个接口,它是各种集合结构的父接口。

父类接口 子类实现 具体实现
Map接口 TreeMap
HashMap 哈希表
HashTAble 哈希表
Collection接口 List集合 ArrayList数组
LinkedList链表
Set集合 TreeSet树
HashSet哈希表

7. 什么时候使用assert?

assert是断言语句,通常用于验证私有方法的参数,而公有参数无论是否启动断言,都会进行参数检查,不过既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件,另外断言不应该以任何方式改变程序的状态。

断言的使用方式:

  1. assert Expression1;
  2. assert Expression1:Expression2; //前边应该总是生成一个布尔值,后边表达式用于生成显示更多调试信息的String消息。
public class Test{
    public static void main(String[] args){
        for(int i = 0; i < args.length; i ++){
            System.out.println(args[i]);
        }
        final int a = 4;
        String content = "测试下";
        assert (a < 0):content + "大于0";
    }
}

测试结果:

D:>javac -source 1.8 Test.java

D:>java -ea Test

Exception in thread “main” java.lang.AssertionError: 测试下大于0

​ at Test.main(Test.java:8)

8. GC是什么?为什么要有GC?

GC是垃圾回收机制,java中将内存管理交给垃圾回收机制,这是因为在面向对象编程中一个对象的生命周期往往无法预料,所以我们无法为每个对象指定回收时机,但是我们可以采用System.gc()Runtime.getRuntime().gc()进行请求垃圾回收,可以使用对象的finalize()对必要资源在垃圾回收之前进行处理。

1、引用计数(reference counting)
​ 原理:此对象有一个引用,则+1;删除一个引用,则-1。只用收集计数为0的对象。
​ 缺点:无法处理循环引用的问题。如:对象A和B分别有字段b、a,令A.b=B和B.a=A,除此之外这2个对象再无任何引用,那实际上这2个对象已经不可能再被访问,但是引用计数算法却无法回收他们。

2、复制(copying)
​ 原理:把内存空间划分为2个相等的区域,每次只使用一个区域。垃圾回收时,遍历当前使用区域,把正在使用的对象复制到另外一个区域。
​ 优点:不会出现碎片问题。
​ 缺点:1、暂停整个应用。2、需要2倍的内存空间。

3、标记-清扫(Mark-and-sweep)—sun前期版本就是用这个技术。
​ 原理:对于“活”的对象,一定可以追溯到其存活在堆栈、静态存储区之中的引用。这个引用链条可能会穿过数个对象层次。第一阶段:从GC roots开始遍历所有的引用,对有活的对象进行标记。第二阶段:对堆进行遍历,把未标记的对象进行清除。这个解决了循环引用的问题。
​ 缺点:1、暂停整个应用;2、会产生内存碎片。

4、标记-压缩(Mark-Compact)自适应
​ 原理:第一阶段标记活的对象,第二阶段把为标记的对象压缩到堆的其中一块,按顺序放。
​ 优点:1、避免标记扫描的碎片问题;2、避免停止复制的空间问题。

​ 具体使用什么方法GC,Java虚拟机会进行监视,如果所有对象都很稳定,垃圾回收器的效率低的话,就切换到“标记-扫描”方式;同样,Java虚拟机会跟踪“标记-扫描”的效果,要是堆空间碎片出现很多碎片,就会切换回“停止-复制”模式。这就是自适应的技术。

5、分代(generational collecting)—–J2SE1.2以后使用此算法
​ 原理:基于对象生命周期分析得出的垃圾回收算法。把对象分为年轻代、年老代、持久代,对不同的生命周期使用不同的算法(2-3方法中的一个即4自适应)进行回收。

6、自适应算法(Adaptive Collector)
​ 在特定的情况下,一些垃圾收集算法会优于其它算法。基于Adaptive算法的垃圾收集器就是监控当前堆的使用情况,并将选择适当算法的垃圾收集器。

9. String s = new String(“xyz”); 创建了几个String Object?

如果String常量区中,已经创建了“xyz”,那么只会创建一个对象被s引用;如果String常量池中,没有创建“xyz”,那么会创建两个对象,一个是常量池中的“xyz”,一个被s引用的对象。

10. Math.round(11.5)等于多少?Math.round(-11.5)等于多少?

第一个等于12,第二个等于-11

  1. Math.ceil()用作向上取整。
  2. Math.floor()用作向下取整。
  3. Math.round() 我们数学中常用到的四舍五入取整。

Similar Posts:

  • 探讨Java中最常见的十道面试题(超经典)

    第一,谈谈final, finally, finalize的区别. final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 abstract的,又被声明为final的.将变量或方法声明为final,可以保证它们在使用中不被改变.被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改.被声明为final的方法也同样只能使用,不能重载 finally?再异常处理时提供 finally 块来执行任何

  • Andorid七十道面试题(附答案)

    本帖最后由 anzhuo 于 2012-1-11 11:21 编辑 打包下载: <ignore_js_op> Android面试题带答案.doc (108.5 KB, 下载次数: 1769) Android面试题1. 下列哪些语句关于内存回收的说明是正确的? (b ) A. 程序员必须创建一个线程来释放内存 B. 内存回收程序负责释放无用内存 C. 内存回收程序允许程序员直接释放内存 D. 内存回收程序可以在指定的时间释放内存对象 2. 下面异常是属于Runtime Exception 的是(

  • 今天遇到的十道面试题:Java 与 Servlet 方面

    1.get 和 post 的区别 Form 中的get 和post方法,在数据传输过程中分别对应了HTTP协议中的GET和Post方法.二者主要区别如下: 1.Get是用来从服务器上获得数据,而post是用来向服务器上传递数据: 2.Get将表单中的数据按照 variable=value( 发送的是变量名+变量值 ),添加到action所指的URL后面,并且两者用?号连结,而这两个变量之间使用&链接 Posts post是通过HTTP post机制将表单内各个字段与其内容放置在HTML HEAD

  • (转)十道海量数据处理面试题与十个方法大总结

    海量数据处理:十道面试题与十个海量数据处理方法总结 作者:July.youwang.yanxionglu. 时间:二零一一年三月二十六日 本文之总结:教你如何迅速秒杀掉:99%的海量数据处理面试题.有任何问题,欢迎随时交流.指正. 出处:http://blog.csdn.net/v_JULY_v. ------------------------------------------ 第一部分.十道海量数据处理面试题 1.海量日志数据,提取出某日访问百度次数最多的那个IP. 首先是这一天,并且是访

  • 从头到尾彻底解析Hash表算法十道海量数据处理面试题与十个方法大总结

    作者:July.youwang.yanxionglu. 时间:二零一一年三月二十六日 说明:本文分为俩部分,第一部分为10道海量数据处理的面试题,第二部分为10个海量数据处理的方法总结.有任何问题,欢迎交流.指正. 出处:http://blog.csdn.net/v_JULY_v. ------------------------------------------ 第一部分.十道海量数据处理面试题 1.海量日志数据,提取出某日访问百度次数最多的那个IP. 首先是这一天,并且是访问百度的日志中的

  • 男性补肾理疗杯壮阳的十道菜

    第四道:鹿肉50克,加枸杞子,何首黑适量共炖,弃药渣,食肉饮汤. 第八道:麻雀2只,去毛及骨脏,加菟丝子,枸杞子各25克,共煮熟,弃药渣,食肉饮汤. 第二道:羊肉150克,淮山药120克,肉苁蓉100克,菟丝子150克,核桃仁150克,葱白10根,粳米适量做汤食. 第三道:羊肾1对,肉苁蓉12克,枸杞10克,巴戟8克,熟地10克,同炖熟,弃药渣,食肉饮汤,每日1主. 在日常饮食中有很多食品都有补肾壮阳的作用,希望自己充满活力的男性不妨一试. 第十道:猪肾1个,淮山药,枸杞子各15克,山萸肉12克

  • 十道大数据的题与十个海量数据处理的方法

    第一部分.十道海量数据处理面试题 1.海量日志数据,提取出某日访问百度次数最多的那个IP. 此题,在我之前的一篇文章算法里头有所提到,当时给出的方案是:IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计. 再详细介绍下此方案:首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中.注意到IP是32位的,最多有个2^32个IP.同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP

  • 谷歌八道面试题

    谷歌八道面试题 1. 正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项,例如,当a=3,b=5,N=6时,序列为3,5,6,9,10,12 (1).设计一个函数void generate(int a,int b,int N ,int * Q)计算Q的前几项 (2).设计测试数据来验证函数程序在各种输入下的正确性. 解: void generate(int a, int b, int N, int * Q) { int num = 0; //计数 i

  • [置顶] 【安卓面试】Android 70道面试题(2015.12)

    Android 70道面试题汇总不再愁面试 本文为开发者奉献了70道经典Android面试题加答案--重要知识点几乎都涉及到了.(网上涉猎资源,内部有一些错误,比如ContenValues应该是ContentValues,Broadcase应该是Broadcast,res aw应该是res/raw等等等..所以本文仅供读者参考.) 1. 下列哪些语句关于内存回收的说明是正确的? (b) A. 程序员必须创建一个线程来释放内存 B. 内存回收程序负责释放无用内存 C. 内存回收程序允许程序员直接释

  • 有助于理解数的二进制表示的两道笔试题

    两道笔试题,大家帮忙看一下... http://topic.csdn.net/u/20081029/10/ee84a378-bdd0-41ec-a4af-916ba59baaba.html 1.已知x,不用+,-,*,/符号,计算出x+1的值: 2.检验一个整数是否为2的n次方数,要求用一行代码,而且不能使用循环语句. 如果对数值的二进制表示相当熟悉,而且聪明的话,应该不是问题. 第1题的解法: intadd1(intx) { inti=1; while(x&i) { x&=(~i); i

Tags: