• Java面试——专业技能


    优质博文:IT-BLOG-CN

    在这里插入图片描述

    一、简单讲下 Java 的跨平台原理


    由于各个操作系统WindowsLinux等)支持的指令集不是完全一致的。就会让我们程序在不同的操作系统上要执行不同的程序代码。Java 开发了适用于不同操作系统及位数的 Java 虚拟机来屏蔽系统之间的差异,提供统一的接口(Java API)。对于 Java 开发者而言,只需要在不同的操作系统上安装对应的 Java 虚拟机即可。这时我们的程序只需要遵循 Java 规范,就可以在所有的操作系统上运行 Java 代码。如果我们需要将系统部署到不同的环境时,只需要在系统上安装对应版本的 Java 虚拟机(JVM)即可。

    二、装箱与拆箱


    装箱:把基本数据类型转换成对应的包装类型(Integer i = 1:自动装箱,源码中通过 Integer.valueOf(1)方法进行装箱)。
    拆箱:把包装类型转换为基本数据类型(int j = i:自动拆箱,手动拆箱:int j = i.intVaule()也是自动拆箱的源码中所使用的方法)。
    为什么有了基本数据类型,还需要包装类型:因为Java是面向对象的语言,而基本数据类型不具备现象对象的特性(null等)。

    三、实现一个拷贝文件的工具类使用字节流还是字符流


    我们拷贝的文件不确定是只包含字符流,有可以能有字节流(图片、声音、图像等),为考虑到通用性,要使用字节流。

    四、介绍下线程池


    JDK5 中增加了并发库,为 Java 线程的管理和使用提供了强大的便利性。java.util.current 包中提供了对线程的优化和管理的各项操作,该包提供了线程的运行,线程池的创建,线程声明周期的控制。
    Java 通过 Executors提供四个静态方法创建四种线程池,分别是:
    【1】newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需求,可灵活回收空闲线程,若无可回收,则创建新线程。
    【2】newFixedThreadPool:创建一个定长线程池,可以控制最大线程并发数,超出的线程会在队列中等待。
    【3】newScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行。
    【4】newSingleThreadExecutor:创建一个单线程的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。
    线程池(数据库连接池类似)的作用?
    【1】限定线程的个数,不会导致由于线程过多导致系统运行缓慢或者崩溃。
    【2】线程池不需要每次都去创建和销毁,节约资源。
    【3】线程池不需要每次都去创建,提高响应时间。

    五、JSP和 Servlet 有哪些相同点和不同点


    Jsp 继承了 HttpServlet 所以 Jsp 是 Servlet 技术的扩展,所有的 Jsp 文件编译就是一个 Servlet,JVM 只识别 Java 的类,不能识别 Jsp 代码,Web 容器将 Jsp 的代码编译成 JVM 能够识别的 Java 类。Servlet 如果要实现 Html 功能,必须使用 Writer 输出对应的 Html 标签,比较麻烦。而 Jsp 的情况是 Java 和 Html 可以组合成一个名为 .jsp 的文件,做界面展示比较方便而嵌入逻辑比较复杂。
    Jsp 与 Servlet 主要的不同点在于 Jsp 侧重于视图,Servlet 主要用于控制逻辑。Servlet 中没有内置对象,Jsp 中的内置对象必须通过 HttpServletRequst 对象、HttpServletResponse 对象以及 HttpServlet 对象得到。

    六、简单介绍一下关系数据库三范式


    范式就是规范,就是关系型数据库在设计表时,要遵循的三个规范。要想满足第二范式必须先满足第一范式,要满足第三范式必须先满足第二范式。
    第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。列数据的不可分割
    第二范式(2NF)要求数据库表中的每个行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。(主键)
    满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。(外键)
    反三范式,有的时候为了效率,可以设置重复或者可以推导出的字段。例如:订单(总价)和订单项(单价)

    七、Mysql 数据库的默认的最大连接数


    为什么需要最大连接数?特定服务器上面的数据库只能支持一定数目同时连接,这时候我们一般都会设置最大连接数(最多同时服务多少连接)。在数据库安装时都会有一个默认的最大连接数为100。
    【1】可以通过设置 my.ini 配置文件中的如下属性进行设置:

    max_connections=100
    

    【2】可以通过命令进行设置:这种方式有个问题,就是设置的最大连接数只在 Mysql 当前服务进程有效,一旦 Mysql 重启,又会恢复到初始状态。因为 Mysql 启动后的初始化工作是从其配置文件中读取数据的,而这种方式没有对其配置文件做更改。

    mysql>show variables like 'max_connections';(查可以看当前的最大连接数)
    msyql>set global max_connections=1000;(设置最大连接数为1000,可以再次查看是否设置成功)
    

    八、说一下 Mysql 和 Oracle 的分页


    Mysql是使用关键字 limit 来进行分页的 limit offset,size 表示从多少索引去多少位。Oracle 的分页,使用三层嵌套查询。

    // MySql 分页语句
    String sql = "select * from students order by id limit " + pageSize*(pageNumber-1) + "," + pageSize;
    // Oracle 分页语句
    String sql = 
    	 "select * from " +  
    	      "(select *,rownum rid from (select * from students order by postime desc) 
                                              where rid<=" + pagesize*pagenumber + ") as t" + 
    	 "where t>" + pageSize*(pageNumber-1);
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r6YZoIlQ-1612365596544)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

    九、简单讲一下数据库的触发器的使用场景


    触发器语法:

    CREATE [OR REPLACE] TRIGGER 触发器名称 {BEFORE|AFTER} {DELETE|INSERT|UPDATE[OF 列名]} ON 表名 [FOR EACH ROW [WHEN(条件)]] PLSQL块
    

    触发器分类:
    行级触发器: 行级触发器作用的每一条记录,都会被触发,在行级触发器上使用 :old和 :new伪记录变量识别值的状态
    语句级触发器: 在指定的操作之前或者操作之后执行一次,不管这条语句影响了多少行,只执行一次。

    语句实操:

    -- 1、:old和:new 代表同一条记录
    -- 2、:old 表示操作该行之前,这一行的值。
    --    :new 表示操作改行之后,这一行的值。
    
    --创建触发器
    create or replace trigger checksalary
    before update
    on temp
    for each row 
    begin
      if :new.sal < :old.sal then
        raise_application_error("将薪");
      end if;
    end;
    

    十、简单讲一下数据库的存储过程的使用场景


    我们可以将存储过程理解为编程中的方法,存储过程和方法一样有参数和返回值。是为了完成特定功能的SQL指令集,经编译后存储在数据库中,用户通过指定存储过程的名字并给指定参数来调用执行它。

    存储过程语法:

    CREATE [OR REPLACE] PROC[EDURE] 存储过程名
    @参数1 [数据类型]=[默认值] [OUTPUT]
    @参数2 [数据类型]=[默认值] [OUTPUT]
    AS
    SQL语句
    EXEC 过程名[参数]

    存储过程的优点:
    【1】存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,因此使用存储过程可以大大提高数据库执行速度。
    【2】通常,复杂的业务逻辑需要多条 SQL 语句。这些语句要分别地从客户机发送到服务器,当客户机和服务器之间的操作很多时,将产生大量的网络传输。如果将这些操作放在一个存储过程中,那么客户机和服务器之间的网络传输就会大大减少,降低了网络负载。
    【3】存储过程创建一次便可以重复使用,从而可以减少数据库开发人员的工作量。
    【4】安全性高,存储过程可以屏蔽对底层数据库对象的直接访问,使用 EXECUTE 权限调用存储过程,无需拥有访问底层数据库对象的显式权限。

    语句实操:

    --1)、带输入输出参数
    create or replace procedure proc_office --存储名称
    @id int,@name varchar(20) output --(参数名 参数类型 [传出值:output]
    as
    begin
    select @name=name from db where id=@id --sql语句
    end
    
    declare @houseName varchar(20) --声明一个变量,获取存储过程传过来的值
    execute proc_office 4,@houseName output --执行 存储名称 输入参数 输出参数带有output
    
    select @houseName --显示值
    
    --2)、带返回值
    create or replace procedure proc_office_info --存储名称
    @id int
    as
    begin
    if(select name from db where id=@id)=null --sql语句
    begin
    return -1
    end
    else
    begin
    return 1
    end
    end
    
    declare @houseName varchar(20) 
    exec @houseName=proc_office_info 2
    print @houseName
    

    十一、简单介绍一下 Activiti


    Activiti 是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速,稳定的 BPMN2流程引擎。它易于与 Spring集成使用。主要要在OA中,把线下流程放到线上。 把现实生活中一些流程固话定义到系统中,然后通过输入表单数据完成业务。例如:他可用在OA系统的流程管理中:请假流程 小于三天,一级主管审批,大于三天二级才能审批。

    十二、编写一个 Servlet


    【1】Servlet 与普通的 Java 程序的区别:Servlet 本质上就是一个 Java 类;Servlet 类必须实现接口 javax.servlet.Servlet 接口;运行在 Web 容器中,Tomcat 就是一个 Web 容器;能够接收浏览器发送的请求,并且做出响应给浏览器;
    【2】编写 Servlet 的步骤:写一个类继承于 HttpServlet,HttpServlet 是个抽象类它已经实现了 Servlet 接口; 重写 doGet 或doPost 方法,分别处理表单的 get 或 post 请求;如果直接在浏览器输入地址访问,使用的是 get 方法;编写 web.xml 配置文件,对 Servlet 进行配置或者通过 @WebServlet(“/xxx”),才能通过浏览器来访问。

    //如果web.xml中没有配置时,就添加此注解
    @WebServlet("/xxx")
    public class DemoServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doGet(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
    }
    

    如果使用 web.xml 配置,配置信息如下:

    <servlet>
    	<servlet-name>LoginServletservlet-name>
    	<servlet-class>com.spring.web.servlet.DemoServlet servlet-class>
    servlet>
    <servlet-mapping>
    	<servlet-name>LoginServletservlet-name>
    	<url-pattern>/login.dourl-pattern>
    servlet-mapping>
    

    【3】 也可以实现最基本的 Servlet 接口。

    public class servlet  implements Servlet 
        //初始化方法,创建时加载
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            
        }
        
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
        
        //调用时加载 里面对 doPost doGet 等进行处理
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
        //销毁时加载
        @Override
        public void destroy() {
    
        }
    }
    ide
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
        //销毁时加载
        @Override
        public void destroy() {
    
        }
    }
    
  • 相关阅读:
    牛客刷题<32~34>非整数倍数和整数倍数数据位宽转换
    leetcode: 49. 字母异位词分组
    【Kubernetes】K8s笔记(十一):Ingress 集群进出流量总管
    个性化实时音乐推荐系统-毕业设计
    iwebsec靶场 代码执行关卡通关笔记
    init container
    新兴网络安全威胁:数字防御新格局
    Prometheus的remotewrite for java
    数学建模笔记-第四讲-拟合
    19、Flink 的Table API 和 SQL 中的自定义函数及示例(3)
  • 原文地址:https://blog.csdn.net/zhengzhaoyang122/article/details/139373748