2017阿里实习电面总结

2019-04-14 17:40发布

1、自我介绍
2、简单的问项目
3、你收获最多的一个项目
4、学Java多久了?都看过什么书?
5、抽象类和接口的区别
  两者的语法区别:
  1.抽象类可以有构造方法,接口中不能有构造方法(接口里面全部都是抽象方法,没有变量数据,是一种行为规范而不是具体行为,所以没必要创建对象,也就不需要构造方法.)。
  2.抽象类中可以有普通成员变量,接口中没有普通成员变量
  3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。(也就是说当抽象类中的方法都是抽象方法时就称之为接口)
  4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
  5. 抽象类中可以包含静态方法,接口中不能包含静态方法
  6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
  7. 一个类可以实现多个接口,但只能继承一个抽象类。
  下面接着再说说两者在应用上的区别:
   接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码
6、集合类中的接口都有哪些?
  list和set
  两者的区别?
  |–List:列表。
   特点:
     1,有序(存储元素的顺序和取出元素的顺序一致)
     2,该集合中的元素都有索引,所以可以通过索引(角标)来访问元素。
     3,它可以存储重复元素。
   |–Set:集 取出元素只能使用迭代器。
   特点:
     1,不包含重复元素。(最大的特点)
     2,不保证有序。(具体的容器对象数据结构不同,顺序也有不同)
    用过hashmap吗
    hashmap的原理:这个问题应该主要是在hashmap的存储等原理
    哈希表结构,不同步,允许null键和null值
   HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。
   当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。
    bucket:当实例化一个HashMap时,系统会创建一个长度为Capacity的Entry数组,这个长度在哈希表中被称为容量(Capacity),在这个数组中可以存放元素的位置我们称之为“桶”(bucket),每个bucket都有自己的索引,系统可以根据索引快速的查找bucket中的元素。
7、进程和线程的区别?
   进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
  1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
  2) 线程的划分尺度小于进程,使得多线程程序的并发性高。
  3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
  4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
  5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
   线程的状态有哪些?
   1.新建状态(New):
当用new操作符创建一个线程时, 例如new Thread(r),线程还没有开始运行,此时线程处在新建状态。 当一个线程处于新生状态时,程序还没有开始运行线程中的代码
  2、临时阻塞状态(Runnable)
   一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于临时阻塞状态。
  处于临时阻塞状态的线程并不一定立即运行run()方法,线程还必须同其他线程竞争CPU执行权,只有获得 CPU执行权才可以运行线程。因为在单CPU的计算机系统中,不可能同时运行多个线程,一个时刻仅有一个线程处于运行状态。因此此时可能有多个线程处于就绪状态。对多个处于就绪状态的线程是由Java运行时系统的线程调度程序(thread scheduler)来调度的。
   总的来说,临时阻塞状态具备CPU的使用资格,但不具备CPU的使用权。
3.运行状态(Running)
   当线程获得CPU执行权后,它才进入运行状态,真正开始执行run()方法.
4.阻塞状态(Blocked)
  阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
  (一)等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
  (二)同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
  (三)其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5. 死亡状态(Dead)
  有两个原因会导致线程死亡:
  1) run方法正常退出而自然死亡,
  2) 一个未捕获的异常终止了run方法而使线程猝死。
  3)调用stop或者suspend方法,但是stop已经弃用,suspend方法容易引起死锁
 为了确定线程在当前是否存活着(就是要么是可运行的,要么是被阻塞了),需要使用isAlive方法。如果是可运行或被阻塞,这个方法返回true; 如果线程仍旧是new状态且不是可运行的, 或者线程死亡了,则返回false.
8、String和StringBuffer的区别?
   String:
   为不可变对象,一旦被创建,就不能修改它的值;对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去;String 是final类,即不能被继承.
  StringBuffer:
   是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象;它只能通过构造函数来建立,
   StringBuffer的如何实现可变长度?
   new StringBuffer会新建一个初始长度的StringBuffer,开辟一块内存,在存储的过程中,如果这一块区域不够用,会再开辟一块更大的内存,再将原来存储的数据复制到新的区域里,外在来看实现了可变长度。
9、数据库常用的锁?
  数据库中的锁是网络数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性。各种大型数据库所采用的锁的基本理论是一致的,但在具体实现上各有差别。目前,大多数数据库管理系统都或多或少具有自我调节、自我管理的功能,因此很多用户实际上不清楚锁的理论和所用数据库中锁的具体实现。在数据库中加锁时,除了可以对不同的资源加锁,还可以使用不同程度的加锁方式,即锁有多种模式,SQL Server中锁模式包括:
 1)共享锁 SQL
   Server中,共享锁用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的资源。默认情况下,数据被读取后,SQL Server立即释放共享锁。例如,执行查询“SELECT * FROM
my_table”时,首先锁定第一页,读取之后,释放对第一页的锁定,然后锁定第二页。这样,就允许在读操作过程中,修改未被锁定的第一页。但是,事务隔离级别连接选项设置和SELECT语句中的锁定设置都可以改变SQL Server的这种默认设置。例如,“ SELECT * FROM my_table HOLDLOCK”就要求在整个查询过程中,保持对表的锁定,直到查询完成才释放锁定。
 2)修改锁 修
   改锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享锁,读取数据,然后将共享锁升级为独占锁,然后再执行修改操作。这样如果同时有两个或多个事务同时对一个事务申请了共享锁,在修改数据的时候,这些事务都要将共享锁升级为独占锁。这时,这些事务都不会释放共享锁而是一直等待对方释放,这样就造成了死锁。如果一个数据在修改前直接申请修改锁,在数据修改的时候再升级为独占锁,就可以避免死锁。修改锁与共享锁是兼容的,也就是说一个资源用共享锁锁定后,允许再用修改锁锁定。
 3)独占锁
独占锁是为修改数据而保留的。它所锁定的资源,其他事务不能读取也不能修改。独占锁不能和其他锁兼容。
  4)结构锁
结构锁分为结构修改锁(Sch-M)和结构稳定锁(Sch-S)。执行表定义语言操作时,SQL Server采用Sch-M锁,编译查询时,SQL Server采用Sch-S锁。
 5)意向锁 意 向锁说明SQL
Server有在资源的低层获得共享锁或独占锁的意向。例如,表级的共享意向锁说明事务意图将独占锁释放到表中的页或者行。意向锁又可以分为共享意向锁、独占意向锁和共享式独占意向锁。共享意向锁说明事务意图在共享意向锁所锁定的低层资源上放置共享锁来读取数据。独占意向锁说明事务意图在共享意向锁所锁定
的低层资源上放置独占锁来修改数据。共享式独占锁说明事务允许其他事务使用共享锁来读取顶层资源,并意图在该资源低层上放置独占锁。
10、TCP和UDP的区别?
1、TCP是面向连接、传输可靠的(保证数据正确性,保证数据顺序),UDP面向非连接、传输不可靠
2、TCP速度慢,建立连接需要开销较多(时间,系统资源),相反UDP速度相对快
3、TCP面向字节流,用于传输大量数据(流模式);UDP是面向数据报文的,用于传输少量数据
4、TCP要求系统资源较多,UDP较少
11、重载和覆盖的区别?