失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 阿里巴巴社招Java面试题做题记录

阿里巴巴社招Java面试题做题记录

时间:2019-07-07 14:05:37

相关推荐

阿里巴巴社招Java面试题做题记录

阿里巴巴社招Java面试题

1、String和StringBuffer的区别

运行速度和线程安全两方面:

运行速度:StringBuilder >StringBuffer >String

String是字符串常量,不可变,每次改变只是创建一个新的对象,然后GC回收掉老的那个,所以执行速度最慢,另外两个是字符串对象,可变。

线程安全:

StringBuilder是线程不安全的,StringBuffer是线程安全的,看是否带synchronized关键字。多线程则采用StringBuffer,单线程则要建议用速度较快的StringBuilder。

String:适用于少量的字符串操作的情况,String是final类,无法被继承。

StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况。

StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况。

2、gc的概念,如果A和B对象循环引用,是否可以被GC?

这个循环引用是否被回收,就看这个循环引用是否挂在根上,A引用B,B引用A,A和B并没有挂在某个内存元和根上,当他们的生命周期结束的时候。这两个对象都有可能被回收。

3、Java中的内存溢出是如何造成的

OutOfMemoryError:

1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

3.代码中存在死循环或循环产生过多重复的对象实体;

4.使用的第三方软件中的BUG;

5.启动参数内存值设定的过小;

4、String s = “123”;这个语句有几个对象产生

s是引用或者叫做句柄。

java语言中有一个常量池,如果在你的代码的其它地方已经定义过这么这个’123’的变量,在定义string s=’123’的时候,直接把s指向常量池中的字符串123,就不会新生成一个字符串123,但假如没有的话,就会新生成一个字符串123,指向s,并放入常量池!

Strings=newString(“123”);有区别的,这句两个对象(一个堆中的对象,一个常量池里的对象)。

5、Error、Exception和RuntimeException的区别,作用又是什么?

Error是Throwable的子类,用于指示合理的应用程序不应该试图捕获的严重问题。大多数这样的错误都是异常条件。虽然ThreadDeath错误是一个“正规”的条件,但它也是Error的子类,因为大多数应用程序都不应该试图捕获它。在执行该方法期间,无需在其throws子句中声明可能抛出但是未能捕获的Error的任何子类,因为这些错误可能是再也不会发生的异常条件。

Exception类及其子类是Throwable的一种形式,它指出了合理的应用程序想要捕获的条件。

RuntimeException是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。可能在执行方法期间抛出但未被捕获的RuntimeException的任何子类都无需在throws子句中进行声明。它是Exception的子类。

6、列举3个以上的RuntimeException

java.lang.nullpointerexception

java.lang.classnotfoundexception

java.lang.arithmeticexception

Java.lang.arrayindexoutofboundsexception

java.lang.illegalargumentexception

7、reader和inputstream区别

InputStream是表示字节输入流的所有类的超类

Reader是用于读取字符流的抽象类

InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。

即用Reader读取出来的是char数组或者String ,使用InputStream读取出来的是byte数组。

8、hashCode的作用

hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。

Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。

9、Object类中有哪些方法,列举3个以上(可以引导)

基本数据类型不会继承Object类

clone()

finalize()

toString()

equals()

hashCode()

10、char型变量中能不能存贮一个中文汉字?为什么?

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,

所以,char型变量中当然可以存储汉字。不过,如果某个特殊的汉字没有被包含在

unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充

说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。

char表示的范围是0–65535

11、列举几个Java Collection类库中的常用类

HashSet

LinkedHashSet

ArrayList

TreeSet

TreeMap

HashMap

12、List、Set、Map是否都继承自Collection接口?

List,Set是,Map不是。

13、HashMap和Hashtable的区别

主要的区别有:线程安全性,同步(synchronization),以及速度。

HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。 HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。 另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。 HashMap不能保证随着时间的推移Map中的元素次序是不变的。

14、HashMap中是否任何对象都可以做为key,用户自定义对象做为key有没有什么要求?

用自定义类作为key,必须重写equals()和hashCode()方法。

自定义类中的equals() 和 hashCode()都继承自Object类。

Object类的hashCode()方法返回这个对象存储的内存地址的编号。

而equals()比较的是内存地址是否相等。

15、interface 和 abstrat class的区别 是否可以继承多个接口,是否可以继承多个抽象类

16、 启动一个线程是用run()还是start()? 多线程有几种实现 同步和并发是如何解决的 什么叫守护线程,用什么方法实现守护线程(Thread.setDeamon()的含义) 如何停止一个线程? 解释是一下什么是线程安全?举例说明一个线程不安全的例子。解释Synchronized关键字的作用。 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

start();多线程实现:继承Thread类,重写run();实现Runnable接口,重写run();实现Callable接口,重写call函数

同步方式:synchronized修饰,wait(),notify()

加锁;守护线程,专门用于服务其他的线程,如果其他的线程(即用户自定义线程)都执行完毕,连main线程也执行完毕,那么jvm就会退出(即停止运行)——此时,连jvm都停止运行了,守护线程当然也就停止执行了。比如垃圾回收线程,就是最典型的守护线程。

通过Thread.setDaemon(false)设置为用户线程;通过Thread.setDaemon(true)设置为守护线程。如果不设置次属性,默认为用户线程。

1.使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。

2.使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方法。

3.使用interrupt方法中断线程。

就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,

就是线程安全的。

线程安全问题都是由全局变量及静态变量引起的。

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全

存在竞争的线程不安全,不存在竞争的线程就是安全的。

线程同步

1.如果其他方法前加了synchronized关键字,就不能,如果没加synchronized,则能够进去。

2.如果这个方法内部调用了wait(),则可以进入其他加synchronized的方法。

3.如果其他方法加了synchronized关键字,并且没有调用wait方法,则不能。

17、了解过哪些JDK8的新特性,举例描述下相应的特性?

18、对sql进行优化的原则有哪些?

1 减少返回不必要的数据

2 减少物理和逻辑读次数

3 减少计算次数

19、servlet生命周期是生命与cgi的区别?

CGI(Common Gateway Interface通用网关接口)程序来实现数据在Web上的传输,使用的是如Perl这样的语言编写的,它对于客户端作出的每个请求,必须创建CGI程序的一个新实例,这样占用大量的内存资源。由此才引入了Servlet技术。

Servlet提供了Java应用程序的所有优势——可移植、稳健、易开发。使用Servlet Tag技术,Servlet能够生成嵌于静态HTML页面中的动态内容。

20、StringBuffer有什么优势?为什么快?

见第一题

other

谈谈你对HashMap的理解,底层原理的基本实现,HashMap怎么解决碰撞问题的?

开发中用了那些数据库?回答mysql,储存引擎有哪些?然后问了我悲观锁和乐观锁问题使用场景、分布式集群实现的原理。

springmvc和mybatis的工作原理,有没有看过底层源码?

熟悉IO么?与NIO的区别,阻塞与非阻塞的区别

微信红包怎么实现。

海量数据分析。

线程安全和非线程安全。

HTTP2.0、thrift。

java反射应用

分布式事务一致性。

nio的底层实现。

jvm基础是必问的,jvm GC原理,JVM怎么回收内存。

API接口与SDI接口的区别

dubbo如何一条链接并发多个调用。Dubbo的原理,序列化相关问题。

用过哪些中间件。

做过工作流引擎没有。

以前的工作经历,自己觉得出彩的地方

线程池的一些原理,锁的机制升降级

从系统层面考虑,分布式从哪些纬度考虑

Hadoop底层怎么实现

threadLocal,线程池,hashMap/hashTable/coccurentHashMap等

秒杀系统的设计

虚拟机,IO相关知识点

Linux的命令

一个整形数组,给定一个数,在数组中找出两个数的和等于这个数,并打印出来,我写的时间复杂度高,要求O(n)。

n个整数,找出连续的m个数加和是最大。

更重视开源技术

数据库锁隐原理

1000个线程同时运行,怎么防止不卡

并列的并发消费问题)

高并发量大的话怎么处理热点,数据等

如何获取一个本地服务器上可用的端口

流量控制相关问题

数据库TPS是多少,是否进行测试过

缓存击穿有哪些方案解决

Java怎么挖取回收器相关原理

Java的集合都有哪些,都有什么特点

分布式锁,redis缓存,spring aop,系统架构图,MySQL的特性

场景,同时给10万个人发工资,怎么样设计并发方案,能确保在1分钟内全部发完 打个比方会提出类似的场景

如果觉得《阿里巴巴社招Java面试题做题记录》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。