面试集锦(二)

一、集合类    set 无序,唯一    map    list  有序,可重复

a) Hashset     底层数据结构是哈希表。 哈希表依赖两个方法:hashCode()equals()

     执行顺序:
                               首先判断hashCode()值是否相同
                        是:继续执行equals(),看其返回值
                              true:说明元素重复,不添加
                              false:就直接添加到集合
                              否:就直接添加到集合

b) Hashmap     底层数据结构是哈希表。线程不安全,效率高

c) Hashtable    底层数据结构是哈希表。线程安全,效率低

d) Arraylist     底层数据结构是数组,查询快,增删慢  线程不安全,效率高

e) Linkedlist    底层数据结构是链表,查询慢,增删快  线程不安全,效率高

f) Treeset      底层数据结构是红黑树。(是一种自平衡的二叉树)

    两种方式
           自然排序(元素具备比较性)
                            让元素所属的类实现Comparable接口
           比较器排序(集合具备比较性)
                            让集合接收一个Comparator的实现类对象

g) Treemap     底层数据结构是红黑树。(是一种自平衡的二叉树)

h) Vector       底层数据结构是数组,查询快,增删慢   线程安全,效率低

i)  LinkedHashSet      底层数据结构由链表和哈希表组成。
                                由链表保证元素有序由哈希表保证元素唯一。

j)  LinkedHashMap       底层数据结构由链表和哈希表组成。

二、

  数组Array和列表ArrayList的区别:

Array可以包含基本的数据类型和对象类型,ArratList只能包含对象类型

Array大小是固定的,ArrayList的大小是动态变化的

ArrayList提供了更多的方法和特性,addAll(),removeAll()等。

三、

  LinkedListArrayList的区别:

 

         都实现了List接口,

 

ArrayList是基于索引的数据接口,它的底层是数组,以时间复杂度对元素随机访问

 

LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起;

 

相对于ArrayListLinkedList的插入、删除操作速度更快,不需要像数组计算大小和更新索引,但LinkedList更加占用内存。

四、

  迭代器:Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例 的迭代方法。迭代气可以在迭代的过程中删除底层集合的元素。

五、

  HashMap Hashtable  有什么区别:

都实现了map接口

Hashmap的键和值可以为null,而hashtable不允许键或值是null

Hashtable是同步的(多线程环境),而hashmap不是(单线程的环境)

Hashmap提供了可以选择应用的键的集合,hashtable提供了对键的列举

六、

   HashSetTreeSet的区别:

 

HashSet是有一个hash表来实现的,因此他的元素是无序的,add()  remove() 等方法

 

TreeSet是由一个树形的结构来实现的,它的元素是有序的。

七、

break:作用于switch ,和循环语句,用于跳出,或者称为结束。

 

break语句单独存在时,下面不要定义其他语句,因为执行不到,编译会失败。当循环嵌套时,break只跳出当前所在循环。要跳出嵌套中的外部循环,只要给循环起名字即可,这个名字称之为标号。

 

continue:只作用于循环结构,继续循环用的。

 

作用:结束本次循环,继续下次循环。该语句单独存在时,下面不可以定义语句,执行不到。

八、

  接口和抽象类的区别是什么?

 

Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
类可以实现很多个接口,但是只能继承一个抽象类
类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
抽象类可以在不提供接口方法实现的情况下实现接口。
Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
Java接口中的成员函数默认是public的。抽象类的成员函数可以是privateprotected或者是public
接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。

 

九、

  Java支持多继承么?

 

Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口支持多继承,,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)。

 

十、

  什么是值传递和引用传递?

 

值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.

 

引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身  所以对引用对象进行操作会同时改变原对象.

 

一般认为,java内的传递都是值传递.

 

十一、

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 ()方法,则该线程结束生命周期。死亡的线程不可再次复生。

十二、

  同步方法和同步代码块的区别是什么?

 

同步方法默认用this或者当前类class对象作为锁;

 

同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法;

 

十三、

  IteratorListIterator的区别是什么?

 

Iterator可用来遍历SetList集合,但是ListIterator只能用来遍历List
Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

 

十四、

  Try   catch  finally  throw   throws 

try块表示程序正常的业务执行代码。如果程序在执行try块的代码时出现了“非预期”情况,JVM将会生成一个异常对象,这个异常对象将会被后面相应的catch块捕获。

catch块表示一个异常捕获块。当程序执行try块引发异常时,这个异常对象将会被后面相应的catch块捕获。

throw用于手动地抛出异常对象。throw后面需要一个异常对象。

throws用于在方法签名中声明抛出一个或多个异常类,throws关键字后可以紧跟一个或多个异常类。

finally块代表异常处理流程中总会执行的代码块。

对于一个完整的异常处理流程而言,try块是必须的,try块后可以紧跟一个或多个catch块,最后还可以带一个finally块。

try块中可以抛出异常。

十五、

  JSP九大内置对象

  1. request            HttpServletRequest  
  2. response         HttpServletResponse  
  3. config              ServletConfig  
  4. application       ServletContext  
  5. session            HttpSession  
  6. exception         Throwable  
  7. page                Object(this)  
  8. out                   JspWriter  
  9. pageContext    PageContext 

  四个作用域  

  1. ServletContext     context域  
  2. HttpServletRequet  request域  
  3. HttpSession        session域     --前三种在学习Servlet时就能接触到  
  4. PageContext        page域     --jsp学习的 

十六、

  Object自带的方法:

a) Equals

b) Hashcode

c) Notify

d) Wait

e) Clone

f) Tostring

g) Getclass    返回此object类的运行时态

十七、

  解释一下Applet的生命周期

 

applet可以经历下面的状态:
Init:每次被载入的时候都会被初始化。
Start:开始执行applet
Stop:结束执行applet
Destroy:卸载applet之前,做最后的清理工作。

 

十八、

Java集合类里面最基本的接口有:
Collection:代表一组对象,每一个对象都是它的子元素。
Set:不包含重复元素的Collection
List:有顺序的collection,并且可以包含重复元素。
Map:可以把键(key)映射到值(value)的对象,键不能重复。

十九、猴子吃桃

public class lianxi17 {

public static void main(String[] args) {

int x = 1;

for(int i=2; i<=10; i++) {

x = (x+1)*2;

}

System.out.println("猴子第一天摘了 " + x + " 个桃子");

}

}

二十、

  Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?

 

JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。
堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。

 

posted @ 2018-05-03 19:26  丶不学无术丶  阅读(118)  评论(0编辑  收藏  举报