小白如何入职阿里?——精讲阿里巴巴的十道面试题

点击右上方关注,每天都能收到精华技术好文

小白如何入职阿里?——精讲阿里巴巴的十道面试题

  全文2300字,建议阅读时长8分钟

一、string、stringbuffer、stringbuild之间的区别

1、String是final修饰的,是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。

2、StringBuffer、StringBuilder和String一样,也用来代表字符串,是可变类,任何对它所指代的字符串的改变都不会产生新的对象,他们的原理和操作基本相同,区别在于StringBufferd支持并发操作,线性安全的,适合多线程中使用。StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。

string、stringbuffer、stringbuild之间的区别更全面的链接如下

http://blog.csdn.net/shenhonglei1234/article/details/54908934

小白如何入职阿里?——精讲阿里巴巴的十道面试题

二、cookie的大小,一个站点可以存储多少个cookie

小白如何入职阿里?——精讲阿里巴巴的十道面试题

三、Set保证元素唯一底层依赖的两个方法

hashCode和equals来完成的

  • 如果元素的hashCode值相同,才会判断equals是否为true

  • 如果hashCode的值不同,不会调用equals方法

  • 注意:对于判断元素是 否存在,以及删除等操作。依赖的方法是元素的hashCode和equals方法。

**四、Hashmap和hashtable的区别,hashmap的底层以及怎么变成线程安全

区别比较:**

小白如何入职阿里?——精讲阿里巴巴的十道面试题
HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。

当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。小白如何入职阿里?——精讲阿里巴巴的十道面试题

五、线程的有几种实现方式,线程的几种状态,死锁产生的原因,sleep和wait的区别,多线程在项目中使用了吗,线程的安全问题

实现方式:

1、继承Thread类创建线程;

2、实现Runnable接口创建线程;

3、实现Callable接口通过FutureTask包装器来创建Thread线程;

使用ExecutorService、Callable、Future实现有返回结果的线程

重点记住第一点和第二点

线程的状态: 线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。

死锁产生的原因(可以举例课上讲解的A、B线程获取对方锁):

死锁:

指多个进程因竞争共享资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再 向前推进。

小白如何入职阿里?——精讲阿里巴巴的十道面试题
产生死锁的原因:小白如何入职阿里?——精讲阿里巴巴的十道面试题

(1)竞争系统资源 (2)进程的推进顺序不当

产生死锁的必要条件:

互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。

请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。

不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。

环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链。

Sleep、wait区别:

1,这两个方法来自不同的类分别是Thread和Object

2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用

4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

JAVAWEB开发中,直接使用多线程的并不多,因为servlet等技术已经实现了,我们只是直接用,并不用实现多线程

如果你的代码在多线程下执行和在单线程下执行永远都能获得一样的结果,那么你的代码就是线程安全的。

死锁和脏数据就是典型的线程安全问题。

解决线程安全通常做法:访问状态变量时使用同步。 synchronized和Lock都可以实现同步。简单点说,就是在你修改或访问可变状态时加锁,独占对象,让其他线程进不来。达到线程隔离,保证线程安全
小白如何入职阿里?——精讲阿里巴巴的十道面试题

猜你喜欢

转载自blog.51cto.com/14254017/2406147