20191009秋招JAVA面试总结

代码块执行顺序:

1、静态代码—》父类构造函数—》子类构造函数

2、HashMap实现原理及特点

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

当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。

因为HashMap的好处非常多,我曾经在电子商务的应用中使用HashMap作为缓存。因为金融领域非常多的运用Java,也出于性能的考虑,我们会经常用到HashMap和ConcurrentHashMap。

特点:允许键和值为null

         线程不安全

         实现Map接口

         HashMap存储着Entry(hash,key,value,next)对象

3、单例模式

       线程安全,比较常用,但容易产生垃圾,因为一开始就初始化      

 public class Singleton { 

           private static Singleton instance = new Singleton(); 

           private Singleton (){} 

           public static Singleton getInstance() { 

                  return instance; 

           } 

}

线程安全,延迟初始化。这种方式采用双锁机制,安全且在多线程情况下能保持高性能。

public class Singleton { 

    private volatile static Singleton singleton; 

    private Singleton (){} 

    public static Singleton getSingleton() { 

    if (singleton == null) { 

        synchronized (Singleton.class) { 

        if (singleton == null) { 

            singleton = new Singleton(); 

        } 

        } 

    } 

    return singleton; 

    } 

}

Volatile能使变量变为可见性(即一个线程A修改一个共享变量后,能保证线程B读取到最新值。

选择题注意点

List的remove方法

List.remove(int i);移除指定位置的元素;

List.remove(object o);移除指定元素;

编程

1、线程A向有界队列Q中不停写入数据,线程B从有界队列中不停读取数据

package com.hieu.cxh.limitqueue;


import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
 
/**
 * @author cxh
 * @version JDK1.8.0_171
 * @date on  2018/10/26 14:21
 * @descrption
 */
public class BlockQueueDemo {
 
        public static void main(String[] args) {
            final BlockingQueue queue = new ArrayBlockingQueue(3);//线性阻塞有界队列
            //for(int i=0;i<2;i++){
                new Thread(){
                    public void run(){
                        while(true){
                            try {
                                Thread.sleep((long) (Math.random()*1000));
                                System.out.println(Thread.currentThread().getName() + "准备放数据!");
                                queue.put(1);
                                System.out.println(Thread.currentThread().getName() + "已经放了数据," +
                                        "队列目前有" + queue.size() + "个数据");
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
 
                        }
                    }
 
                }.start();
            //}
 
            new Thread(){
                public void run(){
                    while(true){
                        try {
                            //将此处的睡眠时间分别改为100和1000,观察运行结果
                            Thread.sleep(100);
                            System.out.println(Thread.currentThread().getName() + "准备取数据!");
                            queue.take();
                            System.out.println(Thread.currentThread().getName() + "已经取走数据," +
                                    "队列目前有" + queue.size() + "个数据");
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
 
            }.start();
        }
}

2、请简单写出使用Java语言连接MySQL数据库的代码片段,并使用分页查询获取第二页的数据(每页10条)将获取到的结果集打印在控制台。

public class JDBC {
	 private static final int pagesize = 10;
	 public static void main(String[] args) {  
		  	int page = 2;
	        try {  
	            Class.forName("com.mysql.jdbc.Driver");  
	            String databaseName = "phildatabase";// 已经在MySQL数据库中创建好的数据库。  
	            String userName = "root";// MySQL默认的root账户名  
	            String password = "";// 默认的root账户密码为空  
	            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/" + databaseName, userName, password);  
	            String sql = "select * from test limit ?,?";  
	            PreparedStatement pre = conn.prepareStatement(sql);
	            //pre.setMaxRows(page*pagesize);设置最多查询多少行
	            pre.setInt(1, (page-1)*pagesize);
	            pre.setInt(2, pagesize);
	            ResultSet rs = pre.executeQuery(sql);
	            //rs.relative((page-1)*pagesize);使游标移到当前页的第一条数据
	            while (rs.next()) {  
		               System.out.println(rs.getString(1) + "\t" + rs.getString(2));  
		        } 
	            conn.close();  
	        } catch (Exception e) {  
	            e.printStackTrace();  
	        }  
	    }  
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章