A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

黑马android入学面试通过,现在只剩下入学笔试测试,大家有需要问的吗?
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集合下有哪些类,每个类又有那些特点?HashMapHashtable的区别?
集合框架的概述:集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。集合类和数组类不一样,数组元素既可以是基本数据类型,也可以是对象(实际上保存的是对象的引用变量);而集合只能保存对象(实际上只是保存对象的引用变量)。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集合中惟一一个能保证怎么存就怎么取的集合对象。
HashMapHashtable的区别:
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、  sleepwait的区别
A、sleep必须传入参数,wait可传入参数,也可以不传入参数,传入指在参数的时间结束后等待;
B、sleep在同步方法或者同步代码中,不释放锁,wait则一定会释放锁。
C、sleep是Thread类的方法,wait是Object类的方法。
10、线程池的理解
系统启动一个新线程的成本比较高,因为它涉及与操作系统交互。在这种情况下,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池。
线程池在系统启动时即创建大量空闲的线程,程序将一个Runnable对象传给线程池,线程池就会启动一个线程来执行它们的run()方法,当run()方法执行结束后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个Runnable对象的run()方法。
更多详细内容,见这个帖子:黑马Java入学面试题总结


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马