哈喽~,大家好,我是千羽。
下面分享我认识的一位24届大佬华中科技大学985硕,字节二面。
问了常规基础和面试题,总体上不难。
- 1、如何使用MyISAM引擎(建表时指定engine为MyISAM)
- 2、Linux下如何查找CPU占用率最高的进程(top指令)
- 3、编程题:实现带有TTL的LRUCache(太简单了)
1、如何使用MyISAM引擎(建表时指定engine为MyISAM)
使用MyISAM引擎建表需要指定engine为MyISAM。以下是使用MyISAM引擎建表的一般步骤:
- 打开MySQL命令行客户端或MySQL管理工具,连接到相应的数据库。
- 创建表时,使用CREATE TABLE语句并指定engine为MyISAM。例如:
CREATE TABLE my_table (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT(11),
PRIMARY KEY (id)
) ENGINE=MyISAM;
在上述示例中,创建了一个名为"my_table"的表,包含id、name和age字段。id字段为主键,engine为MyISAM。
- 创建完表后,可以使用SHOW CREATE TABLE语句查看表的详细信息,包括所使用的引擎。例如:
SHOW CREATE TABLE my_table;
这将显示包含表的所有详细信息的查询结果,包括engine为MyISAM。
请注意,使用MyISAM引擎的表不支持事务和外键约束。此外,MyISAM表在系统发生崩溃时可能会导致数据损坏,因此需要定期备份数据。在使用MyISAM引擎时,建议对表进行优化以提高性能,例如使用OPTIMIZE TABLE语句。
2、Linux下如何查找CPU占用率最高的进程(top指令)
在Linux下,可以使用top
命令来查找CPU占用率最高的进程。top
命令会实时显示系统中各个进程的资源占用状况,并按照CPU占用率的高低进行排序。
要使用top
命令,请按照以下步骤操作:
- 打开终端(Terminal)。
- 在终端中输入以下命令:top
然后按回车键。
这会启动top
命令,并显示系统中各个进程的CPU占用率等信息。
在top
命令的界面中,你会看到各个进程按照CPU占用率的高低排列。默认情况下,top
命令会按照CPU占用率排序,占用CPU资源最多的进程会排在最前面。
你可以使用键盘上的方向键来浏览不同的进程列表,按下q
键退出top
命令。
如果你想在top
命令中查看其他资源的使用情况,可以使用以下命令:
- 要查看内存使用情况,按下
M
键。 - 要查看交换空间使用情况,按下
S
键。 - 要查看磁盘I/O情况,按下
D
键。
3、编程题:实现带有TTL的LRUCache(太简单了)
在Java中实现带有TTL(Time To Live)的LRU(Least Recently Used)缓存,我们可以使用Java标准库中的LinkedHashMap
。LinkedHashMap
是一个带有链接和排序的散列映射,它同时具有LRU和时间戳特性。下面是一个简单的实现:
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public class LRUCacheWithTTL<K, V> {
private final int capacity;
private final long ttl;
private final Map<K, ValueHolder<V>> cache;
public LRUCacheWithTTL(int capacity, long ttl) {
this.capacity = capacity;
this.ttl = ttl;
this.cache = new LinkedHashMap<>(capacity, 0.75f, true) {
protected boolean removeEldestEntry(Map.Entry<K, ValueHolder<V>> eldest) {
if (size() > capacity) {
expireOldestEntry();
return true;
} else {
return false;
}
}
};
}
public synchronized V get(K key) {
ValueHolder<V> valueHolder = cache.get(key);
if (valueHolder == null) {
return null;
} else {
valueHolder.touch();
return valueHolder.getValue();
}
}
public synchronized void put(K key, V value) {
if (cache.containsKey(key)) {
cache.get(key).setValue(value);
} else {
ValueHolder<V> valueHolder = new ValueHolder<>(value, System.currentTimeMillis());
cache.put(key, valueHolder);
expireOldestEntry();
}
}
private void expireOldestEntry() {
ValueHolder<V> eldest = null;
long now = System.currentTimeMillis();
for (ValueHolder<V> valueHolder : cache.values()) {
if (eldest == null || valueHolder.getTimestamp() < eldest.getTimestamp()) {
eldest = valueHolder;
}
}
if (eldest != null && now - eldest.getTimestamp() > ttl) {
cache.remove(eldest.getKey());
}
}
}
这里我们定义了一个内部类ValueHolder
来保存值和时间戳:
public class ValueHolder<V> {
private V value;
private long timestamp;
public ValueHolder(V value, long timestamp) {
this.value = value;
this.timestamp = timestamp;
}
public V getValue() {
return value;
}
public void setValue(V value) {
this.value = value;
}
public long getTimestamp() {
return timestamp;
}
}
- 原文链接:https://github.com/warthecatalyst/What-to-in-Graduate-School/blob/main/秋招的面经/华科计科第二人的秋招报告.md