1、静态代码—》父类构造函数—》子类构造函数
答: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)对象
线程安全,比较常用,但容易产生垃圾,因为一开始就初始化
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();
}
}
}