黑马程序员技术交流社区

标题: 面试经常问的 [打印本页]

作者: huangweicong    时间: 2016-10-1 00:19
标题: 面试经常问的
1 反射的理解
答:反射就是把 Java 类中的各种成分映射成相应的 java 类。a 变量,方法,构造方法,包等等信息用一个个 java 类来表示。(Field、Method、Contructor、Package)b 举个例子:房子中 有衣柜、电视、床类
c、 Java 中提 Class 类中提供了很多方法获得相应的类,并可以通过这个类中的 newIstance 方法获得实例对象,
进一步操作。
简单总结一点:反射就其实是对 java 中各个类中共性部分进行封装,这也是面向对象的一种特性。
参考:反射就是把 Java 类中的各种成分映射成相应的 java 类。例如,一个 Java 类中用一个 Class 类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的 Java 类来表示,就像汽车是
一个类,汽车中的发动机,变速箱等等也是一个个的类。表示 java 类的 Class 类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是 Field、
Method、Contructor、Package 等等。
一个类中的每个成员都可以用相应的反射 API 类的一个实例对象来表示,通过调用 Class 类的方法可以得到这些实例对象后,得到这些实例对象后有什么用呢?怎么用呢?这正是学习和应用反射的要点。
2 集合框架的概述,ArrayList 的特点、Map 集合的特点;Collection 集合下有哪些类,每个类又有那些特点?HashMap Hashtable 的区别?
集合框架的概述:集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。集合类和数组类不一样,数组元素既可以是基本数据类型,也可以是对象(实际上保存的是对象的引用变量);而集合只能保存对象(实际上只是保存对象的引用变量)。Java 的集合类主要由两个接口派生而出:Collection Map,这两个是集合框架的根接口。
Map 集合的特点:Map 集合用于保存具有映射关系的数据,因此 Map 集合里保存着两组值,一组使用于保存 Map 里的 key,另外一组用于保存 Map 里的 value,key 和 value 都可以是任何引用类型的数据。Map 的 key 不
允许重复。Key value 之间存在单向一对一关系,即通过指定的 key,总能找到唯一的确定的 value。Map 里包
含了一个 keySet()方法,用于返回 Map 里所有 key 组成的 Set 集合。
Collection 集合下包含的类:包含 List 集合和 Set 集合。
List 集合包含 ArrayList、LinkedList、Vector。List 集合特点:有序,有索引,可以存放重复元素。
ArrayList底层是数组结构,是不同步的,线程不安全,增删慢,查寻速度快;
LinkedList底层是链表结构,增删比较快,查寻比较慢;
Vector底层是数组结构,是同步的,线程安全,查询速度慢。
Set 集合包含 HashSet、TreeSet、LinkedHashSet。Set 集合特点:无序,无索引,不可存放重复元素。
HashSet线程不安全,存取速度快;
TreeSet线程不安全,可以 Set 集合中的元素进行排序。
LinkedHashSet底层是链表实现的,是 Set 集合中惟一一个能保证怎么存就怎么取的集合对象。
HashMap Hashtable 的区别:
A 共同点:底层都是哈希算法,都是双列结合B 区别:HashMap 可以存储 null 键和 null 值,是线程不安全的,效率高,JDK1.2 版本;
Hashtable 不可以存储 null 键和 null 值,线程安全,效率低,JDK1.0 版本。
3 懒汉式和饿汉式之间的区别
饿汉式:线程安全,调用效率高,创建对象再对外提供对象的,不能延时加载;
懒汉式:线程不安全,需要同步调用效率不高,是后创建再对外提供对象的,能延时加载。


4 进程和线程之间的区别
进程:当一个程序进入内存运行时,即变成一个进程。进程是处于运行过程中的程序,并且具有一定的独立功
能,进程是系统进行资源分配和调度的一个独立单位。一般而言,进程包含三个特征:独立性、动态性、并发性。
线程:也被称为轻量级进程,线程是进程的执行单元。线程在程序中是独立的、并发的执行流,对应绝大多数
程序而言,通常仅要求有一个主线程。
线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必有又一个父进程。线程可以拥有自己的堆栈、自己的程序计数器和自己的局部变量,但不拥有系统资源,它与父进程的其他线程共享该进程所拥有的全部资源。
线程是独立运行的,其执行是抢占式的。线程比进程具有更高的性能。
一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。
简而言之,一个程序运行后至少有一个进程,一个进程里可以包含多个线程,但至少要包含一个线程。
5 线程的创建方式
线程创建有 2 种方式:继承 Thread 类和实现 Runnable 接口
A 继承 Thread
a 定义 Thread 类的子类,并重写该类的 run()方法,run()方法称为线程执行体;b 创建 Thread 子类的实例,即创建了线程对象;c 调用线程对象的 start()方法来启动该线程。
B 实现 Runnable 接口:
a 定义 Runnable 接口的实现类,并重写该接口的 run()方法;b 创建 Runnable 实现类的实例,并以此实例作为 Thread 的 target 来创建 Thread 对象,该 Thread 对象才
是真正的线程对象。
c 调用线程对象的 start()方法来启动该线程。
C 两种方式的优缺点对比:
a 继承 Thread
优点:编写简单,如果需要访问当前线程,无须使用 Thread.currentThread()方法,直接使用 this 即可获得当前线程。
缺点:因为线程类已经继承了 Thread 类,所以不能再继承其他父类。
b 实现 Runnable
优点:可以继承其他父类;同时,在多个线程中可以共享同一个 target 对象,非常适合多个相同线程来处理同一份资源的情况。
缺点:编程稍稍复杂,如果需要访问当前进程,则必须使用 Thread.currentThread()方法。
6 线程中 start()方法和 run()区别
启动线程使用 start()方法而不是 run()方法!
调用 start()方法来启动线程,系统会把该 run()方法当成线程执行体来处理;但是如果直接调用线程对象的 run()
方法,则 run()方法会立即被执行,而在 run()方法返回之前其他线程无法并发执行,也就是说,如果直接调用线程对象的 run()方法,系统把线程对象当成一个普通对象,而 run()方法也是一个普通方法,而不是线程执行体。
7 同步代码块和同步方法的区别
同步就是将部分操作功能数据的代码进行加锁;
同步方法是指进入该方法时需要获取 this 对象的同步锁;
同步代码块则是可以指定需要获取哪个对象的同步锁。
相对而言,同步方法比同步代码块更高效,但是它们的功能是一样的。


8 线程的死锁
当两个线程相互等待对方释放同步监视器时就会发生死锁。一旦出现死锁,整个程序既不会发生任何异常,也不会给出任何提示,只是所有的线程处于阻塞状态,无法继续。
9 sleep wait 的区别
A、 sleep 必须传入参数,wait 可传入参数,也可以不传入参数,传入指在参数的时间结束后等待;
B、 sleep 在同步方法或者同步代码中,不释放锁,wait 则一定会释放锁。
C、 sleep 是 Thread 类的方法,wait 是 Object 类的方法。
10、线程池的理解
系统启动一个新线程的成本比较高,因为它涉及与操作系统交互。在这种情况下,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池。
线程池在系统启动时即创建大量空闲的线程,程序将一个 Runnable 对象传给线程池,线程池就会启动一个
线程来执行它们的 run()方法,当 run()方法执行结束后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个 Runnable 对象的 run()方法。
11、匿名内部类
答:概念:匿名内部类就是没类名的子类,前提:必须有继承或者实现。
应用场景:当函数的参数引用接口类时,且这个接口的方法个数不超过三个时;
12、抽象类和接口的区别
抽象类一般用于描述一个体系的共内容,定义好抽象方法,让子类去实现。接口和抽象类都不能被实例化,都可以包含抽象方法;接口作为系统与外界交互的窗口,接口体现的是一种规范;
抽象类则不一样,抽象类作为系统中多个子类的共同父类,它所体现的是一种模板式设计;接口里只能包含抽象方法、静态方法和默认方法,不能为普通方法提供方法实现,抽象类则完全可以包含
普通方法。
接口里只能定义静态常量,抽象类里则既可以定义普通成员变量,也可以定义静态常量。接口里不包含构造器,抽象类里可以包含构造器;接口里不能包含初始化块,但抽象类则完全可以包含初始化块;
一个类最多只能有一个直接父类,包含抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以
弥补 Java 单继承的不足。
13、面向对象和面对过程区别,面向对象的三大特征:封装、继承、多态。
相同点:都是一种编程思想。
区别:面向过程就是解决问题所需要的步骤,用函数去实现每一个步骤,强调细节。
而面向过程是一种对现实世界理解和抽象的方法。对同类事物的概括与总结,隐藏具体属性和行为,强调整体。
三个特征:
A 将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。好处是将变化隔离;便于使用;提高重用性;安全性。
B 继承是代码的一种重用方式,好处是提高了代码的复用性,让类之间有关系,给多态提供了前提。
C 多态的体现是父亲或接口引用指向子类对象,提高了程序的扩展性,前提是子类必须有继承或实现。
14、获取字节码文件的三种方式
A、第一种:使用 Class 类的 forName(String clazzName)静态方法;
B、第二种:调用某个类的 class 属性来获取该类对应的 Class 对象;
C、第三种:调用某个对象的 getClass()方法






作者: Jarc    时间: 2016-10-4 14:08
好多知识点
作者: 小明教授    时间: 2016-10-4 14:10
收藏,可能用的到
作者: 叫我宁采臣    时间: 2016-10-4 19:55
很有用处不错
作者: 暮雨微凉    时间: 2016-10-4 20:11
谢谢楼主的分享
作者: 飞舞的指尖    时间: 2016-10-4 20:11
{:3_53:}经典   
作者: zhuangshuang123    时间: 2016-10-4 20:12
谢谢楼主分享
作者: langyabang1110    时间: 2016-10-4 20:33
不错不错  继续努力




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