java面试题

1.      简述你所知道的Linux                                                                                        Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIXUNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

2.      什么是Java虚拟机?为什么Java被称作是平台无关的编程语言             jvm java中的虚拟机,会将.java文件预编译成字节码文件最后回通过特定语言规则的系统反编译回去在任何语言中都可以运行的代码

3.JDKJREJVM关系是什么?                                                                                    Java开发工具包   java运行时环境    java虚拟机

JDK中包含jre  +  jvmjvm是在jre下运行

4.Java支持的数据类型有哪些?什么是自动拆装箱?

八种基本数据类型:byte int long short char Boolean float double

八种封装类和基本数据类型自由转换

5.面向对象是什么?

面向对象(Object Oriented,OO)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术 [1]  发展到一定阶段后的产物。

6.请写出下面几个表达式的结果,答案可以用10进制或16进制书写

1).0xaa | 0x55  255
2). 15 & 240  0
3). 10 ^ 12 
 6
4). -2 >> 1 -1
5). -2 >>> 1   2147483647

7.&&&的区别?

一个&是将与号两边的值无论前面是否对错都要对与号后面的进行判断

&&只要前面的表达式不成立就不再进行第二个的判断

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

值传递是传递的引用的内容,多使用在基本数据类型,引用传递(参数是引用数据类型)是传递的数据在堆中的地址给变量

9.是否可以在static环境中访问非static变量?

不可以,静态方法不可以访问非静态的属性和方法,反之成立

10.Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

重载是在一个类中对已存在的一个方法进行复制,方法名相同方法参数类型和个数不同

重写发生在继承中子类继承父类重写父类中的方法要求方法名相同,但是子类不允许有比父类更加严格的修饰类型

11.Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?

构造方法是当我们创建对象的时候需要调用的方法,如果没有写,系统会自动为我们创建一个无参构造 new 构造方法;

构造方法重载就是对构造方法的重载,对构造方法的参数个数以及参数类型进行修改,创建对象时根据传递的参数选择调用的构造方法

Java中没有复制构造方法

12.Java支持多继承么?

不支持,java中一个子类只允许有一个父类但是

13.解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。

栈:每个线程启动时开辟一个栈内存,栈中存放成员变量,程序执行时会将方法压栈,栈不是共享的

堆是存放数据的地方,是线程共享的方法区是存放静态变量的地方也是线程共享的

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

1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。

2、抽象类要被子类继承,接口要被类实现。

3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现

4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。

5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。

6、抽象方法只能申明,不能实现,接口是设计的结果,抽象类是重构的结果

7、抽象类里可以没有抽象方法

8、如果一个类里有抽象方法,那么这个类只能是抽象类

9、抽象方法要被实现,所以不能是静态的,也不能是私有的。

10、接口可继承接口,并可多继承接口,但类只能单根继承。抽象类中必须有一个抽象方法其他与普通类相同

15.用最有效率的方法计算2乘以8

2<<3

16.手写单例模式(饿汉和饱汉模式)和工厂模式?

Publicclass A

Privatestatic A a = new A();

PrivateA(){}

Publicstatic A getNewA(){

returna;

 

Publicclass A

PrivateA a = null;

PrivateA(){}

Publicstatic A getNewA(){

a =new A();

returna;

工厂模式:一个抽象类,抽象一类东西共有属性,再加几个实体类加上这个类特有属性

17.StringStringBuilderStringBuffer的区别?

运行速度快慢为:StringBuilder > StringBuffer > String

String是不带缓冲区的,其他两个是带有缓冲区的,

StringBuilder是线程不安全的,StringBuffer是线程安全的

18.Java集合框架是什么?说出一些集合框架的优点

每种编程语言中都有集合,最初的Java版本包含几种集合类:VectorStackHashTableArray。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。集合框架的部分优点如下:

1)使用核心集合类降低开发成本,而非实现我们自己的集合类。

2)随着使用经过严格测试的集合框架类,代码质量会得到提高。

3)通过使用JDK附带的集合类,可以降低代码维护成本。

4)复用性和可操作性。Collection 接口有其实现是List(ArrayList,LinkList)Set(HashSet,

Map接口 HashMap TreeMap

19.集合框架中的泛型有什么优点?

限制存入集合的引用类型为同种类型对象

21.为何Collection不从CloneableSerializable接口继承

Collection表示一个集合,包含了一组对象。如何存储和维护这些对象是由具体实现来决定的。因为集合的具体形式多种多样,例如list允许重复,set则不允许。而克隆(clone)和序列化(serializable)只对于具体的实体,对象有意义,你不能说去把一个接口,抽象类克隆,序列化甚至反序列化。所以具体的collection实现类是否可以克隆,是否可以序列化应该由其自身决定,而不能由其超类强行赋予。

如果collection继承了cloneserializable,那么所有的集合实现都会实现这两个接口,而如果某个实现它不需要被克隆,甚至不允许它序列化(序列化有风险),那么就与collection矛盾了。

22.为何Map接口不继承Collection接口?

尽管Map接口和它的实现也是集合框架的一部分,但Map不是集合,集合也不是Map。因此,Map继承Collection毫无意义,反之亦然

23.什么是迭代器(Iterator)

迭代器是要实现可迭代接口的集合用来遍历集合中内容的方法,实现可迭代接口的是Collection接口Map没有实现

24.IteratorListIterator的区别是什么?

ListIterator只能用于ListIterator是通用的

Iterator容易引起并发修改异常问题,而ListIterator可以避免线程安全问题的发生,因为其有内置的add()等修改集合的方法。

ListIteratorIterator都有hasNext()next()方法,可以实现顺序向后遍历,但是ListIteratorhasPrevious()previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。

ListIterator可以定位当前的索引位置,nextIndex()previousIndex()可以实现。Iterator没有此功能。

都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。

25.快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。

26.Java中的HashMap的工作原理是什么?

Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算keyhash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(loadfactor)和扩容极限(threshold resizing)

 27.当两个对象的hashcode相同会发生什么?

对象相等则hashCode一定相等;

2)hashCode相等对象未必相等。

29.hashCode()equals()方法有何重要性?

若重写了equals(Object obj)方法,则有必要重写hashCode()方法。

2.若两个对象equals(Object obj)返回true,则hashCode()有必要也返回相同的int数。

3.若两个对象equals(Object obj)返回false,则hashCode()不一定返回不同的int数。

4.若两个对象hashCode()返回相同int数,则equalsObject obj)不一定返回true

5.若两个对象hashCode()返回不同int数,则equalsObject obj)一定返回false

6.同一对象在执行期间若已经存储在集合中,则不能修改影响hashCode值的相关信息,否则会导致内存泄露问题

30.HashMapHashtable有什么区别?

HashMap是线程安全的,Hashtable 是非线程安全的

HashMap是支持null键和null值的,而HashTable在遇到null时,会抛出NullPointerException异常

31.如何决定选用HashMap还是TreeMap

TreeMapkey按自然增加顺序排序,HashMap没有顺序,HashMap速度快.

 

32.ArrayListVector有何异同点?

Vector是多线程安全的,而ArrayList不是,这个可以从源码中看出,

Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比;

2、两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同的,

很多网友说Vector增加原来空间的一倍,ArrayList增加原来空间的50%

3Vector可以设置增长因子,而ArrayList不可以,。

33.ArrayArrayList有何区别?什么时候更适合用Array

Array数组可以包含基本类型和对象类型,ArrayList却只能包含对象类型。

Array数组在存放的时候一定是同种类型的元素。ArrayList就不一定了,因为ArrayList可以存储Object

它的空间大小是固定的,空间不够时也不能再次申请,所以需要事前确定合适的空间大小。

ArrayList的空间是动态增长的,如果空间不够,它会创建一个空间比原空间大一倍的新数组,

然后将所有元素复制到新数组中,接着抛弃旧数组。而且,每次添加新的元素的时候都会检查内部数组的空间是否足够。

适用场景:

如果想要保存一些在整个程序运行期间都会存在而且不变的数据,

我们可以将它们放进一个全局数组里,但是如果我们单纯只是想要

以数组的形式保存数据,而不对数据进行增加等操作,只是方便我

们进行查找的话,那么,我们就选择ArrayList。而且还有一个地方

是必须知道的,就是如果我们需要对元素进行频繁的移动或删除,

或者是处理的是超大量的数据,那么,使用ArrayList就真的不是

一个好的选择,因为它的效率很低,使用数组进行这样的动作就很

麻烦,那么,我们可以考虑选择LinkedList

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值