java面试基础概念





class C {
    C() {
        System.out.print("C");
    }
}
 
class A {
    C c = new C();
 
    A() {
        this("A");
        System.out.print("A");
    }
 
    A(String s) {
        System.out.print(s);
    }
}
 
class Test extends A {
    Test() {
        super("B");
        System.out.print("B");
    }
 
    public static void main(String[] args) {
        new Test();
    }
}




  super("B"):表示调用父类的构造方法,不调用父类的无参数构造,输出B。
 所以就是先执行A的父类输出 C
  然后调用A中有参数的构造方法输出 B
  最后输出 B


 答案:CBB






1.java虚拟机是什么? 为什么java被称作为与运行平台无关的语言?
Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统
java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行.


2.虚拟机是什么?
 通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。


3.jdk是什么?jre是什么?
  jdk是完整的java软件开发工具包,包含了jre编译器和其他开发工具(javadoc,java调试器).
  jre是java运行时环境,包含java核心类库以及支持文件,某种概念讲属于jdk的子集.


4.static关键字是什么?


5.java支持的基本数据类型是什么?什么是拆箱装箱(自动拆装箱)?
基本类型有byte short int long double float char boolean


自动拆装箱是因为基本数据类型不具备面向对象的特性,故编译器在基本数据类型和对应的对象包装类型件的转化.


6.java的引用类型.
java支持的数据类型包括两种一种是基本数据类型,
另一种是引用类型如String等,即是对对象的引用,jvm中虚拟栈中存的是对象的地址,创建的对象实质在堆中,通过地址来找到堆中的对象的过程称为引用类型.


7.方法覆盖(overriding)?方法重载(overloading)?
方法重载:函数名相同,函数的参数列表不同(包括参数个数和参数类型),至于返回类型可同可不同.
方法覆盖:若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法(在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖).
8.Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?




当新对象被创建的时候,构造方法会被调用。每一个类都有构造方法。在程序员没有给类提供构造方法的情况下,Java编译器会为这个类创建一个默认的构造方法。
Java中构造方法重载和方法重载很相似。可以为一个类创建多个构造方法。每一个构造方法必须有它自己唯一的参数列表。
Java不支持像C++中那样的复制构造方法,这个不同点是因为如果你不自己写构造方法的情况下,Java不会创建默认的复制构造方法。


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






11.进程是什么,线程是什么?他们的区别在哪?
  进程是执行着的程序,是程序的一种动态形式,是cpu,内存等资源占用的基本单位,进程之间相互独立,通信比较困难,进程在执行的过程中,包含比较固定的入口,执行顺序,出口,而线程的这些过程会被应用程序所控制.
线程是进程内部的一个执行序列,一个进程可以有多个线程,线程又叫做轻量级进程,属于某个线程,线程不能占有这些资源,线程之间共享一块内存区域,通信比较方便.




12.创建线程的方式?
继承thread类
实现runnable接口
应用程序可以使用Executor框架来创建线程池
实现Callable接口


实现runnable接口这种方式更好一点,因为不需要继承thread类,在应用设计中已经继承了别的对象的情况下,需要多继承而java不支持多继承,只能实现接口.


13.什么是死锁?
死锁是指多个进程(包括线程)因竞争资源而造成的一种僵局.
产生死锁的四个必要条件:
互斥条件:进程要求对所分配的资源进行排他性控制,就是在一个时间段内该资源仅能被一个进程占有,其他请求该资源的进程只能进行等待.
不剥夺条件:进程使用资源在未未使用完毕之前,不能被其他进程夺走,只能通过该资源的进程释放(主动释放).
请求和保持条件:进程已经保持了一个资源,但又提出了新的资源请求,而该资源已经被进其他进程占有,此时请求阻塞,但对自己已获得的资源保持不放.
循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得资源的同时被链中下一个进程所请求,即存在一个处于等待状态的进程集合{Pl, P2, ..., pn},其中Pi等 待的资源被P(i+1)占有(i=0, 1, ..., n-1),Pn等待的资源被P0占有.

避免死锁的技术:
加锁顺序:线程按照一定顺序加锁
加锁时限:线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁.
死锁检测.


14.集合类框架的基本接口有哪些?


集合类接口制定了一组叫做元素的对象.集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序的键,有些不允许.


java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类.集合类中最基本的接口有:


Collection:代表了一组对象,每一个对象都是它的子元素.
Set:不包含重复元素的Collection.
List:有顺序的collection,并且可以包含重复元素.
Map:可以把键值(key)映射到值(value)的对象,键不能重复.


15.为什么集合类没有实现克隆(cloneable)和serializable序列化接口?
克隆cloning或者序列化serializable的语义和含义是跟具体的实现相关的.因此,应该由集合类的具体实现来决定如何被克隆和序列化.


16.什么是迭代器
iterator接口提供了很多对集合元素进行迭代的方法.每一个集合类都包含了可以返回迭代器实例的迭代方法.迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的.
remove(Object obj)删除,可以通过迭代器的remove()方法删除.


17.Hashmap和Hashtable有什么区别/


Hashmap和hashtable都实现了map接口,有很多相同的特性,不同在于:
hashmap允许键和值都是null,而hashtable不允许键或值是null.
hashtable是同步的,而hashmap不是的.因此,hashmap更适合于单线程环境,而hashtable适合于多线程环境.
HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。
一般认为Hashtable是一个遗留的类。
18.数组array和列表arraylist有什么区别?什么时候应该使用array而不是arraylist?


array可以包含基本类型和对象类型,arraylist只能包含对象类型.
array大小是固定的,arraylist的大小是动态变化的
arraylist提供了了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等
对于基本数据类型,采用拆装箱,但是当处理固定大小的基本数据类型的时候,这种方式相对比较慢.


19.arraylist和linkedlist有什么区别?


arraylist是基于索引的数据接口,它的底层是数组(内存中连续的某一块),它可以以O(1)时间复杂度对元素进行随机访问,就是查询快,进行操作(增删查改)慢,需要重新计算数组的空间.
linkedlist是以元素列表的形式存储它的数据,链表形式(每一个元素都和它前一个和后一个元素链接在一起),在这种情况下,查找某个元素的复杂度是O(n).查询慢,但操作快.


20.comparable和comparator接口有什么用?区别在?


java提供了只包含一个compare To()方法的comparable接口.这个方法可以给两个对象排序,具体来说,它返回负数,0,正数,来表明已经存在的对象小于等于大于输入对象.

java提供了包含compara()和eauals()两个方法的comparator接口.
compare()方法用来给两个参数排序,返回负数,0,正数表明第一个参数是小于等于大于第二个参数.
equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等.只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。


21.大O符号(big-O notation)?你能给出不同数据结构的例子么?


大O符号描述了当数据结构里面的元素增加的时候,算法的规模或者是一个渐进上界 。
大O符号也可用来描述其他的行为,比如:内存消耗。因为集合类实际上是数据结构,我们一般使用大O符号基于时间,内存和性能来选择最好的实现。大O符号可以对大量数据的性能给出一个很好的说明。


22.如何权衡是使用无序的数组还是有序的数组?


有序数组最大的好处在于查找的时间复杂度是O(LOG N),插入操作的时间复杂度是o(n),值大的元素需要给值小的元素腾位置.
  无序数组是O(N),插入时间复杂度是常量o(1).








\
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值