zoukankan      html  css  js  c++  java
  • 面试常见题型(一)

    面向对象和面向过程有什么区别,什么是面向对象?

    • 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

    • 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

    Arraylist和Linkedlist有什么区别?

    1、数据结构不同

    ArrayList是Array(动态数组)的数据结构,LinkedList是Link(链表)的数据结构。

    2、效率不同

    当随机访问List(get和set操作)时,ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。

    当对数据进行增加和删除的操作(add和remove操作)时,LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。

    3、自由性不同

    ArrayList自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;而LinkedList自由性较高,能够动态的随数据量的变化而变化,但是它不便于使用。

    4、主要控件开销不同

    ArrayList主要控件开销在于需要在lList列表预留一定空间;而LinkList主要控件开销在于需要存储结点信息以及结点指针信息。

    红黑树和平衡二叉树区别如下:

    1、红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。
    2、平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。

    线程的同步机制

    临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别
    1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。
    2、互斥量:采用互斥对象机制。只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享 .互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。
    3、信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目 .信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。

    PV操作及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的。信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用共享资源的进程数。
       P操作申请资源:
      (1)S减1;
      (2)若S减1后仍大于等于零,则进程继续执行;
      (3)若S减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转入进程调度。
      
      V操作 释放资源:
      (1)S加1;
      (2)若相加结果大于零,则进程继续执行;
      (3)若相加结果小于等于零,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程继续执行或转入进程调度。

    4、事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作 .

    总结:
      1.互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。
      2.互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。所以可以使用WaitForSingleObject来等待进程和线程退出。
      3.通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计数器。

    进程通信机制

    参考博客

    进程间常见的通信方式:
    (1)管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
    (2)命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
    (3)消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
    (4)共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
    (5)信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
    (6)套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
    (7)信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

    七种进程间通信方式的总结:
    (1)管道:速度慢,容量有限,只有父子进程能通讯。
    (2)FIFO:任何进程间都能通讯,但速度慢。
    (3)消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。
    (4)信号量:不能传递复杂消息,只能用来同步。
    (5)共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存。
    (6)套接字和信号支持不同主机上的两个进程IPC。

    进程的调度策略

    先来先服务调度算法

    短作业(进程)优先调度算法

    时间片轮转法

    最短作业优先

    最短剩余时间优先

    响应比最高者优先: 在批处理系统中,短作业优先算法是一种比较好的算法,其主要的不足之处是长作业的运行得不到保证。如果我们能为每个作业引入前面所述的动态优先权,并使作业的优先级随着等待时间的增加而以速率a 提高,则长作业在等待一定的时间后,必然有机会分配到处理机。该优先权的变化规律可描述为 等待时间+执行任务的时间/执行任务的时间

    根据响应时间、周转时间、进程执行时间的稳定性、吞吐量、处理器利用率等来判断策略的好坏

    死锁的概念、条件和策略

    1). 死锁的概念

      在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的讲,就是两个或多个进程无限期的阻塞、相互等待的一种状态。

    2). 死锁产生的四个必要条件

    互斥:至少有一个资源必须属于非共享模式,即一次只能被一个进程使用;若其他申请使用该资源,那么申请进程必须等到该资源被释放为止;
    占有并等待:一个进程必须占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有;
    非抢占:进程不能被抢占,即资源只能被进程在完成任务后自愿释放
    循环等待:若干进程之间形成一种头尾相接的环形等待资源关系

    3). 死锁的处理基本策略和常用方法
      解决死锁的基本方法主要有 预防死锁、避免死锁、检测死锁、解除死锁 、鸵鸟策略 等。

    TCP的可靠传输机制

    参考的博客

    可靠传输的要求

    所谓的可靠,就是能保证数据的正确性,无差错、不丢失、不重复、并且按序达到。

    TCP可靠传输的机制原理

    TCP首先采用三次握手来建立连接、四次挥手来释放连接。其次TCP采用了连续ARQ协议,即自动重传请求(Automatic Repeat-reQuest)来保证数据传输的正确性,使用滑动窗口协议来保证接收方能够及时处理接收到的数据,进行流量控制。最后TCP使用慢开始、拥塞避免、快重传、快恢复来进行拥塞控制,避免网络拥堵。下面我们将分别介绍三次握手、四次挥手、连续ARQ、拥塞控制。

    B+树,问B+树与B树有什么区别

    B树:1.叶子节点和非叶子节点都存数据。2.数据无链指针。
    B+树:1.只有叶子节点存数据。2.数据有链指针。
    B树优势:1.靠近根节点的数据,访问速度快。
    B+树优势:1.一页内存可以容纳更多的键,访问数据需要更少的缓存未命中。2.全面扫描只需要扫描叶子节点。

    事务的概念,ACID的特性

    事务是用户定义的一个数据库操作序列,这些操作要么全不做,要么全做,是一个不可分割的工作单位。例如在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或者整个程序。

    事务具有四个特性:原子性(Atomicity)、持续性(Durability)、一致性(Consistency)和隔离性(Isolation)。这四个特性简称ACID特性(ACID Properties)。

    1)原子性:事务是数据库的逻辑工作单位,事务中包括的诸操作,要么全做,要么全不做。

    2)一致性:事务的执行结果必须是使数据库从一个一致性状态变到另外一个一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所做的修改有一部分已经写入到物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。例如,某公司在银行中有A,B两个账号,现在公司想从账号A中取出一万元,存入账号B。那么就可以定义一个事务,该事务包括两个操作,第一个操作是从账号A中减去一万元,第二个操作是向账号B中加入一万元。这两个操作要么全做,要么全不做。全做或者全不做,数据库都处于一致性状态。如果只做一个操作,则逻辑上就会发生错误,减少或增加一万元,这时数据库就处于不一致性状态了。可见原子性与一致性是密切相关的。

    3)隔离性:一个事务的执行不能被其他事务干扰。即一个事务的内部操作及使用对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

    4)持续性:持续性也称永久性(Permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的操作或故障不应该对其执行结果产生任何影响。

    索引什么时候该用,什么时候不该用

    不使用的情况:

    1、该字段的数据修改过多时,并且不经常使用该字段作为查询条件下,一般不使用字段。

    2、单一字段(如性别不是男就是女)不使用(单一字段建索引的话,由于字段重复率高,建出来的b+树会有很多重复数据,走索引时,几乎会变成线性时间查找,效率很低)

    3、数据量的小的时候

  • 相关阅读:
    跨域常见解决方案
    express-session的简单使用说明
    Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题?
    继承父类的静态方法的加载顺序
    sql索引优化
    EXPLAIN 执行计划详解
    JVM总括二-垃圾回收:GC Roots、回收算法、回收器
    dubbo知识体系
    Spring bean的生命流程
    日志体系与异常处理
  • 原文地址:https://www.cnblogs.com/shouyaya/p/14930768.html
Copyright © 2011-2022 走看看