Java基础面试题总结

    多态:通过指向父类的指针,来调用不同子类中的实现方法。一个对象可以访问多个方法。
    继承:解决代码重复使用使用,将多个类存在的相同属性和方法抽象出父类,在父类中定义相同属性和方法。只需通过extends语句来声明继承
    封装:将类的信息隐藏在内部,不允许外部直接访问,允许通过类提供的方法来实现对隐藏信息进行操作和访问。
    重载:一个类中多个方法具有相同的名字,但方法中有不同的参数类型和不同的参数数量
    重写:子类实现的方法中,方法名与传参及返回值与父类中一样,具体实现跟父类不一样。
    反射:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的属性与方法。大大增强了程序扩展性。

    泛型:参数化类型。由原来具体的类型参数化,类似于方法中的变量参数,类型定义成参数形式,在使用或者调用时传入具体类型。可用于类与方法及接口中。
    序列化:将对象以一连串字节描述的过程。实现Serializable接口即可。反序列化(deserialization)是将字节重建成一个对象过程。
    接口与抽象类:一个类可实现多个接口,只能继承一个抽象类。抽象类可包含具体方法,声明和使用字段,接口所有方法都是抽象的,接口不能声明和使用字段。抽象类可定义构造抽象,接口不可以。

    线程安全与非线程安全:
        线程安全:对一个线程要访问某类中数据时,对其加锁保护,只有当此线程访问完成后,其它线程才能继续访问。
        非线程安全:多线程访问数据时,不对数据进行加锁保护,出现数据不一致,一般通synchronized字加锁控制。   

    线程同步与异步区别:
        同步:发出功能调用时,没有得到结果前,该调用不返回或继续执行后续操作。
        异步:当功能调用发出后,没有得到结果前,可以继续执行后续操作。(补充:同步是必须一件一件事做,异步可以多件事同时执行)

   final:
        类:修饰的类不能有子类,不能被继承
        方法:不能被重写
        变量:修饰变量与常量,不能被二次赋值
    static(静态):
        变量:类变量,由类创建所有对象,都共用这个属性,类变量随着类的加载而加载,即使未New对象,类变量也存在。而且仅一类份。类变量加载早于对象。
        方法:类方法,随着类加载而加载,没有new类,类方法存在,仅存在一份,内部可调用静态方法/属性,不能调用非静态属性和方法。非静态方法可调用静态方法/属性。

        类:普通类是不允许声明为静态,只有内部类才可以。当内部类没有使用static修饰时,是不能直接使用内部类创建对象,先使用外部类对象点new内部类对象。

集合:List、Set、Map    list与set继承collection接口,Map为独立接口
    List:Arraylist、Vector、LinkedList
    Set: HashSet、LinkedHashSet、TreeSet
    Map: HashTable、HashMap、TreeMap、LinkedHashMap
    
    List(有序且可重复):
        ArrayList:底层数据结构是数组,查询快,增删慢。线程不安全,效率高。
        LinkedList:底层数据结构是链表,查询慢,增删快。线程不安全,效率高。
        Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低。(补充:考虑并发使用vector,不考虑则使用arrayList)
    

    Set(无序且唯一):
        HashSet:底层数据结构是哈希表,
        LinkedHashSet:底层数据结构是链表和哈希表,链表保证元素有序,哈希表保证元素唯一
        TreeSet:底层数据结构是红黑树,排序两种类型;自然排序(元素)与定制排序(集合)

      Map
        HashMap:非线程安全,效率较高,允许key和value为null值。非线程同步,只允许一条记录为null。
        HashTable:线程安全,不允许Null值,支持线程同步,
        TreeMap: 有序,不允许key值为null,非线程同步。
   
    区别:
        arrayList与linkedList:ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add和remove,LinedList比较占优势,
因为ArrayList要移动数据。 

        HashMap与HashTable:Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。Hashtable既不支持Null key也不支持Null value。HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。Hashtable的初始长度是11,之后每次扩充容量变为之前的2n+1(n为上一次的长度)而HashMap的初始长度为16,之后每次扩充变为原来的两倍  

         HashMap与TreeMap:HashMap非线程安全,TreeMap 非线程安全。HashMap.数组方式存储key/value,线程非安全,允许null作为key和value,key不可以重复,value允许重复,不保证元素迭代顺序是按照插入时的顺序,key的hash值是先计算key的hashcode值,然后再进行计算,每次容量扩容会重新计算所以key的hash值,会消耗资源,
要求key必须重写equals和hashcode方法。treeMap:基于红黑二叉树的NavigableMap的实现,线程非安全,不允许null,key不可以重复,value允许重复,存入TreeMap的元素应当实现Comparable接口或者实现Comparator接口。

    多线程:
        创建线程方法:1、继承Thread类: 2、实现Runnable接口:3通过Callable、4、Future创建线程:

       线程生命周期:
            新建:用new关键字和Thread类或其子类建立一个线程对象后。
            就绪:具备运行条件,未分配到CPU
            运行:获取CPU资源后可执行CPU。可改变为就绪(失去CPU资源或调用yield让出CPU资源)、阻塞(调用sleep或调用阻塞式IO方法及等待notify)及死亡状态(强制性终止或调用stop或调用desyory)

         线程管理:
            线程睡眠(sleep):当前正在执行线程暂停一段时间并进入阻塞状态则调用sleep方法,进入到阻塞状态。
            线程让步(yield):让当前正在执行线程暂停,让出CPU资源给其它线程,进入到就绪状态。
            线程合并(join):将几个并行线程合并为一个单线程执行,当一个线程执行完毕时才能执行。
            sleep与yield区别:sleep方法暂停当前线程后,会进入阻塞状态,只有当睡眠时间到了,才会转入就绪状态。而yield方法调用后 ,是直接进入就绪状态,所以有可能刚进入就绪状态,又被调度到运行状态。②、sleep方法声明抛出了
InterruptedException,所以调用sleep方法的时候要捕获该异常,或者显示声明抛出该异常。而yield方法则没有声明抛出任务异常。③、sleep方法比yield方法有更好的可移植性,通常不要依靠yield方法来控制并发线程的执行。
      

            设置线程优先级:main线程具有普通优先级。thread提供setPriority和getPriority方法设置和返回一个指定线程的优先级。

            后台(守护)线程:守护线程使用的情况较少,但并非无用,举例来说,JVM的垃圾回收、内存管理等线程都是守护线程。还有就是在做数据库应用时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数、超时时间、状态等等。调用线程对象的方法setDaemon(true),则可以将其设置为守护线程。

        结束线程:正常执行完run方法,然后结束掉。控制循环条件和判断条件的标识符来结束掉线程。

        线程同步:同步方法、即有synchronized关键字修饰的方法。同步代码块、即有synchronized关键字修饰的语句块。使用特殊域变量(volatile)实现线程同步、volatile关键字为域变量的访问提供了一种免锁机制。使用重入锁(Lock)实现线程同步、在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。

        线程通信:借助于Object类的wait()、notify()和notifyAll()实现通信:线程执行wait()后,就放弃了运行资格,处于冻结状态;notify()执行时唤醒的也是线程池中的线程,线程池中有多个线程时唤醒第一个被冻结的线程。notifyall(), 唤醒线程池中所有线程。(1) wait(), notif(),notifyall()都用在同步里面,因为这3个函数是对持有锁的线程进行操作,而只有同步才有锁,所以要使用在同步中;(2) wait(),notify(),notifyall(),  在使用时必须标识它们所操作的线程持有的锁,因为等待和唤醒必须是同一锁下的线程;而锁可以是任意对象,所以这3个方法都是Object类中的方法。使用Condition控制线程通信。3、使用阻塞队列(BlockingQueue)控制线程通信
        
        死锁:互斥条件:资源不能被共享,只能被同一个进程使用。请求与保持条件:已经得到资源的进程可以申请新的资源。非剥夺条件:已经分配的资源不能从相应的进程中被强制剥夺。循环等待条件:系统中若干进程组成环路,该环路中每个进程都在等待相邻进程占用的资源。        处理死锁:忽略该问题,也即鸵鸟算法。当发生了什么问题时,不管他,直接跳过,无视它;检测死锁并恢复;资源进行动态分配;

        线程池:降低资源消耗,提高响应速度,提高线程的可管理性。使用Executors工厂类产生线程池,使用Java8增强的ForkJoinPool产生线程池

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值