黑马程序员技术交流社区

标题: 重新学习一下Java基础总结一下黑马的面试题吧~ [打印本页]

作者: 高鹏飞    时间: 2015-8-30 21:57
标题: 重新学习一下Java基础总结一下黑马的面试题吧~
本帖最后由 高鹏飞 于 2015-8-30 22:00 编辑

1.笔试中的题每一道题都加以说明解释,所以童鞋们一定要写注释,哪怕代码写不出来,把思路写下也OK
2.单例设计模式为什么要这样写?延迟加载的单例属于哪种设计模式?
答:
        单例设计模式主要是为了在实际开发中,有些类不需要创建多个对象,从而需要我们私有化构造方法,在类的内部我们只提供一个公共方法来给外界提供该类对象(多用于工具类的编写)。
            延迟加载的单例属于懒汉式。
3.打印流是什么?flush()和close()方法有什么区别?
答:
        PrintStream(打印流): 会自动编码(使用系统平台默认的编码方案),OutputStream不会。
        打印流可以选择控制台也可以选择文件作为目的地。例如:System.out.println就是把目的地选择为了控制台。
        flush()方法是在使用高效字符流进行写操作时,必须刷新才能将缓冲区的内容刷新写入到指定目的文件中
        close()方法是在使用完流后进行关闭流
4.什么是转换流?举例说明什么时候使用转换流?
答:
        有两种情况:
                一是操作文本涉及到具体的指定编码表是,必须使用转换流。
                还有就是源或者目的的对应的设备室字节流,但是操作的却是文本数据,可以使用转换作为桥梁。提高对文本的操作便捷。
5.成员变量和局部变量的区别?
答:
        成员变量是在一个类的内部定义的变量,而局部变量是定义在一个类的方法或者方法的某一个代码块儿中。
        成员变量是在类被实例化时创建在堆内存中,局部变量是在方法执行时,随方法加载到栈内存中。(既成员变量的生命周期>局部变量的生命周期)
        成员变量可以不设置初始化值(它会使用系统默认的值),局部变量必须进行初始化。
6.遍历集合有几种方法?
答:
        通过for循环遍历、通过foreach循环遍历、通过迭代器(iterator)遍历
7.Map集合转成Set集合有几种方式,分别是什么?具体说说这两种方式的思想?
答:
        两种方式:
                第一种、通过获取Map的keySet(键集合)---->Set<String> keySet = map.keySet();
                第二种、通过获取Map的entrySet(键值对关系)---->Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        第一种是获取Map的键集,第二种是获取Map的键值关系集合。键集和键值关系集都是Set集合,然后通过Set集合的迭代器遍历Set集合中的元素。
9.TreeSet有几种排序方法?分别说明?
答:
        TreeSet排序的方式一:让元素自身具备比较性,需要实现Comparable接口,覆盖compareTo方法。即:自然顺序排序
        TreeSet排序的方式二:让容器自身具备比较性,容器一旦初始化,就具备了比较功能,因为容器是在对象构造时完成的
        通过查询TreeSet集合有一个构造方法TreeSet(Comparator),在容器初始化时可以指定一个比较器,所以这种方式成为比较器排序,需要实现Comparator接口,覆盖compare方法即可
10.方法中的内部类能不能访问方法中的局部变量,为什么?
答:
        内部类的生命周期和方法中的局部变量是不一样的,内部类是也是一个类,是存储在堆内存中,也只有当对该类的引用消失时,内部类才会消亡。
        而方法的局部变量是存储在栈内存中的,当方法调用结束时就会退栈,局部变量此时随之就消失了。
        也就是说,内部类的生命周期超过了方法中局部变量的生命周期,内部类可能会调用到已经消失的属性,因此内部类不能访问方法中的局部变量。
        解决方法就是在局部变量前加修饰符final ,此时局部变量就会存在堆中,生命周期跟工程的生命周期是一样的,此时内部类就可以访问方法中的局部变量。
11.如何创建线程?分别说明?
答:
        创建线程有两种方法:
        1、让一个类继承Thread类,实现run()方法,然后创建该类对象,调用.start()方法开启线程;
        2、让一个类实现Runnable接口,实现run()方法,创建该类对象,并创建一个Thread类对象,将该类对象作为Thread类对象的构造参数传递,通过Thread类对象.start()方法开启线程
12.String转换Integer的方法
答:
        该题考反射。举一个例子,就是黑马面试题在一个ArrayList<String>集合中存储一个Integer类型的元素,原理就是利用发射技术
13.什么是反射?有几种方法加载字节码?分别是什么?
答:
        JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;
        这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
        加载字节码文件有三种方法:1、通过每个类都具有的静态变量.class;2、通过类的.getClass()方法;3、通过Class类的.forName()方法
14.通过反射能获取什么?
答:
        通过反射能获取到类的所有内容(构造方法,全局变量,全局方法)
15.为什么需要配置path,什么时候需要classpath?作用是什么?
答:
        为了提高编程人员操作效率,配置环境变量可以是电脑辅助查找编辑。
16.线程中wait和sleep方法的区别
答:
        sleep就是睡自己的觉,让别人吵吵去(睡到定点醒)
        wait就是等电话,电话来了立刻接,其它时间也在睡(睡到有人叫)
17.泛型,什么时候会用到泛型?举例说明下,说说上下限什么时候用?
答:
        泛型使用的目的是规定数据类型,保证对象的类型唯一,集合框架中会用到泛型;
        上限: <? extends Number>         范围:Number类以及Number的子类
        下限:<? super Integer>         范围:Integer以及其父类
18.网络编程中TCP和UDP的区别
答:
        TCP: 需要建立连接                UDP :不需要建立连接
        TCP:传输数据量大                UDP:传输数据量小
        TCP:可靠协议                UDP:不可靠协议
        TCP:不会丢包,速度慢        UDP:会丢包(每个包64K),速度快
19.Collection与Map集合是不是继承自Object?
答:
        不是 他们是接口,Object是类,如果继承的话,会有构造方法,而接口没有构造方法.
20.把JDk1.5的新特性罗列出来
答:
        静态导入、自动装箱拆箱、增强for循环(foreach)、可变参数、泛型、枚举、注解  
21.什么是递归?
答:
        递归就是方法本身调用本身,例如复制文件夹就用的递归。
22.重载和覆盖的区别
答:
        重载:方法名相同,参数列表不同;  在同一类中
        覆盖:声明方法的形式一模一样;在不同类中,前提:继承
22.你对面向对象的理解是什么? 三大特征及其特点
答:
        面向对象是相对于面向过程而言的,它将复杂问题简单化,将问题的执行者变成指挥者。例子:洗衣机洗衣物,我只需调用洗衣机的功能,无需知道是怎么洗衣服的。
        三大特征:
                封装:将类的实现细节和属性进行隐藏,对外提供公共的访问方式。提高安全性(例子:电脑 将零部件用外壳包装,对外提供USB接口)
                继承:多个具备相同属性的类,向上抽取公共的方法或属性形成的类,他们之间具备的这种关系。  提高了代码的复用性,让类与类之间产生关系 (多态)
                多态:一个事物具备多种状态, 父类或接口的引用指向子类对象。提高代码的扩展性。
23.IO流里面的读写操作,字符流复制文件、字节流复制文件、复制文件夹的区别
答:
        首先判断用文本文件是否能够识别, 能就用字符流  不能就用字节流
24.final,finally,finalize的区别
答:
        final:是一个修饰符,是最终的意思。被final修饰的类不能被继承、被修饰的方法不能被重写、被修饰的变量为常量
        finally:是异常中的关键字,它经常配合try-catch方法做代码出现异常时,所需要做的操作。finally中的代码在任何情况下都会被执行到。
        finalize:它是垃圾回收机制中的一个方法名,Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
25.continue和break的区别:
答:
        continue:是指跳出当前循环,它会继续执行后续程序
        break:是指跳出整个循环
        例如:
  1. for(int i = 0; i < 10; i ++){
  2.     if(i == 3){
  3.         continue;
  4.     }
  5.     System.out.println("当前打印的是" + i);
  6. }
  7. /*当使用continue时,该段代码块儿打印出来的结果是:1 2 4 5 6 7 8 9,没有3*/

  8. for(int i = 0; i < 10; i ++){
  9.     if(i == 3){
  10.         break;
  11.     }
  12.     System.out.println("当前打印的是" + i);
  13. }
  14. /*当使用continue时,该段代码块儿打印出来的结果是:1 2 ,后续循环将不再执行*/
复制代码


26.多线程有哪些状态?
答:
        就绪状态、运行状态、阻塞状态、死亡状态

线程生命周期图解.png (81.75 KB, 下载次数: 2)

线程生命周期图解.png





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2