您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 招聘面试 > 阿里Java基础面试题文档(2017)
1.自我介绍2.讲一件你印象最深刻的事没事怎么解决的3.JAVA垃圾回收机制怎么工作的4.AOP是怎么实现的5.TCP/UDP的区别是什么6.MAP讲一下你对MAP的认识,然后谈一下HsahMap的性能,主要谈一下哈希冲撞7.创造线程的几种方式,Thread和Runnable接口有什么区别8.简单说一下你参加的中兴算法大赛9.说一下你做的聊天工具,如果遇到服务突然卡顿,怎么解决10.讲一下你对于spring框架的了解11.Mysql数据库,索引是怎么使用的。12.你对分布式是否有所了解13.你对数据结构了解么14.你为什么想转行做软件呢15.String和StringBuffer16.浅析HashMap与ConcurrentHashMap的线程安全性17.堆排序,快速排序18.数据库的四大特征,数据库的隔离级别,19.线程同步机制用的什么?当初为什么选择这个机制?20.互斥和条件变量区别?互斥是阻塞的吗?当初为什么选择阻塞的机制?21.消息队列22.分布式Java中多态性的实现什么是多态1.面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。2.多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)3.实现多态的技术称为:动态绑定(dynamicbinding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。4.多态的作用:消除类型之间的耦合关系。5.现实中,关于多态的例子不胜枚举。比方说按下F1键这个动作,如果当前在Flash界面下弹出的就是AS3的帮助文档;如果当前在Word下弹出的就是Word帮助;在Windows下弹出的就是Windows帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。下面是多态存在的三个必要条件,要求大家做梦时都能背出来!多态存在的三个必要条件一、要有继承;二、要有重写;三、父类引用指向子类对象。Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。String与StringBuffer的区别简单地说,就是一个变量和常量的关系。StringBuffer对象的内容可以修改;而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象。StringBuffer的内部实现方式和String不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。String:在String类中没有用来改变已有字符串中的某个字符的方法,由于不能改变一个Java字符串中的某个单独字符,所以在JDK文档中称String类的对象是不可改变的。然而,不可改变的字符串具有一个很大的优点:编译器可以把字符串设为共享的。StringBuffer:StringBuffer类属于一种辅助类,可预先分配指定长度的内存块建立一个字符串缓冲区。这样使用StringBuffer类的append方法追加字符比String使用+操作符添加字符到一个已经存在的字符串后面有效率得多。因为使用+操作符每一次将字符添加到一个字符串中去时,字符串对象都需要寻找一个新的内存空间来容纳更大的字符串,这无凝是一个非常消耗时间的操作。添加多个字符也就意味着要一次又一次的对字符串重新分配内存。使用StringBuffer类就避免了这个问题。StringBuffer是线程安全的,在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。StringBuffer的常用方法StringBuffer类中的方法要偏重于对字符串的变化例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。String字符串常量StringBuffer字符串变量(线程安全)StringBuilder字符串变量(非线程安全)简要的说,String类型和StringBuffer类型的主要性能区别其实在于String是不可变的对象,因此在每次对String类型进行改变的时候其实都等同于生成了一个新的String对象,然后将指针指向新的String对象,所以经常改变内容的字符串最好不要用String,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM的GC就会开始工作,那速度是一定会相当慢的。而如果是使用StringBuffer类则结果就不一样了,每次结果都会对StringBuffer对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用StringBuffer,特别是字符串对象经常改变的情况下。而在某些特别情况下,String对象的字符串拼接其实是被JVM解释成了StringBuffer对象的拼接,所以这些时候String对象的速度并不会比StringBuffer对象慢,而特别是以下的字符串对象生成中,String效率是远要比StringBuffer快的:StringS1=“Thisisonlya”+“simple”+“test”;StringBufferSb=newStringBuilder(“Thisisonlya”).append(“simple”).append(“test”);你会很惊讶的发现,生成StringS1对象的速度简直太快了,而这个时候StringBuffer居然速度上根本一点都不占优势。其实这是JVM的一个把戏,在JVM眼里,这个StringS1=“Thisisonlya”+“simple”+“test”;其实就是:StringS1=“Thisisonlyasimpletest”;所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的String对象的话,速度就没那么快了,譬如:StringS2=“Thisisonlya”;StringS3=“simple”;StringS4=“test”;StringS1=S2+S3+S4;这时候JVM会规规矩矩的按照原来的方式去做在大部分情况下StringBufferStringStringBufferJava.lang.StringBuffer线程安全的可变字符序列。一个类似于String的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。StringBuffer上的主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append方法始终将这些字符添加到缓冲区的末端;而insert方法则在指定的点添加字符。例如,如果z引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用z.append(le)会使字符串缓冲区包含“startle”,而z.insert(4,le)将更改字符串缓冲区,使之包含“starlet”。在大部分情况下StringBuilderStringBufferjava.lang.StringBuildejava.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与StringBuffer兼容的API,但不保证同步。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer要快。两者的方法基本相同。在数据结构中有一种称为哈希表的数据结构,它实际上是数组的推广。如果有一个数组,要最有效的查找某个元素的位置,如果存储空间足够大,那么可以对每个元素和内存中的某个地址对应起来,然后把每个元素的地址用一个数组(这个数组也称为哈希表)存储起来,然后通过数组下标就可以直接找到某个元素了。这种方法术语叫做直接寻址法。这种方法的关键是要把每个元素和某个地址对应起来,所以如果当一组数据的取值范围很大的时候,而地址的空间又有限,那么必然会有多个映射到同一个地址,术语上称为哈希冲突,这时映射到同一个地址的元素称为同义词。毕竟,存储空间有限,所以冲突是不可避免的,但是可以尽量做到减少冲突。目前有两种比较有效的方法来解决哈希冲突:链地址法开放地址法这里简要说明一下开放地址法,顾名思义,就是哈希表中的每个位置要么存储了一个元素要么为NULL。当数据比较多的时候,查找一个元素挺费事的,但是可以使用探测的方法进行查找。这个话题与本主题关系不大,感兴趣的小伙伴可以自行研究。从这段注释中可以发现每次执行ConcurrentHashMap的put方法都是调用s.put()方法的,而Segments对象是一个继承了ReentrantLock锁对象的子类,那么剩下的就很清晰了,每一个Segments都有一个锁,只有执行完上面try语句块中的代码才会释放锁,从而保证了多线程并发访问的安全性。什么是线程同步?当使用多个线程来访问同一个数据时,非常容易出现线程安全问题(比如多个线程都在操作同一数据导致数据不一致),所以我们用同步机制来解决这些问题。实现同步机制有两个方法:1.同步代码块:synchronized(同一个数据){}同一个数据:就是N条线程同时访问一个数据。2.同步方法:publicsynchronized数据返回类型方法名(){}就是使用synchronized来修饰某个方法,则该方法称为同步方法。对于同步方法而言,无需显示指定同步监视器,同步方法的同步监视器是this也就是该对象的本身(这里指的对象本身有点含糊,其实就是调用该同步方法的对象)通过使用同步方法,可非常方便的将某类变成线程安全的类,具有如下特征:1,该类的对象可以被多个线程安全的访问。2,每个线程调用该对象的任意方法之后,都将得到正确的结果。3,每个线程调用该对象的任意方法之后,该对象状态依然保持合理状态。注:synchronized关键字可以修饰方法,也可以修饰代码块,但不能修饰构造器,属性等。实现同步机制注意以下几点:安全性高,性能低,在多线程用。性能高,安全性低,在单线程用。1,不要对线程安全类的所有方法都进行同步,只对那些会改变共享资源方法的进行同步。2,如果可变类有两种运行环境,当线程环境和多线程环境则应该为该可变类提供两种版本:线程安全版本和线程不安全版本(没有同步方法和同步块)。在单线程中环境中,使用线程不安全版本以保证性能,在多线程中使用线程安全版本.一:进程与线程概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程。当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程。进程:进程是指处于运行过程中的程序,并且具有一定的独立功能。进程是系统进行资源分配和调度的一个单位。当程序进入内存运行时,即为进程。进程的三个特点:1:独立性:进程是系统中独立存在的实体,它可以独立拥有资源,每一个进程都有自己独立的地址空间,没有进程本身的运行,用户进程不可以直接访问其他进程的地址空间。2:动态性:进程和程序的区别在于进程是动态的,进程中有时间的概念,进程具有自己的生命周期和各种不同的状态。3:并发性:多个进程可以在单个处理器上并发执行,互不影响。并发性和并行性是不同的概念:并行是指同一时刻,多个命令在多个处理器上同时执行;并发是指在同一时刻,只有一条命令是在处理器上执行的,但多个进程命令被快速轮换执行,使得在宏观上具有多个进程同时执行的效果线程:线程是进程的组成部分,一个进程可以拥有多个线程,而一个线程
本文标题:阿里Java基础面试题文档(2017)
链接地址:https://www.777doc.com/doc-5891787 .html