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()方法
|