面试问题(3)

来源:互联网 发布:车辆保险计算器软件 编辑:程序博客网 时间:2024/06/01 23:05

1.final(变量、方法、类) finally finalize
final:java中的关键字,修饰符。
1.如果一个类被声明为final,就意味着它不能再派生出新的子类,不能作为父类被继承。因此,一个类不能同时被声明为absrtact抽象类的和final的类。
2.如果将变量或者方法声明为final,可以保证它们在使用中不被改变.
2.1 被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。
2.2被声明final的方法只能使用,不能重载
finally:java的一种异常处理机制。
finally是对Java 异常处理模型的最佳补充。finally 结构使代码总会执行,而不管有无异常发生。使用 finally 可以维护对象的内部状态,并可以清理非内存资源。特别是在关闭数据库连接这方面,如果程序员把数据库连接的close()方法放到finally中,就会大大降低程序出错的几率。
finally()一定会执行,除非jvm停止运行。至少有两种情况下finally语句是不会被执行的:
(1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。
(2)在try块中有System.exit(0);这样的语句,System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。

public class FinnlyTest {public static void main(String[] args) {        System.out.println(test1());    }    public static int test1() {        int b = 20;        try {            System.out.println("try block");            return b += 80;         }        catch (Exception e) {            System.out.println("catch block");        }        finally {            System.out.println("finally block");            if (b > 25) {                System.out.println("b>25, b = " + b);            }        }        return b;    }}

finalize:Java中的一个方法名。
Java技术使用finalize()方法在垃圾收集器将对象从内存中清除出去前,做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。
2.static 关键字作用
使用情况:成员变量,成员方法,代码块,内部类。
1)成员变量:静态变量属于类,只要静态变量的类被加载,这个静态变量就会被分配空间。使用:“类.静态变量”“对象.静态变量”
2)成员方法:类的方法,不需要创建对象既可以被调用。不能使用this,super关键字。
3)静态代码块:类中独立于成员变量和成员函数的代码块。JVM会直接按照顺序执行代码块,并且只会被执行一次。
4)内部类:可以不依赖外部对象而被实例化。

3.负载均衡怎么实现
实现分为两个部分:
1)根据负载均衡算法和web服务器列表计算得到集群中web服务器的地址。
2)将请求发送到该地址对应的web服务器上。
算法:
1)轮询:所有请求依次分发到每台应用服务器上。
2)加权轮询:在轮询上加权,权重大的访问高。
3)随机
4)最少连接数
5)源地址散列:根据ip进行hash,用户会话在一个周期可以重复使用。

6.插入节点怎么分裂
B+结构的分裂,
7.索引有哪些,数据库优化
http://blog.csdn.net/qq_23211905/article/details/72259034
8.hashmap的实现原理重点
参考:http://blog.csdn.net/qq_23211905/article/details/72592134
9.concurrentHashMap
http://blog.csdn.net/qq_23211905/article/details/72804144
10.锁的优化策略
① 读写分离 ReadWriteLock
② 分段加锁 segement
③ 减少锁持有的时间
④ 多个线程尽量以相同的顺序去获取资源
自旋锁:
锁消除:对检测到不可能存在共享数据竞争的锁进行消除。
锁粗化:如果存在连续加锁的地方,锁代码加大。
轻量级锁:如tryLock,volatile.
偏向锁:偏向第一个获取它的线程。
11.线程池
http://blog.csdn.net/qq_23211905/article/details/72603221
12.synchronized和Lock一些区别
1)synchronized使用object对象本身的notify,wait,notifyAll调度机制,lock使用condition进行线程间的调度
2)用法不同,synchronized用在需要同步的对象,方法,代码块,其中括号表示需要锁的对象。Lock有显示的指定起始和终止位置。
3)性能不一样。Lock接口的实现类ReentrantLock。拥有和synchronized相同的并发性和内存语义,还多了投票锁、定时锁、等候和中断锁。在竞争激烈的情况下synchronized性能弱ReetrantLock,当竞争不激烈时synchronized性能较好。
4)机制不一样,synchronized获得锁和释放的方式都在快结构中,当获取多个锁时候,释放的顺序相反。Lock需要开发人员主动释放,必须放在finally中,否则会发生死锁,tryLock是非阻塞的。

14.servlet:生命周期
servlet是采用java语言编写的服务器端程序,运行于web服务器中的servlet容器中,主要功能是提供请求/响应Web服务模式,生成动态的web内容。
优点:
1)较好的移值性
2)执行效率高,针对每个请求创建一个线程来执行
3)功能强大,可以与web服务器进行交互
4)使用方便,提供了许多方法读取和设置http消息头,处理cookie
5)可扩展性强。通过doGet()和doPost()响应客户端请求

处理客户端步骤:
1)用户单击一个链接来向servlet发起请求
2)web服务器接收到请求后,将请求交给对应的容器处理,当容器发现是servlet发起的请求会创建两个对象:httpservletResponse,httpservletRequest
3)容器根据请求消息中的url消息找到对应的servlet,然后针对该线程请求一个单独的线程
4)通过doGet或者doPost完成具体的响应任务,同时生产动态页面返回给容器
5)容器将消息组装成http格式返回给客户端。

15.equals和==,hashcode
1)”==”运算符用来比较两个常量的值是否相等。该运算符用于比较对应的内存中存储的数值是否相同,比较基本数据类型。
2)equels是object类提供的方法之一。object类中定义的equels定义的相等与‘==’一样,比较的是引用。该方法可以被覆盖。String中equels就进行了覆盖,使其比较的是值。
3)hashCode()方法是从Object类中继承的,用来鉴定两个对象是否相等。Object类中的hashCode返回对象在内存中地址转成的int值,如果没有重写hashCode方法,任何对象返回的hashCode都是不相等的,
一般在重写eques是也会重写hashcode方法,否则违反hashCode的通用约定。
16.cookie和session
1)cookie保存在客户端,session保存在服务端
2)cookie安全性较弱
3)cookie性能较高,session保存在服务器当访问量增加会降低服务器性能。
4)单个cookie保存的数据不能超过4KB,session不存在。cookie中会保证一个sessionId.
17.大数据平台如何处理数据的,集群生态环境,内存溢出这么办等
18.使用switch要注意的地方
1)switch(expr)其中expr只能是枚举常量或者一个整数表达式。
2)其中整数表达式可以是int或者Integer,其中byte,short,char可以隐式的转成int可以使用,其他long,double,float,string不可以,如果要使用必须强制转换。java 1.7可以使用string了。
3)string实现原理是通过对string对象调用hashcode得到int的hash值,然后匹配。
4)一点要加break.
19.java的基本数据类型
byte(1字节,8bit),int(4字节,32),short(2,16),float(4,32双精度为64),boolen(1,8),char(2,16),double(4,64),long(4,64)

byte<short<char<int<long<float<double

java语言采用unicode编码,一个字符占用2个字节,可以用来存储中文。

20.右移符号
“>>“,将运算的对象对应的二进制右移指定的位数,若为正数则高位补0,负数补1。
”>>>”将运算的对象对应的二进制右移指定的位数,高位补0.
“<<”左移,相当于原值乘2的n次方,低位补0。
21.异常处理原理是什么?运行时异常和普通异常的区别
java将异常当做对象类处理,定义了一个基类(Throwable)作为所有异常的父类。异常分为Error和Exception两大类。
1)Error表示程序运行时出现了非常严重的错误,改错误是不可恢复的。属于JVM层次的严重错误,会导致程序终止执行。编译期也不会检查Error错误,不推荐捕捉Error异常。
2)Exception表示可恢复的异常,分为运行时异常和检查异常
检查异常:所有继承自Exception并且不是运行时异常都是可检查异常,比如Io和sql异常,一般要try catch.
运行时异常:编译器没有强制对其进行捕获和处理。如常见的:空指针,数组越界,类型转换异常。

异常处理注意问题:
1)java异常处理到了多态的概率,先捕获子类在捕获基类的异常信息。
2)尽早抛出异常
3)自定义异常
4)异常能处理就处理,不能处理抛出。
22.Java IO流的实现机制是什么
字节流,字符流。
字节流以字节(8bit)为单位。字符流以字符(16bit)为单位。
主要区别:字节流在处理输入时不会用到缓存,而字符流会用到缓存。
这里写图片描述
23.Java Socket是什么
Socket是套接字,可以实现不同虚拟机或者不同计算机之间额通信。
分为两类:面向连接的Socket通信协议(TCP),面向无连接的通信协议(UDP)。
Socket生命周期:打开Socket、使用Socket收发数据、关闭Socket.