自学内容网 自学内容网

【java常见面试题】

IO

按照流的流向分类:输入流和输出流

按照操作单元分类:可以分为字节流和字符流

按照流的角色划分:节点流和处理流

所有输入流的基类:InputStream/Reader 字节流/字符流

所有输出流的基类:OutputStream/Reader 字节流/字符流

反射机制

在运行状态下,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用这个对象的方法和属性;
在这里插入图片描述

java获取反射的三种方式

//通过建立对象
Student stu  = new Student();
Class classobj1 = stu.getClass();
system.out.println("classobj1.getName()")
//通过所在路径-相对路径
Class classobj2 = Class.forName("fanshe.Student");
system.out.println("classobj2.getName()")
//通过类名
Class classobj3 = Student.class;
system.out.println("classobj3.getName()")

线程

轻量级(成本低),并发,通信简单(线程共享内存),同步需求(共享资源会造成竞争,死锁)
在这里插入图片描述

//继承Thread类
public class MyThread extends Thread{
    public void run(){
        sout("线程运行");
    }
}
public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
    }
}

//实现Runnable接口
public class MyRunnable implements Runnable {
    public void run() {
        System.out.println("线程运行");
    }
}

public class Main {
    public static void main(String[] args) {
        MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start();
    }
}
//使用Callable和FutuerTask

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class MyCallable implements Callable<String> {
    public String call() throws Exception {
        return "线程运行";
    }
}

public class Main {
    public static void main(String[] args) {
        MyCallable callable = new MyCallable();
        FutureTask<String> futureTask = new FutureTask<>(callable);
        Thread thread = new Thread(futureTask);
        thread.start();
        try {
            System.out.println(futureTask.get());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

java八大基本类型

byte ,short,long, int ,float,double,boolean,char

普通类和抽象类

普通类不能包含抽象方法,抽象类可以

抽象类不能被直接实例化,普通类可以

hashCode和equals

用来判断hashset插入值的时候不允许插入相同的值

java为什么是值传递

java程序设计采用按质调用,方法得到的是一个值的拷贝,不修改任何参数的内容。

堆和栈的区别

堆内存储java对象

栈内存存储java的方法执行的局部变量

sleep和wait

sleep()方法可以在任何地方使用,wait()在同步只使用

sleep()不放弃对象锁 ,wait()放弃对象锁

sleep()为Thread的静态方法,wait()为Object的成员方法

进程和线程

进程为资源分配的最小单位

线程为CPU调度的最小单位

一个进程内部包含多个并发执行的线程

在进程内部多个线程共享一个进程资源

线程池的种类

可缓存线程池 newCachedThreadPool

单一线程池 newSingleThreadPool

定长线程池 newFixedThreadPool

线程池参数

核心线程大小 corePoolSize

最大线程数 maxPoolSize

空闲线程存活时间 keepAliveTime

拒绝策略 handler

线程工厂 threadFactory

序列化

序列化:把对象转化为可以传输的字节序列的过程

反序列化:将可传输的字节序列还原为对象的过程

目的:实现对象存储,实现网络传输

Http Https

http: 不安全 80端口 超文本传输协议 明文传输

https:http的加密通道 需要CA证书 安全 443端口

三次握手 四次挥手

第一次:

​ 客户端:什么都不能确认

​ 服务器:确定可以接受到客户端的请求

第二次:

​ 客户端:自己发送,接受正常,对方发送,接受正常

​ 服务器:自己接受正常, 对方发送正常

第三次:

​ 客户端:自己发送,接受正常,对方发送,接受正常

​ 服务器:自己发送,接受正常,对方发送,接受正常

TCP连接释放需要4个步骤,两次挥手就可以释放一段到另一端的连接,四次全部释放

TCP和UDP

TCP:有连接 资源需求多 数据安全 顺序结构
UDP: 无连接 资源需求少 会丢包 不保证顺序

get和post

get:通过请求行传递用户所输入的内容,其内容火灾浏览器上全部显示在地址栏上

​ 有长度

​ 不安全

post:将请求数据已表单的形式传输

​ 没有提交长度

​ 安全

排序算法

冒泡排序:比较相邻的两个元素,第一轮可以找到最大元素

插入排序:把新的元素插入到已排序好的队列中

选择排序:选出最大或最小的元素放在第一位,依次选择,直到元素个数为0

设计模式

单例 代理 工厂 适配器 装饰 迭代器

String StringBuffer StringBuilder

String:不可变,每次产生一个新的对象

StringBuffer:可变,性能好,安全,多线程

StringBuilder:可变,性能好,不安全,单线程

异常体系

throwable>error>exception

JDBC使用过程

注册驱动 创建连接 创建Statement对象 执行SQL(考虑事务的异常,回滚事务) 处理SQL结果 关闭连接

SQL优化

用EXISTS代替IN 用NOT EXISTS代替Not IN

避免全表扫描

建立索引

避免索引失效

事务

原子性:要么都发生,要么都不发生

一致性:事务前后数据保持一致

隔离性:多个用户访问数据库,保证一个用户的事务不会影响到另一个用户的事务

持久性:事务一旦提交,数据的改变是永久性的

隔离级别

读未提交:脏读,不可重复读,幻读

读已提交:不可重复读,幻读 Oracle默认隔离级别

可重复读:幻读 Mysql默认隔离级别

串行化:不产生

脏读:一个用户对数据进行修改时被另一个用户读到了

不可重复读:两次查询到了不同的结果

幻读:产生额外的记录

分库分表

垂直分割:将不同的表存储到不同的数据库中

水平分割:将一张表中的数据存储到不同数据库中


原文地址:https://blog.csdn.net/weixin_64446270/article/details/142407493

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!