java—面试题1

1、java引用类型

 类,接口,数组

2、抽象类和接口的区别

1)抽象类中提供成员方法的实现细节,接口中只能是public abstract修饰,即只能是抽象方法。
2)抽象类中成员变量可实现多种权限public private protected final 等,接口中只能用public static final修饰。
3)抽象类中可以有静态方法和静态代码块,接口中不能有静态方法和静态代码块。

4)单继承多实现。

1)抽象类是对事物的抽象,即对类抽象;接口是对行为抽象,即局部抽象。

2)抽象类是多个子类的像类,是一种模板式设计;接口是一咱形为规范,是一种辐射式设计。

3、主要设计模式优缺点(转载)

https://blog.csdn.net/wanglingxxx/article/details/52859815

4、数组多大放到年老代?

jvm提供一个参数(PretenureSizeThreshold ),大约是3MB,超过即可放入年老代。

5、老年代中数组访问方式

数组引用访问

6、String类为什么是final的。 

首先要知道final,final定义的类不能被继承,主要是为了“效率” 和 “安全性” 的缘故。若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。

7、new对象如何不分配在堆而分配在栈上?

 其实这种问题从类和对象的内部分析是很好理解的,首先要知道的是 
 栈(stack):局部变量、声明对象的引用名、数组的引用名,定义的类方法中的参数以及局部变量
  堆(heap)  :new出来的“东西”(如:对象的实体,数组的实体),含成员变量(即所谓的全局变量)

  紧接着对象的引用要与对象的实体进行关联:栈中的对象引用中保存了堆中的实体的首地址,因而才可以正常编译、运行。 

8、java的队列都有哪些?有什么区别?

阻塞队列、普通队列,非阻塞队列。

阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。

9、异常的结构(运行时异常,非运行时异常)    

(1)运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

当出现RuntimeException的时候,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。 
出现运行时异常后,如果没有捕获处理这个异常(即没有catch),系统会把异常一直往上层抛,一直到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。 
如果不想终止,则必须捕获所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。


(2)非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。如IOException、SQLException等以及用户自定义的Exception异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch并处理,否则程序就不能编译通过。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。

 

10、hashCode() 与 equals() 生成算法、方法怎么重写

http://blog.sina.com.cn/s/blog_5da93c8f0101djjr.html

11、java基础类型

int     32bit
short   16bit
long     64bit
byte     8bit
char     16bit
float   32bit
double   64bit

boolean 1bit

12、java7和java8的区别?

1.Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下:

1
2
3
4
5
6
interface  Formula { 
     double  calculate( int  a);   
      default  double  sqrt( int  a) { 
         return  Math.sqrt(a); 
    
}

 2.lambda表达式

 形参列表=>函数体
函数体多于一条语句的可用大括号括起。

类型
可以将此表达式分配给委托类型,如下所示:

1
2
3

delegate int del(int i);
del myDelegate = x=>{return x*x;};
int j = myDelegate(5);//j=25

3.函数式接口

13、HashMap与Hashtable区别?

    1)HashMap不是线程安全的,Hashtable是线程安全的一个collection

    2)继承的父类不同。

    3)HashMap没有提供contains方法

    4)HashMap中null可以作为键值。

14、Hash冲突解决办法

  哈希表,哈希函数,链地址法,再哈希树

15、string,stringbuild,stringbuffer的区别

(1)string

       1,Stirng是对象不是基本数据类型 
       2,String是final类,不能被继承。是不可变对象,一旦创建,就不能修改它的值。 
       3,对于已经存在的Stirng对象,修改它的值,就是重新创建一个对象,然后将新值赋予这个对象 

(2)stringBuffer

   1,一个类似于 String 的字符串缓冲区,对它的修改的不会像String那样重创建对象。 
   2,使用append()方法修改Stringbuffer的值,使用toString()方法转换为字符串。 

(3)stringBuild

       是jdk1.5后用来替换stringBuffer的一个类,大多数时候可以替换StringBuffer。和StringBuffer的区别在于Stringbuild是一个单线程使用的类,不值执行线程同步所以比StringBuffer的速度快,效率高。是线程非安全的。


16、反射中,Class.forName与classloader的区别

Java中Class.forName和classloader都可以用来对类进行加载。

Class.forName除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。

而classloader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。Class.forName(name,initialize,loader)带参数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象。



17、ArrayList、LinkedList,Vestor实现与区别

  1)ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 
     对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 

     对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 

2)ArrayList,LinkedList是不同步的,而Vestor是同步的。所以如果不要求线程安全的话,可以使用ArrayList或LinkedList,可以节省为同步而耗费的开销。但在多线程的情况下,有时候就不得不使用Vector了。当然,也可以通过一些办法包装ArrayList,LinkedList,使他们也达到同步,但效率可能会有所降低。 

      从内部实现机制来讲ArrayList和Vector都是使用Objec的数组形式来存储的。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。 

3)对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对 ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是 统一的,分配一个内部Entry对象。 
    在ArrayList的 中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。 

    LinkedList不 支持高效的随机元素访问。 

     ArrayList的空 间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当大。

18、JVM中的七个区

  • 方法区
  • 虚拟机栈
  • 本地方法栈
  • 程序计数器
  • 执行引擎
  • 本地库接口
  • 堆溢出,当我们创建的对象占用的内存超过最大堆容量时候,会抛出OOM
  • 本地方法栈和虚拟机栈溢出:当请求的栈深度超过虚拟机所允许的深度的时候会抛出栈溢出,这种情况我们在使用递归出错的时候经常遇到;还有就是出现OOM的情况,我们知道分配给这两个栈的内存是有限,和线程数和线程的栈内存有关系,那么当我们其中任意一个过大的话,都有可能造成OOM
  • 方法区和运行时常量池溢出:方法区存放类的信息,有时我们用的框架在动态代理的时候会动态生成CLASS,有时候有很多jsp的时候,这个时候有可能会出现方法区的OOM;而常量池溢出我们可以用String的intern方法(如果常量池没有与字符串相等的字符串,就将这个字符串存入方法区,注意在不同的版本是不同的,1.6之前会将字符串实例复制到永久代,而1.7的没有复制实例,只是在常量池记录首次出现的实例引用)进行模拟。

19、关系型和非关系型数据库比较

非关系型数据库的优势:1. 性能NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。2. 可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。

关系型数据库的优势:1. 复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。2. 事务支持使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库,对方的优势就是自己的弱势,反之亦然。

20、ConcurrentHashMap的高并发性:

    1)用分离锁实现更深层次的访问。

    2)用HashEntry对象的不变性来降低读操作时对对象的加锁需求。

    3)通过对同一个volatile变量的写/读访问,协调不同线程之间的读/写操作的内存可见性。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值