面试题(1)

1、HashMap的数据结构:entry数组+Entry 链,相同hashcode位置相同,后放入的位于列表的头部
java对象中值相同的话,hashCode不一定相同的,但是也有相同的。比如String类的hashCode如果两个String字面值一样,那么hashCode一定是相同的,因为String类重写了hashCode()方法 
对于hashCode()方法的重写规则,最好需要遵守额规则是:如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。

2、HashSet怎么去重的。如果比较对象,需要重写hashcode方法和equals方法,http://blog.csdn.net/kaiwii/article/details/7990261
3、key排序 :  Map<String, String> map = new TreeMap<String, String>(
                new Comparator<String>() {
                    public int compare(String obj1, String obj2) {
                        // 降序排序
                        return obj2.compareTo(obj1);
                    }
                });
    value排序://这里将map.entrySet()转换成list
        List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
        //然后通过比较器来实现排序
        Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
            //升序排序
            public int compare(Entry<String, String> o1,
                    Entry<String, String> o2) {
                return o1.getValue().compareTo(o2.getValue());
            }
            
        });
4、脏读:指一个事务读取了另外一个事务未提交的数据。
5、先初始化父类的静态代码(包括代码段,静态变量,静态函数)
-->初始化子类的静态代码(包括代码段,静态变量,静态函数)
-->初始化父类的非静态代码(普通变量,和函数)
-->初始化父类构造函数
-->初始化子类非静态代码(普通变量,和函数)
-->初始化子类构造函数
Java初始化顺序
1在new B一个实例时首先要进行类的装载。(类只有在使用New调用创建的时候才会被java类装载器装入);
2,在装载类时,先装载父类A,再装载子类B
3,装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化)
4,装载子类B后,完成静态动作。
类装载完成,开始进行实例化
1,在实例化子类B时,先要实例化父类A
2,实例化父类A时,先成员实例化(非静态代码)
3,父类A的构造方法
4,子类B的成员实例化(非静态代码)
5,子类B的构造方法


forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.

2.从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.

3.从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

4.从效率来说
forward:高.
redirect:低.

5、集合类
1)线性表(连续储存,(N+2X)/2,最大(第一个位置添加元素)和最小(最后一个位置添加元素)之和再除以二),和链表(链表的存储是链式的,它不强迫数据是在一片连续的内存空间;它可以是分散存储的):在线性表中访问数据元素是很快的,当改变线性表长度的时间,它会在移动元素上花费大量的时间。
单向链表:它的下一个元素在什么地方。
双向链表:它的上下元素分别是什么

6、网站如何加速 
静态资源使用CDN加速,使用压缩技术对网站内容进行压缩减少网络传输大小。
系统拆分,静态文件合并,前端页面异步化和json化
去掉db依赖,引入缓存,提升单机qps。静态化改造,统一cache,cdn化
缓存http
7、HashMap如何实现 
entry数组+链表
8、StringBuffer、StringBuilder区别,在一个方法中使用哪个 
简单的说StringBuffer在涉及到更改字符串数组的操作上加了synchronized关键字来保证线程安全,在一个方法中不涉及到线程冲突直接使用StringBuilder更好。 
9、介绍一个项目 
10、36转换为16进制 :24
11、运行一个线程10秒终后线程没有运行完毕如何受到关闭线程 
简单的考虑,新建一个线程调用start方法,同时在外部可以使用Timer开始计时;同时线程在启动时传入一个参数可以是boolean来标示运行是否结束,当10秒过后,判断线程是否运行完毕,没有强行终止。
12、快速排序
http://www.ruanyifeng.com/blog/2011/04/quicksort_in_javascript.html
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
递归:(1)在数据集之中,选择一个元素作为"基准"(pivot)。
(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
13、冒泡排序
经典排序算法 - 冒泡排序Bubble sort
原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,
这样一趟过去后,最大或最小的数字被交换到了最后一位,
然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子
14、常用哪些集合类,TreeMap底层实现 红黑树 
15、使用枚举嘛,手写一个 
16、Mysql常用有哪些索引,InnoDB原理。 
普通索引,唯一索引,主键索引,组合索引
17、B-Tree

适合电面和现场面试的
HashMap的数据结构;HashSet怎么去重的~
能排序的map有哪些?对key排序的map,比如Map<String,Integer>的一个map,记录学生姓名和成绩得分的key-value对,考虑到学生的得分可能相等的情况下,现在我们想把全班同学按分数先高后低的顺序,即按map的value成绩得分排序,打印出所有的“分数,学生”这样的排列。
如果需要jdbc事务生效的话,autocommit如何设置
static,构造方法执行的先后顺序
char类型强转byte类型会不会报错,打印出来是啥。

byte 是字节数据类型 ,是有符号型的,占1 个字节;大小范围为-128—127 。char 是字符数据类型 ,是无符号型的,占2字节(Unicode码 );大小范围 是0—65535 ;char是一个16位二进制的Unicode字符,JAVA用char来表示一个字符 。

数据130默认是int类型的十进制数据
第一步十进制的130转换成二进制数据
1 0 0 0 0 0 1 0
第二步130是int类型是占4个字节的,所以在内存的表现形式是
00000000  00000000  00000000  10000010
做了截取后的结果为
10000010
通过观察最高位符号位是1,这是一个负数,因为在计算机中所有的数据都是以补码的形式出现的所以要算它的补码
原码:1 0000010    原码变反码,最高位符号位不变,其他数值位1变0,0变1得反码
反码:1 1111101    反码变补码就是反码加1得
补码;1 1111110
最终的看到的结果就是
1     1111110最高为是符号位不运算,数值为转化为十进制是64+32+16+8+4+2=126符号位负
所以为-126
equals和==的区别
String s1 = “s”和String s2 = new String(“s”)区别? s1.equals(s2)
http常用状态码?各代表什么?

401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。 
403 (禁止) 服务器拒绝请求。
404 (未找到) 服务器找不到请求的网页。
405 (方法禁用) 禁用请求中指定的方法

500 (服务器内部错误) 服务器遇到错误,无法完成请求。 
501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。 
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。 
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。 
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。 
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
forward 和 redirect 的区别?
编辑
适合现场面试的
取100和200时输出什么结果?
public static void main(String[] args) {

Integer integer1=200;

Integer integer2=Integer.valueOf(200);

Integer integer3=new Integer(200);

int int1=200;

System.out.println(“”+(integer3.equals(integer2))+(integer3==integer2)+(integer3==integer1)+(integer3==int1)+(integer1==integer2)+(integer2==int1));

 true false false true true true 100

true false false true false true 200 ==操作符,比较的是地址,当且仅当两者是同一个对象的时候,才会返回true;所以Integer直接赋值的话,值域得在-128到127以内是相等的,因为Integer只缓存了这一个范围的对象。new Integer(100) 这样就是新建的对象了,所以==肯定不相等。

}

18、memcache

http://blog.csdn.net/xifeijian/article/details/21994941

http://www.jizhuomi.com/software/317.html

19、

二叉树:http://www.cnblogs.com/vamei/archive/2013/03/17/2962290.html

图表中二叉树的先序、中序、后序序列怎么找?

这是图表,麻烦你帮忙详细解释一下,谢谢,非常感谢

20101040_ks2r.jpg

2009-04-13 11:02提问者采纳

先序: 根节点、左子树、右子树 
中序:左子树、根节点、右子树 
后序:左子树、右子树、根节点 
要理解清楚是子树,不是孩子。。。

如上图根节点为A,那么{B、D、E、H}为左子树,而{C、F、G、I、J}组成其右子树。再深入A的左子树,它也是一棵二叉树,根节点为B,左子树为{D},右子树为{E、H}。依此类推。。

先序:A、B、D、E、H、C、F、G、I、J
中序:D、B、H、E、A、F、C、I、G、J
后序:D、H、E、B、F、I、J、G、C、A

http://www.cnblogs.com/dong008259/archive/2011/11/22/2255361.html

 

http://blog.csdn.net/sup_heaven/article/details/39313731

小结

       B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于

走右结点;

       B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键

字范围的子结点;

       所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;

       B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点

中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;

       B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率

从1/2提高到2/3;

20、在java中,每个对象都有两个池,锁(monitor)池和等待池

锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中。(对象锁被其他线程占用,则进入对象的锁池)

等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁(因为wait()方法必须出现在synchronized中,这样自然在执行wait()方法之前线程A就已经拥有了该对象的锁),同时线程A就进入到了该对象的等待池中。如果另外的一个线程调用了相同对象的notifyAll()方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的notify()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池.

http://blog.csdn.net/emailed/article/details/4689220

83、请说出你所知道的线程同步的方法。【基础】
wait():使一个线程处于等待状态,并且释放所持有的对象的lock;
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方
法要捕捉InterruptedException 异常;
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,
并不能确切的唤醒某一个等待状态的线程,而是由JVM 确定唤醒哪个线程,而且
不是按优先级;
notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一
个对象的锁,而是让它们竞争。

http://blog.csdn.net/peter_teng/article/details/10197785

总结一下吧:

实现Runnable接口比继承Thread类所具有的优势:

1):适合多个相同的程序代码的线程去处理同一个资源

2):可以避免java中的单继承的限制

3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。

http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html

直接调用run会按顺序执行,应按start方法,才会随机执行

2秒钟执行一次,在run方法中循环并调用sleep方法

1)、让所有的线程按照同样的顺序获得一组锁。这种方法消除了 X 和 Y 的拥有者分别等待对方的资源的问题。

  2)、将多个锁组成一组并放到同一个锁下。前面Java线程死锁的例子中,可以创建一个银器对象的锁。于是在获得刀或叉之前都必须获得这个银器的锁。

  3)、将那些不会阻塞的可获得资源用变量标志出来。当某个线程获得银器对象的锁时,就可以通过检查变量来判断是否整个银器集合中的对象锁都可获得。如果是,它就可以获得相关的锁,否则,就要释放掉银器这个锁并稍后再尝试

 

是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

发生死锁的原因一般是两个对象的锁相互等待造成的。

那么为什么会产生死锁呢?
1.因为系统资源不足。
2.进程运行推进的顺序不合适。    
3.资源分配不当。

package com.wanglu;

import java.util.Timer;
import java.util.TimerTask;


public class Demo extends Thread{
    private String name;
    public Demo(){
        
    }
    public Demo(String name){
        this.name=name;
    }

    @Override
    public void run() {
        for(int i=0;i<5;i++){
            System.out.println(name+"______"+i);
        }
    }
    public static void main(String[] args) {
        final Demo thread1=new Demo("A");
        Timer timer = new Timer();
        thread1.start();
        timer.schedule(new TimerTask(){
            @Override
            public void run() {
                System.out.println(thread1.isAlive());
                System.out.println(thread1.getState());
            }
        }, 10000);
    }
}

// 例4.4.2 InterruptThreadDemo2.java
  class MyThread extends Thread
  {
  boolean stop = false; // 引入一个布尔型的共享变量stop
  public void run()
  {
  while(!stop) // 通过判断stop变量的值来确定是否继续执行线程体
  {
  System.out.println(getName()+' is running');
  try
  {
  sleep(1000); 
  }catch(InterruptedException e){
  System.out.println(e.getMessage());
  }
  }
  System.out.println('Thread is exiting...');
  }
  }
  class InterruptThreadDemo2
  {
  public static void main(String[] args) throws InterruptedException
  {
  MyThread m=new MyThread();
  System.out.println('Starting thread...');
  m.start();
  Thread.sleep(3000); 
  System.out.println('Interrupt thread...');
  m.stop=true; // 修改共享变量
  Thread.sleep(3000); // 主线程休眠以观察线程中断后的情况
  System.out.println('Stopping application...');
  }
  }
  在使用共享变量来中断一个线程的过程中,线程体通过循环来周期性的检查这一变量的状态。如果变量的状态改变,说明程序发出了立即中断该线程的请求,此时,循环体条件不再满足,结束循环,进而结束线程的任务。

nterrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。

注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。

 

 

1、数据库的隔离级别有几种,分别是什么?

2、索引的缺点?

3、ssh和springmvc的优缺点?

4、简述调用一个servlet的过程?

5、当队列满时,无一个消费者,有什么好的处理方式解决防止这个问题发生?

6、简述悲观锁和乐观锁?

7、memcache和oscache的存贮机制?

8、当velocity很大的时候,会导致加载速度过慢,有什么好的处理方式?

9、simpleDateFormate是线程安全的还是不安全的,根据是什么?

10、实现多线程的方式有2种,分别是继承thread和实现runnable,请问这两种方式的优缺点?

11、多线程怎么保证线程安全?

12、说一下对你印象比较深刻的项目(我是一个公司说了一个)

 

 

转载于:https://my.oschina.net/u/2610056/blog/692999

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值