面试

1、SSH:三大框架相关技能,Spring、Struts2、Hibernate;Struts2与Struts1的主要区别是什么?
    struts1是单例模式存在线程安全问题;
    struts2是多例模式不存在安全问题;

    struts1的action依赖servlet的api,使得execute要在容器中进行;
    struts2的action不依赖容器,使得execute可脱离容器执行;
    
    struts1通过validate方法或valitor扩展校验;
    struts2除了validate方法校验外还可以通过框架校验;
    
    struts1要求action继承Action或DiapatcherAction
    struts2一般继承ActionSupport
    
    Struts1可以使用jstl和el表达式
    struts2可以使用jstl和ognl表达式


2、Spring依赖注入的实现方式有哪3种?其特征都是什么?
    set
    构造器
    接口


3、Socket编程的基本原理和注意事项;
    Socket编程解决了不同主机进程间的相互通信问题
    ① 声明一个套接字类型的变量,需要在该变量定义中提供本机 IP 地址和通信端口并指明协议类型
    ② 向对方发出连接请求,连接时编程者需要提供对方 TCP/IP 地址和通信端口,
    同时SOCKET实现程序会自动向对方提供本机 TCP/IP 地址和通信端口;
    ③ 如果连接成功,会收到对方的应答信号,这以后的通信就可以通过套接字的相关操作来实现了。
    注意事项:
    ①s = new Socket(fm_ipaddr,fm_port); 这种写法,在对方端口当掉时,客户端会一直等待连接,并不会抛出异常。
    推荐写法:
    s = new Socket();
    s.setSoTimeout(180000);//读取数据超时设置3m
    s.connect(new InetSocketAddress(fm_ipaddr,fm_port), 2000);//建立连接超时设置
    ②s.sendUrgentData(0xFF);//判断一下网络是否断开
    ③是否关闭输出流和输入流
        对于同一个socket,如果关闭了输出流,则与该输出流关联的socket也会被关闭。
        所以一般不用关闭流,直接关闭socket就可以了。
    ④UDP发送数据的地址和接收数据的地址不一致的问题。
    UDP 的客户端发送给服务器,如果服务器的用于接收的网络接口有多个 IP 地址,
    那么服务器送响应的时候就会自动选择一个primary IP 地址回送给客户端。
    primary IP 地址有可能和客户端发送的 IP 地址不一样。
    如果客户端根据接收的响应的 IP 地址来判断是否是服务器发送的响应,那么就有可能出错。
    解决办法,一个是改造客户端:不再用 IP 地址判断是否是一个服务器发送的数据包,而是根据 DNS 得到的域名来判断。
    缺点是系统一定要有域名服务器,而且查询域名会影响效率;
    一个办法是服务器不是用 wildcard 来绑定 socket ,而是为每一个 IP 地址绑定一个 socket 。
    缺点是系统如果动态改变了 IP 地址就需要重新起动服务器,而且增加服务器必须 select(),用来检查所有的 socket 。
    ⑤socket 的端口号
    客户端的 socket 很少调用 bind() 来指明 socket 的端口号。相反通常是让操作系统自动分配一个端口号。
    TCP客户端 socket 的端口号是在调用了 connect() 之后,系统会自动分配端口号。
    UDP客户端 socket 的端口号是在第一次调用 sendto() 之后,系统会自动分配端口号。
    如果 UDP 的端口是自动分配的话,那么系统不会再改变这个端口号。


4、网络编程中的心跳机制原理和实现;
    原理:
    实现:
    Client启动一个定时器,不断发心跳;
    Server收到心跳后,给个回应;
    Server启动一个定时器,判断Client是否存在:
    时间差策略
    收到一个心跳后,记录当前时间(记为recvedTime)。
    判断定时器时间到达,计算多久没收到心跳的时间(T)=当前时间 - recvedTime(上面记录的时间)。
    如果T大于某个设定值,就可以认为Client超时了。


5、过去工作中是否有接触过接口通信,报文发送等技术;具体原理和实现如何?
    客户端:
    接收:
    InetAddress ip = InetAddress.getLocalHost();  
    int port = 8888;
    DatagramSocket getSocket = new DatagramSocket(port, ip);  
    byte[] buf = new byte[1024];
    DatagramPacket getPacket = new DatagramPacket(buf, buf.length);  
    getSocket.receive(getPacket);      
    发送:
    String getMes = new String(buf, 0, getPacket.getLength());
    SocketAddress sendAddress = getPacket.getSocketAddress();
    String feedback = "接收方说:我收到了!";  
    byte[] backBuf = feedback.getBytes();
    DatagramPacket sendPacket = new DatagramPacket(backBuf, backBuf.length, sendAddress);  
    getSocket.send(sendPacket);
    getSocket.close();
    
    服务端:
    发送:
    DatagramSocket sendSocket = new DatagramSocket();  
    String mes = "你好!接收方!";  
    byte[] buf = mes.getBytes();
    int port = 8888;  
    InetAddress ip = InetAddress.getLocalHost();  
    DatagramPacket sendPacket = new DatagramPacket(buf, buf.length, ip, port);  
    sendSocket.send(sendPacket);  
    接收:
    byte[] getBuf = new byte[1024];  
    DatagramPacket getPacket = new DatagramPacket(getBuf, getBuf.length);  
    sendSocket.receive(getPacket);  
    String backMes = new String(getBuf, 0, getPacket.getLength());
    System.out.println("接受方返回的消息:" + backMes);  
    sendSocket.close();  

    
6、多线程的实现方式有哪2种?区别主要是什么?线程池等概念;
    继承thread类:        不能资源共享。可以通过自身类的实例调用start    
    实现Runnable接口:    资源共享,同步快:synchronized (this) 。runnable接口没有start方法,需要调用Thread类的start方法
    线程池:
    调用线程的时候初使化一定数量的线程,有线程过来的时候,先检测初使化的线程还有空的没有,
    没有就再看当前运行中的线程数是不是已经达到了最大数,如果没有,就新分配一个线程去处理;
    但如果已经达到了最大数,另外的线程就只有等了,直到有新的“空闲线程”为止。
    线程池减少了在创建和销毁线程上所花的时间以及系统资源的开销
    // 创建一个可重用固定线程数的线程池
    ExecutorService pool = Executors.newFixedThreadPool(2);
    // 创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口
    Thread t1 = new MyThread();
    Thread t2 = new MyThread();
    Thread t3 = new MyThread();
    Thread t4 = new MyThread();
    Thread t5 = new MyThread();
    // 将线程放入池中进行执行
    pool.execute(t1);
    pool.execute(t2);
    pool.execute(t3);
    pool.execute(t4);
    pool.execute(t5);
    // 关闭线程池
    pool.shutdown();

    
7、过去开发的过程中代码是如何管理的?

8、请谈谈过去工作中自己认为比较有成就感的事情是什么?

9、对自己未来的职业如何规划?对当前新技术跟踪学习情况如何?

10、最新的JavaSE、JavaEE的版本是多少?都有哪些新的特征和改进?
    jdk7相比jdk6增加了一些功能、优化了性能以及简化了语法,比如:
   1.更简单的异常处理语句
   6.jvm优化、支持非java语言、正式支持G1垃圾收集器
   2.字符串支持switch
   3.二进制值定义
   4.泛型类型推断
   5.多线程中增加了并行分解框架(fork/join),以前看的时候这个还在测试

11、Oracle 中一个存储过程的格式分成哪几部分


12、Ibatis 和 Hibernate 的区别


13、缓存怎样实现
    

14、SERVLET多线程怎样实现
    servlet依赖于一个线程池来服务请求。
    线程池实际上是一系列的工作者线程集合。Servlet使用一个调度线程来管理工作者线程.
    当容器收到一个Servlet请求,调度线程从线程池中选出一个工作者线程,将请求传递给该工作者线程,
    然后由该线程来执行Servlet的 service方法。
    当这个线程正在执行的时候,容器收到另外一个请求,调度线程同样从线程池中选出另一个工作者线程来服务新的请求,
    容器并不关心这个请求是否访问的是同一个Servlet.当容器同时收到对同一个Servlet的多个请求的时候,
    那么这个Servlet的service()方法将在多线程中并发执行。
    Servlet容器是默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销,提升了对请求的响应时间,
    对于Tomcat可以在server.xml中通过<Connector>元素设置线程池中线程的数目。
    实现 SingleThreadModel 接口:
        如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题。
    同步对共享数据的操作:
        synchronized (this){XXXX}
    避免使用实例变量
        线程安全问题还有些是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。

        
15、从前项目中,Java和数据库之间用的是什么接口?怎样实现接口间传递数据
    JDBC、JNDI
    Class.forName(driver);
    Connection con = DriverManager.getConnection(url , username , password) ;
    preparedstatement ps = conn.preparestatement(sql);
    ResultSet rs = ps.executeQuery(sql);
    while(rs.next()){
        ...
    }
    

16、什么是SQL中的左连接与右连接
    select * from a left join b on a.aid = b.bid

你可能感兴趣的:(面试)