JAVA常问面试题

一. springClode常用组件

可参考:CSDN

二. Redis的优缺点

优点
速度快:因为数据存在内存中,类似于 HashMap , HashMap 的优势就是查找和操作的时间复杂
度都是O (1) 。
支持丰富的数据结构:支持 String ,List,Set,Sorted Set,Hash 五种基础的数据结构。
持久化存储:Redis 提供 RDB 和 AOF 两种数据的持久化存储方案,解决内存数据库最担心的
万一 Redis 挂掉,数据会消失掉
高可用:内置 Redis Sentinel ,提供高可用方案,实现主从故障自动转移。 内置 Redis
Cluster ,提供集群方案,实现基于槽的分片方案,从而支持更大的 Redis 规模。
丰富的特性:Key过期、计数、分布式锁、消息队列等。
缺点
由于 Redis 是内存数据库,所以,单台机器,存储的数据量,跟机器本身的内存大小。虽然
Redis 本身有 Key 过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定
期删除数据。
如果进行完整重同步,由于需要生成 RDB 文件,并进行传输,会占用主机的 CPU ,并会消耗
现网的带宽。不过 Redis 2.8 版本,已经有部分重同步的功能,但是还是有可能有完整重同步
的。比如,新上线的备机。
修改配置文件,进行重启,将硬盘中的数据加载进内存,时间比较久。在这个过程中, Redis
不能提供服务。

三 . Java中实现多线程有几种方法

在Java中,实现多线程有以下几种方法:
1.继承Thread类:创建一个继承自Thread类的子类,并重写其run()方法来定义线程执行的逻辑。然后通过创建子类的实例对象并调用start()方法来启动线程。
举例:class MyThread extends Thread {
    public void run() {
        // 线程执行的逻辑
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
    }
}
2.实现Runnable接口:创建一个实现Runnable接口的类,并实现其run()方法来定义线程执行的逻辑。然后通过创建该类的实例对象,并将其作为参数传递给Thread类的构造方法来创建线程对象,最后调用start()方法来启动线程。
举例:
class MyRunnable implements Runnable {
    public void run() {
        // 线程执行的逻辑
    }
}
public class Main {
    public static void main(String[] args) {
        MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start();
    }
}
3.使用Callable和Future:创建一个实现Callable接口的类,并实现其call()方法来定义线程执行的逻辑。然后通过创建该类的实例对象,并将其作为参数传递给ExecutorService的submit()方法来提交任务,最后通过Future对象获取线程的执行结果。
举例:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
class MyCallable implements Callable<String> {
    public String call() {
        // 线程执行的逻辑
        return "线程执行结果";
    }
}
public class Main {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        MyCallable callable = new MyCallable();
        Future<String> future = executor.submit(callable);
        String result = future.get();
        System.out.println(result);
        executor.shutdown();
    }
}
4.使用线程池:通过创建线程池来管理和复用线程资源。可以使用Executors类提供的静态方法创建不同类型的线程池,然后通过提交任务给线程池来执行。
举例:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 10; i++) {
            Runnable runnable = new MyRunnable();
            executor.execute(runnable);
        }
        executor.shutdown();
    }
}

首先线程池有几个核心的参数概念:
1. 最大线程数maximumPoolSize
2. 核心线程数corePoolSize
3. 活跃时间keepAliveTime
4. 阻塞队列workQueue
5. 拒绝策略RejectedExecutionHandler
当提交一个新任务到线程池时,具体的执行流程如下:
1. 当我们提交任务,线程池会根据corePoolSize大小创建若干任务数量线程执行任务
2. 当任务的数量超过corePoolSize数量,后续的任务将会进入阻塞队列阻塞排队
3. 当阻塞队列也满了之后,那么将会继续创建(maximumPoolSize-corePoolSize)个数量的线程来
执行任务,如果任务处理完成,maximumPoolSize-corePoolSize额外创建的线程等待
keepAliveTime之后被自动销毁
4. 如果达到maximumPoolSize,阻塞队列还是满的状态,那么将根据不同的拒绝策略对应处理

四. spring常用注解

@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中
的所有响应请求的方法都是以该地址作为父路径。
@RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
@ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。

@Service 在业务逻辑层使用(service层)

@Repository 在数据访问层使用(dao层)

@Controller 在展现层使用,控制器的声明

@Configuration 声明当前类为配置类,相当于xml形式的Spring配置(类上)

@Bean 注解在方法上,声明当前方法的返回值为一个bean,替代xml中的方式(方法上)

@Configuration 声明当前类为配置类,其中内部组合了@Component注解,表明这个类是一个bean(类上)

@ComponentScan 用于对Component进行扫描,相当于xml中的(类上)

@PathVariable 用于接收路径参数,比如@RequestMapping(“/hello/{name}”)申明的路径,将注解放在参数中前,即可获取该值,通常作为Restful的接口实现方法。

@RestController 该注解为一个组合注解,相当于@Controller和@ResponseBody的组合,注解在类上,意味着,该Controller的所有方法都默认加上了@ResponseBody。

五.  Linux常用命令

目录操作命令 cd、pwd、ls

cd : 切换到另一个目录   pwd: 打印当前所在目录  ls: 列出目录内容

文件操作命令cp、rm、mv、file

cp: 复制文件  rm: 删除文件  mv: 移动文件  file : 查看文件类型

文件内容查看命令 cat、tail、head

cat : 查看文本文件内容,将文本文件内容全部打印到标准输出选项 -n 输出结果带行号

tail : 查看文件尾部10行,例如:tail /root/install.log,选项-N (N为正整数)可以指定显示末尾N行内容 

head:查看文件头部10行,例如:head /root/install.log,选项-N (N为正整数)可以指定显示头部N行内容

六. sql优化

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。    
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:    
select id from t where num is null    
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:    
select id from t where num=0    
3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。    
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,考虑用union all代替 or
5.in 和 not in 也要慎用,否则会导致全表扫描 考虑用between  and 代替
6.避免使用 like '%aaa%' 使用'aa%'效率高一点,最左匹配原则。
7.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:    
select id from t where num/2=100    
应改为:    
select id from t where num=100*2  
8.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:    
select id from t where substring(name,1,3)='abc'--name以abc开头的id    
应改为:    
select id from t where name like 'abc%'   
9.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
10.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。  
11 考虑用exists 代替 in 
12 使用 select 具体字段 from 表  少用select *

七. JVM内存模型介绍


可参考 CSDN

八. JAVA设计模式

CSDN可参考 CSDN

更所精彩内容可点击链接下载:10万字总结Java面试题和答案.pdf
链接: https://pan.baidu.com/s/1Tw00JL1MxQpD8lbN61w39w?pwd=ehnw 提取码: ehnw

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值