java面经(网易)基础知识

来源:互联网 发布:linux的书籍推荐 编辑:程序博客网 时间:2024/05/16 05:56
根据牛客网上面经整理的网易面试题目及网上查找到的答案,有不对的地方欢迎评论指出。
1 、HashTable和HashMap的区别?
HashTable支持同步(synchronization),是线程安全的,速度较慢

2 、数据库的acid:  原子性、一致性、隔离性、持久性

3 、用过多线程吗?介绍一下线程池
Java通过Executors提供四种线程池,分别为:
①newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
②newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
③newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
④newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

4 、Spring框架了解多少:IOC和AOP
spring框架是一种轻量级的控制反转(IOC)和面向切面(AOP)的容器框架和开源框架
优势:
①通过控制反转的方式实现依赖注入,实现松耦合。
②提供面向切面编程的丰富支持,允许分离应用的业务逻辑。
③包含并管理应用对象的配置和生命周期。
④将简单的组件配置组成复杂的应用。

5 、介绍Hadoop

6 、hash冲突的四种办法
①开放地址法,也称再散列法。再使用一次哈希函数获取地址。
②再哈希法,通过构造多个不同哈希函数,当遇到冲突选择新的哈希函数。
③链地址法,将哈希地址一样的元素构建为一个单链表。

7、Object的类都有哪些方法
clone()
equals()
hashcode()
toString()

8、给你一个表只有一列name~~有重复的name, 然后求出前十个name数最大的:
select name, count(name) from table group by count(name) desc limit 10

9、写二分查找算法
//递归
int find(int[] data, int left, int right, int key){
int mid = (left+right)/2;
if(data[mid]==key)
return mid;
if(left>=right)
        return -1;
  else if(data[mid]<key){
return find(data,mid+1,right,key);
}
elseif(data[mid]>key){
return find(data,left,mid-1,key);
 }
return -1;
}
//非递归
int find(int[] data, int left, int right, int key){
if(left>=right)
return -1;
        int mid = (left+right)/2;
while(left<right){
if(data[mid]==key)
return mid;
if(data[mid]<key)
left = mid+1;
if(data[mid]>key)
right = mid-1;
}
return -1;
}

10、为什么java要有垃圾回收?
c++中对象所占用的内存在程序结束之前一直被占用,在明确释放之前不分配给其他对象。在java中如果对象没有被引用时,分配给这个对象的内存就成为垃圾。垃圾回收能自动释放内存,以便内存被新来的对象使用,减少编程负担。除了释放无用内存,垃圾回收也可以清楚内存记录碎片。碎片整理将堆内存移到一段,JVM将整理出的内存分配给新对象。

11、内存溢出了怎么办 ?
①修改JVM启动参数,直接增加内存。
②检查错误日志,查看“OutOfMemory“前是否有其他错误或异常。
③对代码进行排查,检查哪里可能出现问题,重点排查一下几点:
检查数据库查询语句,是否有一次获取全部数据的语句,如果一次获取几十万数据则会引起内存溢出。
检查是否有大循环重复生成新对象实体。
检查代码中是否有死循环。
检查List,Map中是否有使用完的对象为清除。这些集合会始终存储对对象的引用,导致不会被GC收回。
④使用内存查看工具查看内存使用情况。

内存溢出包括两种类型,OutOfMemoryError(由于程序无法申请到足够的内存)、StackOverflowError(线程所申请的栈深度超过虚拟机所支持的栈深度)
Program Counter Regster(程序计数器):每一个用户线程对应一个程序计数器,用来指示当前线程所执行字节码的行号。在这个区域中不会抛出OutOfMemoryError的内存异常。

Java stack(java 虚拟机栈):每一个线程对应生成一个线程栈,线程每执行一个方法的时候,都会创建一个栈帧,用来存放方法的局部变量表,操作树栈,动态连接,方法入口。jvm规范对这个区域定义了两种内存异常,OutOfMemoryError,StackOverflowError。

Native MethodStack(本地方法栈):和虚拟机栈一样,不同的是处理的对象不一样,虚拟机栈处理java的字节码,而本地栈则是处理的Native方法。其他方面一致。

Heap(堆):所有的线程都在这个区域保存实例化的对象,我们只有在运行的时候才能知道要创建多少对象,需要分配多大的地址空间。堆中肯定不会抛出StackOverflowError类型的异常,所以只有OutOfMemoryError相关类型的异常。

Method Area(方法区):用于存放已被虚拟机加载的类信息,常量,静态方法,即使编译后的代码。同样只能抛出OutOfMemoryError相关类型的异常。


12、String 转出 int型,判断能不能转?如何转?
判断能不能转用使用函数:NumberUtils.isNumber(str)
转换使用函数:Integer.parseInt(str)

13、controller怎么处理的请求?
controller接口是所有控制类的基本接口,能够接受HttpServletRequest和HttpServletResponse。由于Controller需要处理并发用户的请求,因此,实现controller接口时,必须保证是线程安全的并且可重用。Spring为Controller这种接口的提供了若干实现,例如,Spring默认使用的BeanNameUrlHandlerMapping。
controller处理完成后返回一个ModelAndView给Dispatcher Servlet。
14、介绍多线程编程

通过jdk5新增的CountDownLatch(相当于计数器)对象实现,基本思路就是每执行完一个线程调用CountDownLatch.countDown()方法将计数器减1,主线程执行CountDownLatch.await()等待计数器减为0唤醒。

通过ExecutorService executor = Executors.newFixedThreadPool(int threadNum) 创建线程池

调用List<Future<T>> result = executor.invokeAll( Collection<?extends Callable<T> tasks>)赋予线程池n个任务,并自动执行,在执行过程中主线程会阻塞直到所有任务执行完毕。执行完毕后将结果存储在Future对象中,通过Future.get()对象获取返回结果。
Fork-joint框架,通过work-steaking算法实现,这种算法是一种调度算法,每个工作线程用一个双端队列维护一组任务。Fork的时候是把任务加到队列的头部,而不像一般的线程池那样是加到任务队列末尾。工作线程选择头部最新的任务来执行。当工作线程没有任务可执行时,它会尝试从其它线程的任务队列尾部窃取一个任务执行。如果没有任务执行了并且窃取其它任务失败,那么工作线程停止。

这种方法的优点是减少了争用,因为工作线程从头获取任务,而窃取线程从尾部窃取任务。这种调度算法较适用于递归算法,递归算法采用分治思想,使得早期产生的任务单元较大,因而窃取的较大任务进一步递归分解,因此减少尾部窃取次数。另外,父任务很可能要等待子任务(join),所以从队列头部子任务开始执行也是一种优化。


15、介绍数据仓库
数据仓库指将各子系统独立的数据库进行数据抽取(从各类数据源)、转换和清洗、治理、装载,实现数据集成。实现将不同功能的基础设施系统通过统一标准平台实现集成。支持RDS、HDFS、Hbase、Kudu等从GB到PB级别的存储方案。

1.标准化

1)设备编号的标准化;

2)数据对象定义和通讯规约以及数据交换接口的标准化;

3)系统框架的标准化。

2.平台化

采用标准体系的设计架构,保证可靠性、标准性和开放性。

3.完善的安全管理机制和合法性认证机制

1)专用的安全管理模块,防止对系统的恶意攻击,并保障系统数据的安全性;

2)严格的认证服务模块,对内外部用户进行可靠性认证。

4.构建集成管理的数据仓库

1)构建综合性的数据仓库,建立信息服务平台;

2)完善的数据安全性机制管理。

5.响应速度

核心数据库要求支持多个并发用户;存储容量300GB以上;数据库服务器预留15%的空间,以应付数据膨胀、系统日志消耗等情况;从保存数据的高可靠性方面考虑,存储设备要采用RAID1/5技术保存数据,系统存储容量要冗余50%左右。


16、你用过的一些collection都有哪些 ?
set:一个不允许元素重复的无序集合。
List:有序集合,多数情况下允许元素重复,可按位置访问。
至于具体选用哪一种方案,以下仅供参考:
  1)大量的随机访问可以用ArrayList类
  2)大量的插入、删除建议用LinkedList类
  3)关于Set,建议都使用HashSet类
  4)映射的最佳策略是创建和填充时用TreeMap日后需要大量检索时再转换成HashMap。    

18、treemap的实现
能够保证数据按照key值大小进行排序。通过红黑树进行节点维护,包括put、get、successor(后继)函数。
java TreeMap工作原理及实现

19、equls 和 == 的区别
==是一个运算符,对于基本类对象比较时两者都是比较对象值是否相等,对于自定义类的比较需要重写equls方法。

20、堆内存回收
标记清除算法
标记压缩算法
复制算法
分代算法
21、生产者模式和消费者模式怎么实现
①synchronized锁以及wait()/notify()方法
②lock锁以及wait()/signal()方法
③采用BlockingQueue方法实现
④通过管道

22、Mysql如何定位查询效率较慢的SQL语句?
慢查询日志,EXPLAIN 分析查询,profiling分析以及show命令查询。具体每种命令使用参考:mysql性能优化


22、数据库设计时,字段可以选择默认值或null,问什么选择默认值而不选择null?
默认值可以被索引,而null值无法被索引,影响性能。另一方面null有些数据库引擎按照最大字节数存储,占用空间。

23、大规模delete或insert操作是否会引起表锁定,如何解决?
有些情况下会引起锁定,比如事务级别为重复读时。分批次进行delete或insert操作。

24、事务隔离级别
read uncommitted(读未提交)、read committed(读提交)、repeatable read(重复读)、serializable(序列化)

25、java序列化过程
序列化就是将内存中保存的各种对象状态(实例变量,不是方法)读取出来,在适当的时候使用。
序列化过程:
①创建FileOutputStream: FileOutputStream fs = new FileOutputStream("fs.ser");
②创建ObjectOutputStream:ObjectOutputStream os = new ObjectOutputStream("fs");
③将Object写出:os.writeObject(object1);
④关闭ObjectOutputStream:os.close();

26、wait()方法是否必须放在while循环中?
是,当一个从wait中被notify的进程,还需重新判定是否符合执行条件,如果不符合将再次被wait。如果wait被放在while循环之外则不会进行此判断直接执行下去。在某些情况会产生错误。
比如生产者消费者模型中,有两个生产者对象A、B,一个消费者对象C。当存储满之后A、B均被wait,当C进行消费后则nofityall,则A、B同时生产,导致仓库溢出。

27、sychronized与可重入锁(ReenTrantLock)的区别?
sychronized依赖JVM实现,使用方便简洁,由编译器控制锁的加锁和释放,性能略差。
ReenTrantLock依赖JDK实现,需要手工进行加锁和释放的声明,在锁的细粒度和灵活度上更强。
具有以下独有能力:
①提供公平锁和非公平锁,而sychronized只支持非公平锁。公平锁就是先等待的进程先被唤醒。
②提供一个condition类,用来实现分组唤醒需要唤醒的线程。而sychronized要么随机唤醒一个线程,要么唤醒全部线程。
③提供一种能够中断等待锁的线程机制,通过lock.lockInterruptibly()实现。

28、乐观锁悲观锁
乐观锁每次执行操作都不会加锁,只在提交时检查检查是否违反数据完整性,若发生错误则回滚全部操作。
悲观锁认为每次操作都可能会发生冲突,每次访问临界资源时都进行加锁。
乐观锁适用于查询业务较多更更改业务较少的场景,因为不对资源进行加锁可提高并发性。

29、对读写锁(ReadWriteLock)的了解。
包括读锁和写锁,读锁可以被多个线程持有,而写锁只能被一个线程持有。
相比于互斥锁允许对于共享数据的更大程度的并发。
原创粉丝点击