阿里巴巴社招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,并放入常量池!
String s = new String(“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分钟内全部发完 打个比方会提出类似的场景