北京Java笔试题整理

北京Java笔试题整理
一、什么是java虚拟机?为何ava被称做是“平台无关的编程语言?
答:Java虚拟机能够理解为一个特殊的“操做系统”,只是它链接的不是硬件,而是通常的操做系统和java程序。
正是由于有这样一层操做系统与程序之间的链接,Java程序就能在一台机子上编译后处处都能运行——只要有对应不一样系统的Java虚拟机就能够了。所以Java被称为“平台无关”。
Java虚拟机是一个能够执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。java

二、关键字是什么意思?Java中是否能够覆盖或者static的方法?
答:static表示静态的意义,它能够修饰一个变量,一个方法,被其修饰的变量被称为类变量,被其修饰的方法成为类方法,其随着类的加载而被加载。
没法重写被private修饰的方法,由于被private修饰的父类方法在子类中是不可见的。
static修饰的方法是静态绑定的,而方法覆盖是为了实现多态,是动态绑定,因此static修饰的方法不须要被覆盖
三、是否能够在static环境中访问非static变量?
答:不能。
static变量在java中是属于类的,在类的全部实例中,它的值都是同样的。在类被JVM载入时,静态变量的值就肯定了。
而非静态变量是属于实例的,要在new一个实例以后,值才会存在。
在static环境中,调用非static变量,可能这个变量都还不存在,固然会出错。
四、java支持的数据类型有哪些?什么是自动拆装箱?
答:Java语言支持的8中基本数据类型是:
byte
short
int
long
float
double
boolean
char
自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间作的一个转化。好比:把int转化成Integer,double转化成double,等等。反之就是自动拆箱。
五、Java中的方法覆盖和方法重载是什么意思?
答:重载: 在一个类当中才能够重载,方法名相同,参数个数不一样或参数个数相同而参数类型不一样。
覆盖: 又称重写,在派生类(子类)中重写基类(父类)的方法,名称、参数、类型都必须相同。
六、Java中,什么是构造函数?什么是构造函数重载?什么是赋值构造函数?
答:当新对象被建立的时候,构造函数会被调用。每个类都有构造函数。在程序员没有给类提供构造函数的状况下,Java编译器会为这个类建立一个默认的构造函数。
Java中构造函数重载和方法重载很类似。能够为一个类建立多个构造函数。每个构造函数必须有它本身惟一的参数列表。
Java不支持像C++中那样的赋值构造函数,这个不一样点是由于若是你不本身写构造函数的状况下,Java不会建立默认的赋值构造函数。
七、Java支持多继承吗?
答:
Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 可是java中的接口能够间接实现多继承,,即一个子接口能够有多个父接口。(接口的做用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)。
八、进程和线程的区别是什么?
答:1)进程是什么? 是具备必定独立功能的程序、它是系统进行资源分配和调度的一个独立单位,重点在系统调度和单独的单位,也就是说进程是能够独 立运行的一段程序。
2)线程又是什么? 线程进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程本身基本上不拥有系统资源。 在运行时,只是暂用一些计数器、寄存器和栈 。2、他们之间的关系 3)一个线程只能属于一个进程,而一个进程能够有多个线程,但至少有一个线程(一般说的主线程)。
九、什么是值传递和引用传递?
答:值传递 指的是在方法调用时,传递的参数是按值的拷贝传递。
引用传递 指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。
十、建立线程有几种方式?你喜欢哪种?为何?
答:程序员

1)继承Thread类(真正意义上的线程类),是Runnable接口的实现。编程

2)实现Runnable接口,并重写里面的run方法。设计模式

3)经过Callable接口实现多线程,重写call方法,优势是能够获取返回值,肯定是比较繁琐数组

4)使用Executor框架建立线程池。Executor框架是juc里提供的线程池的实现。安全

调用线程的start():启动此线程;调用相应的run()方法服务器

继承于Thread类的线程类,能够直接调用start方法启动线程(使用static也能够实现资源共享).一个线程(对象)只可以执行一次start(),并且不能经过Thread实现类对象的run()去启动一个线程。数据结构

实现Runnable接口的类须要再次用Thread类包装后才能调用start方法。(三个Thread对象包装一个类对象,就实现了资源共享)。多线程

线程的使用的话,注意锁和同步的使用。(多线程访问共享资源容易出现线程安全问题)框架

通常状况下,常见的是第二种。

  • Runnable接口有以下好处:

*①避免点继承的局限,一个类能够继承多个接口。

*②适合于资源的共享
十一、归纳的解释下线程的几种可用状态?
答:

  1. 新建( new ):新建立了一个线程对象。
  2. 可运行( runnable ):线程对象建立后,其余线程(好比 main 线程)调用了该对象 的 start ()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取 cpu 的使用权 。
  3. 运行( running ):可运行状态( runnable )的线程得到了 cpu 时间片( timeslice ) ,执行程序代码。
  4. 阻塞( block ):阻塞状态是指线程由于某种缘由放弃了 cpu 使用权,也即让出了 cpu timeslice ,暂时中止运行。直到线程进入可运行( runnable )状态,才有 机会再次得到 cpu timeslice 转到运行( running )状态。阻塞的状况分三种:
    (一). 等待阻塞:运行( running )的线程执行 o . wait ()方法, JVM 会把该线程放 入等待队列( waitting queue )中。
    (二). 同步阻塞:运行( running )的线程在获取对象的同步锁时,若该同步锁 被别的线程占用,则 JVM 会把该线程放入锁池( lock pool )中。
    (三). 其余阻塞: 运行( running )的线程执行 Thread . sleep ( long ms )或 t . join ()方法,或者发出了 I / O 请求时, JVM 会把该线程置为阻塞状态。            当 sleep ()状态超时、 join ()等待线程终止或者超时、或者 I / O 处理完毕时,线程从新转入可运行( runnable )状态。
  5. 死亡( dead ):线程 run ()、 main () 方法执行结束,或者因异常退出了 run ()方法,则该线程结束生命周期。死亡的线程不可再次复生

十二、同步方法和同步代码块的区别是什么?
答:
同步方法:(粗粒度锁):

        1.修饰通常方法: public synchronized void method (){...},获取的是当前调用               对象this上的锁

        2.修饰静态方法: public static synchronized void method (){...},获取当前类的             字节码对象上的锁

 

③同步代码块(细粒度锁):

         synchronized ( obj ) {...},同步代码块能够指定获取哪一个对象上的锁。

 
1三、什么是死锁?
答:所谓死锁:是指两个或两个以上的进程在执行过程当中,因争夺资源而形成的一种互相等待的现象,若无外力做用,它们都将没法推动下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
1四、为何Java集合类没有实现Cloneable和Serializable接口?
答:克隆(cloning)或者序列化(serialization)的语义和含义是跟具体的实现相关的。所以应该由集合类的具体实现类来决定如何被克隆或者序列化
1五、Java集合类框架的基本接口有哪些?
答:
1)总共有两大接口:Collection 和Map ,一个元素集合,一个是键值对集合; 其中List和Set接口继承了Collection接口,一个是有序元素集合,一个是无序元素集合; 而ArrayList和 LinkedList 实现了List接口,HashSet实现了Set接口,这几个都比较经常使用; HashMap 和HashTable实现了Map接口,而且HashTable是线程安全的,可是HashMap性能更好;
2)
Java集合类里最基本的接口有:
Collection:单列集合的根接口
List:元素有序 可重复
ArrayList:相似一个长度可变的数组 。适合查询,不适合增删
LinkedList:底层是双向循环链表。适合增删,不适合查询。
Set:元素无序,不可重复
HashSet:根据对象的哈希值肯定元素在集合中的位置
TreeSet: 以二叉树的方式存储元素,实现了对集合中的元素排序
Map:双列集合的根接口,用于存储具备键(key)、值(value)映射关系的元素。
HashMap:用于存储键值映射关系,不能出现重复的键key
TreeMap:用来存储键值映射关系,不能出现重复的键key,全部的键按照二叉树的方式排列
1六、什么是迭代器?
答:
迭代器是一种设计模式,它是一个对象,它能够遍历并选择序列中的对象,而开发人员不须要了解该序列的底层结构。迭代器一般被称为“轻量级”对象,由于建立它的代价小。
  Java中的Iterator功能比较简单,而且只能单向移动:
1七、Iterator和Listiterator的区别是什么?
答:一.相同点
都是迭代器,当须要对集合中元素进行遍历不须要干涉其遍历过程时,这两种迭代器均可以使用。
二.不一样点
1.使用范围不一样,Iterator能够应用于全部的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。
2.ListIterator有add方法,能够向List中添加对象,而Iterator不能。
3.ListIterator和Iterator都有hasNext()和next()方法,能够实现顺序向后遍历,可是ListIterator有hasPrevious()和previous()方法,能够实现逆向(顺序向前)遍历。Iterator不能够。
4.ListIterator能够定位当前索引的位置,nextIndex()和previousIndex()能够实现。Iterator没有此功能。
5.均可实现删除操做,可是ListIterator能够实现对象的修改,set()方法能够实现。Iterator仅能遍历,不能修改。

1八、Java中的Hashmap的工做原理是什么?
答:java8对hashmap作了优化 ,底层有两种实现方法,一种是数组和链表,一种是数组和红黑树,hsahmap会根据数据量选择存储结构
if (binCount >= TREEIFY_THRESHOLD - 1) 
当符合这个条件的时候,把链表变成treemap,这样查找效率从o(n)变成了o(log n)
1九、hashcode()和equals()方法的重要性体如今什么地方?
答:Java中的HashMap使用hashCode()和equals()方法来肯定键值对的索引,当根据键获取值的时候也会用到这两个方法。若是没有正确的实现这两个方法,两个不一样的键可能会有相同的hash值,所以,可能会被集合认为是相等的。并且,这两个方法也用来发现重复元素。因此这两个方法的实现对HashMap的精确性和正确性是相当重要的。
20、Hashmap和Hashtable有什么区别?
答:
HashMap几乎能够等价于Hashtable,除了HashMap是非synchronized的,并能够接受null(HashMap能够接受为null的键值(key)和值(value),而Hashtable则不行)。
HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程能够共享一个Hashtable;而若是没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
另外一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。因此当有其它线程改变了HashMap的结构(增长或者移除元素),将会抛出ConcurrentModificationException,但迭代器自己的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并非一个必定发生的行为,要看JVM。这条一样也是Enumeration和Iterator的区别。
因为Hashtable是线程安全的也是synchronized,因此在单线程环境下它比HashMap要慢。若是你不须要同步,只须要单一线程,那么使用HashMap性能要好过Hashtable。
HashMap不能保证随着时间的推移Map中的元素次序是不变的
2一、数组((Array)和列表(ArrayList)有什么区别?何时应该使用Arrayi不是Arraylist?
答:
数据类型方面: Array数据能够是基本类型何包装类型,ArrayList只能是包装类型.
容量方面:Array容量是静态固定的,ArrayList是动态变化的。
支持操做:ArrayList提供更多操做,Array提供的更多依赖于Arrays提供的方法。
使用建议:若是你的操做对象是基本型别,并且须要在空间不足时自动扩增容量,Array便不适合,此时就得使用外覆类的容器了。
                ArrayList存入对象时,抛弃类型信息,全部对象屏蔽为Object,编译时不检查类型,可是运行时会报错。
               基于效率和类型检验,应尽量使用Array,没法肯定数组大小时才使用ArrayList!
2二、Arraylist和Linkedlist有什么区别?
答:1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList以为优于LinkedList,由于LinkedList要移动指针。
3.对于新增和删除操做add和remove,LinedList比较占优点,由于ArrayList要移动数据。

2三、Comparable和Comparator接口是干什么的?列出它们的区别?
答:
Comparatable接口必须由须要排序的多元素类自己来实现,且在其内部重写comparaTo()方法;Comparator接口是在须要排序的多元素类的外部(即便用外部类)来实现,且必须在该外部类中重写compara()方法。
二者的比较

comparable接口: 优势:对于单元素集合能够实现直接排序 缺点:对于多元素排序,排序依据是固定不可更改的。(元素内部只能实现一次compareTo方法) comparator接口: 元素的排序依据时刻变的,因此能够经过定义多个外部类的方式来实现不一样的排序。使用时按照需求选取。 建立外部类的代价太大。 2四、Java中垃圾回收有什么目的?何时进行垃圾回收? 答: 目的:回收堆内存中再也不使用的对象,释放资源 回收时间:当对象永久地失去引用后,系统会在合适的时候回收它所占的内存 垃圾回收的目的是回收堆中已经不在被使用的对象。垃圾回收机制是一个守护线程,优先级别低,其在当前服务器空闲或堆中老年代等占用率较大时触发。

相关文章
相关标签/搜索