Java面试题1

来源:互联网 发布:php递归算法经典实例 编辑:程序博客网 时间:2024/05/12 06:30

八种基本数据类型

四种整数类型(byte、short、int、long):byte:8 位,一个字节;short:16 位,两个字节;int:32 位、四个字节,最常用;long:64 位、八个字节,次常用。默认值都是0,long类型的是0L

双精度浮点型(float,double):float:四个字节,默认值为0.0f;double:八个字节,默认值为0.0d

布尔类型:boolean:字节数视编译环境而定,默认值为false

字符型:char:两个字节,默认值为'\n0000'


Java中的多态

实现多态的技术称为动态绑定,就是指在程序执行期间判断所引用的对象的实际类型,根据其实际的类型调用其相应的方法。

多态的作用就是消除类型之间的耦合关系。
多态性存在有三个必要条件:
1、要有继承2、要有重写3、须是父类引用指向子类对象
多态实现的方式:接口实现、继承父类方法进行重写、同一个类中进行方法重载。


Java变量的分类 
1,变量所属的数据类型划分,可分为2种: 基本数据类型变量 
Java基本数据类型包括byte、short、char、int、long、float、double、boolean 一共8种,所以比如,int i; 就是基本数据类型变量 引用数据类型变量,除了这8种基本数据类型以外,全是引用数据类型,目前有  类、接口、数组、枚举、注解 所以 String s; 就是引用数据类型变量 
2,变量声明的位置划分,也可分为2类 成员变量:类内部,方法外部 声明的变量 
局部变量:方法或语句块内部声明的变量


Java里面有没有全局变量?为什么?
Global variables(全局变量)是指可以全局访问的变量,Java不支持全局变量,原因如下:
1. 全局变量破坏了引用的透明性。
2. 全局变量制造了命名空间冲突。


匿名内部类是否可以继承其他类,是否可以实现接口?

没有名字的内部类,不能继承其他类,可以作为接口被其他内部类实现。


抽象类能不能继承实体类?

可以,前提是实体类有明确的构造函数,比如object类。


==和equals的区别
==用于判断两个引用变量是否指向同一个对象实例,着重比较内存位置equals用于判断两个值是否相等。


String、StringBuffer和StringBuilder的区别
String类是不可变类,任何对String的改变都会引发新的String对象的生成;StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象。
StringBuffer和StringBuilder在使用(方法)上几乎一样
如果我们的程序是在单线程下运行,或者是不必考虑到线程同步问题,我们应该优先使用StringBuilder类;如果要保证线程安全,自然是优先使用StringBuffer了。


String s = newString("xyz");创建了几个String Object?
答:两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。


ArrayList与LinkedList的差别?
ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦
LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是查找非常麻烦要丛第一个索引开始
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2. 对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
3. 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据 


HashMap和HashTable的差别?
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差别。


Java中的内存划分?

Java 把内存划分成两种:一种是栈内存,另一种是堆内存。
堆内存用来存放由 new 创建的对象和数组,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!
一个栈内存只能指向一个对内存空间,如果要想再指向其他的堆内存空间,则必须先断开已有的指向才能分配新的指向。
在java中主要存在4块内存空间,这些内存的名称及作用如下:
栈内存空间:保存所有的对象名称(更准确地说是保存了引用的堆内存空间的地址)
堆内存空间:保存每个对象的具体属性内容。
全局数据区:保存static类型的属性。(java中没有全局变量)
全局代码区:保存所有的方法定义。


synchronized关键字的用法?
当synchronized关键字修饰一个方法的时候,该方法叫做同步方法。
Java中的每个对象都有一个锁(lock),或者叫做监视器(monitor),当一个线程访问某个对象的synchronized方法时,将该对象上锁,其他任何线程都无法再去访问该对象的synchronized方法了(这里是指所有的同步方法,而不仅仅是同一个方法),直到之前的那个线程执行方法完毕后(或者是抛出了异常),才将该对象的锁释放掉,其他线程才有可能再去访问该对象的synchronized方法。
注意这时候是给对象上锁,如果是不同的对象,则各个对象之间没有限制关系。
如果某个synchronized方法是static的,那么当线程访问该方法时,它锁的并不是synchronized方法所在的对象,而是synchronized方法所在的类所对应的Class对象。Java中,无论一个类有多少个对象,这些对象会对应唯一一个Class对象,因此当线程分别访问同一个类的两个对象的两个static,synchronized方法时,它们的执行顺序也是顺序的,也就是说一个线程先去执行方法,执行完毕后另一个线程才开始。
synchronized方法是一种粗粒度的并发控制,某一时刻,只能有一个线程执行该synchronized方法;
synchronized块则是一种细粒度的并发控制,只会将块中的代码同步,位于方法内、synchronized块之外的其他代码是可以被多个线程同时访问到的。


本文章内容摘抄自互联网,如有雷同纯属巧合,如有错误欢迎各位批评指正

0 0
原创粉丝点击