Java——面试小知识&开发小知识

1、自增变量
计算时先从赋值号右边算,算完之后再赋值给左边;自增自减不用进入操作数栈。
2、单例模式创建
创建单例:①构造器私有化;②自行创建,用静态变量保存;③向外暴露;④强调单例,用final修饰。
饿汉式:采用枚举方式
懒汉式:采用静态内部类方式
3、类初始化&实例初始化
1)类初始化clinit()方法,其父类必须先初始化
2)加载静态变量以及执行静态代码块
3)实例初始化init()方法,必须最先调用super()方法
4)加载非静态变量以及执行非静态代码块
5)构造器方法最后执行
6)实例每初始化一次,都会执行一遍
7)方法重写:不能重写final修饰的方法,以及静态方法,private等子类不可见方法
4、方法的传参机制
1)形参是基本数据类型:传递数据值
2)实参是引用数据类型:传递地址值
2.1)特殊类型:String、包装类等对象不可变性
5、递归&迭代
1)递归:方法调用自身
1.1)优点:大问题转为小问题,可以减少代码量,代码精简,可读性好。
1.2)缺点:递归调用浪费空间,递归太深容易造成堆栈溢出。
2)迭代:利用变量的原值推出新值
2.1)优点:代码运行效率高
2.2)缺点:代码可读性不如递归
6、成员变量&局部变量
1)区别:声明的位置不同,方法体、形参、代码块中为局部变量;类中方法外的为成员变量,其被static修饰的为类变量,没有修饰的为实例变量。
2)修饰符:局部变量有final;成员变量:public、protected、final、static、volatile、transient
3)值存储位置:
3.1)局部变量:栈中
3.2)实例变量:堆中
3.3)类变量:方法区中
4)作用域以及生命周期
4.1)局部变量从声明处开始,到所属的}结束;每一次调用执行,都是新的生命周期
4.2)实例变量随着对象的创建而创建,随着对象的回收而消亡,每一个对象的实例变量都是独立的
4.3)类变量随着类的初始化而初始化,随着类的卸载而消亡,该类的所有对象的类变量是共享的
7、Spring Bean的作用域之间的区别?
1)可以通过scope属性来指定:singleton,默认值,单例的;prototype,原型,每次调用getBean都会新创建一个实例;request,每次请求实例化一个bean;session,在一次会话中共享一个bean。
8、Spring支持常用数据库的事务传播行为和事务隔离级别?
1)事务共7中传播行为,常用以下两种。@Transactional注解的属性propagation用来设置事务的传播行为。
1.1)默认REQUIRED,如果存在事务,就用原有的事务
1.2)REQUIRES_NEW,将原来的事务挂起,开启新的事务
2)事务的隔离级别,共4种,MySQL默认可重复读。@Transactional注解的属性isolation用来设置事务的隔离级别。
2.1)读未提交,read uncommitted
2.2)读已提交,read committed
2.3)可重复读,repeatable read
2.4)序列化,serializable
9、SpringMVC的工作流程?
由中央处理器控制,DispatcherServlet
1)发送请求
2)经过中央处理器调用处理器映射器,返回处理器对象中央处理器
3)通过处理器适配器调用具体处理器(Controller),返回ModelAndView中央处理器
4)由视图解析器进行处理,返回view,渲染视图,响应给用户
10、Mybatis中实体类的属性与表字段名不一致?
1)SQL语句中字段起别名
2)Mybatis全局配置文件中开启驼峰命名规则
3)在Mapper映射文件中,使用resultMap来自定义映射规则
11、Linux常用服务类的命令?
1)注册在系统中的标准化程序,方便统一的管理方式
1.1)centOS6常用方法:service 服务名 start/stop/restart/reload/status
1.2)查看服务:chkconfig --list|grep xxx
1.2)服务自启动,chkconfig --level 5 服务名 on/off,级别0-6共7级,一般常用3和5
2)centOS7下:
2.1)systemctl start/restart/stop/reload/status 服务名(xxx.service)
2.2)查看服务:systemctl list-unit-files || systemctl --type service
2.3)自启动:systemctl enable/disable 服务名
12、Redis持久化有几种类型?区别?
1)两种类型:RDB与AOF。
2)RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘
2.1)如何进行备份:单独创建子进程,主进程不做什么IO操作。比AOF节省磁盘空间,高效,恢复数据速度快;但最后一次持久化的数据可能丢失。
3)AOF:以日志的形式记录每个写操作
3.1)备份机制更稳健,丢失数据概率更低;但比RDB占用更多磁盘空间,恢复备份速度慢。
12.1、Redis在项目中的使用场景?
1)5种数据类型。
1.1)String。例:统计次数
1.2)Hash。例:存储用户信息
1.3)List。例:最新消息的排行
1.4)Set。特点:自动排重。例:好友列表
1.5)Zset。以某一条件为权重,进行排序。例:电商商品的排序
13、MySQL建立索引?
1)索引定义:高效获取数据的数据结构。
1.1)优势:检索效率提高;降低数据库排序的成本,降低CPU的消耗
1.2)劣势:更新表的速度降低;索引也是一张表,需要占磁盘空间
2)需要创建索引:①主键自动建立索引;频繁作为查询条件的字段应该创建索引;③组合索引性价比更高;④查询中排序的字段建立索引,大大提高排序速度;⑤查询中统计/分组的字段。(分组group by更伤性能)
3)不适合创建索引:①表记录太少;②经常增删改表或字段;③where条件里用不到的字段不要建索引;④过滤性不好的不适合建索引(筛选后,还是大批数据的字段)。
4)添加索引基本语法:alter table 表名 add index(字段);
5)常见索引?5种。①主键索引,primary key;②唯一索引:unique;③普通索引:index;④全文索引:fulltext;⑤:多列索引:index(字段,字段…)
14、JVM垃圾回收机制,GC发生在JVM哪个部分?几种GC?算法?
1)GC发生在堆。
2)2种GC,分代收集算法。Minor GC频繁收集Young区(新生代);Full GC较少收集Old区(老年代);基本不动Perm区。
3)4大算法。①引用计数法。较难处理循环引用问题,JVM一般不采用这种方式;②复制算法。minor GC采用,效率高,但需要双倍空间;③标记清除。Full GC采用,不要额外空间,但需要两次扫描,耗时严重,以及清除未标记对象,造成内存碎片;④:标记压缩。Full GC采用,没有内存碎片,但需要移动对象的成本;老年代混合使用两种算法,标记清除压缩,减少移动对象成本。
15、Elasticsearch&Solr?
1)都基于Lucene搜索服务基础开发。都是高性能的企业级搜索服务器。都是基于分词技术构建的倒排索引的方式进行查询。都是基于Java开发。
2)区别:①Es查询性能高于Solr;②Solr的检索效率伴随数据的动态增加而下降,Es没什么变化;③Solr本质是一个Web项目,必须部署在tomcat上,而Es自身带有分布式系统管理功能;④Solr支持更多的数据格式(xml、json)等,但Es仅支持Json格式;⑤Solr是传统搜索应用(对已有数据的检索)的有力解决方案,Es更适用于新兴的实时搜索应用;⑥Solr官网提供更多功能,而Es需要借助第三方。
16、单点登录实现过程?
1)定义:一处登录,多处使用。
2)前提:多实用在分布式系统中。
3)过程:①用户访问应用;②认证中心检查cookie中是否包含token;③提示用户登录;④完成登录,打开保存token到cookie中,并继续访问业务功能页面;⑤用户继续访问;⑥检查cookie,存在token,认证中心认证身份,返回业务功能页面。
17、消息队列在项目中的使用?
1)背景:处理高并发。
2)ActiveMQ、RabbitMQ、Kafka等。
18、Java:OOP了解
1)OOP:Object Oriented Programming,面向对象的程序设计。
2)主要分为三大点:(封装、继承、多态)
2.1)封装:促进了类的形成。将共有的属性(变量)和行为(方法)封装成类。方便代码的复用和隐藏。
2.2)继承:将多个类的共同属性和行为封装成一个父类。继承该类的子类都将拥有父类拥有的属性和行为。减少代码的重复率。
2.3)多态:父类的引用指向子类的对象。代码扩展性提高。
3)抽象:关键字:abstract,可以修饰类和方法。
3.1)抽象类不能实例化。
3.2)存在抽象方法的类一定是抽象类,抽象类中的方法但不一点都是抽象的。
3.2)子类实现抽象类要么实现所有方法,要么子类也声明抽象类。
3.3)优点:具体类可以从抽象类自动得到这些方法的缺省实现;缺点:java的类的单继承。
19、Java集合框架
1)主要由3个接口派生。Collection、Map、Iterator。
2)常用接口:List、Set、Map。
3)常用实现了类:ArrayList、LinkedList、HashSet、HashMap。
4)List:有序,可存放重复元素,检索效率高,插入/删除效率低。
4.1)ArrayList:数组,查询效率比LinkedList高,但插入/删除效率没有LinkedList高。
4.2)LinkedList:双向链表,与ArrayList互补的。
4.3)Vector:一般都不用,线程安全的,所以效率低。
5)Set:无序,不可存放重复元素,检索效率低,插入/删除效率高。
5.1)HashSet:hash表,无序不重复,但可以有null值。
5.2)TreeSet:二叉树,有序不重复,不可以有null值;其有序的顺序并不是插入的顺序,默认正序排序。
6)Map:存储键值对数据的集合。
6.1)HashMap:允许null键、null值,非线程安全,效率较快。
20、Java中的==关系操作符和equals方法
1)双等是关系操作符。
1.1)在比较基本数据类型时,比较存储的值是否一样;
1.2)在比较引用数据类型时,比较的是引用的地址。
2)equals是一个方法。自定义的类都继承了Object类中的equals方法;其方法也是用双等,return(this == obj)。
2.1)但是八大基础类的包装类对其父类Object类的equals方法都进行了重写,还有集合中的equals方法等等,都不一样。所以两个相同字符串对象,双等关系操作符为false,equals方法为true。
21、Java多线程
1)进程是在操作系统上运行的程序,如JVM
2)线程是一个程序内部的顺序控制流,线程包含在进程中,多个线程可以同时执行
3)线程的状态:①NEW,新建;②RUNNABLE,可运行;③RUNNING,运行;④BLOCKED,阻塞;⑤DEAD,死亡。
4)两种普通方式:继承Thread类,实现Runnable接口。重写run()方法,以start方法开启线程。
4.1)实现Runnable接口较继承Thread的优势:①资源共享时;②避免单继承的限制;③程序健壮,可被多个线程共享,代码和数据独立。
5)实现CallAble接口,重写call()方法。方法可有返回值,并且可以抛出异常。
5.1)使用FutureTask实现类接收返回值,实现类的泛型就是call()方法的返回值。实例化FutureTask对象时,传入实现CallAble接口的实现类对象。使用Thread类实例化对象时,传入FutureTask对象,Thread对象调用start()方法执行。
5.2)FutureTask对象调用get()方法获取返回值。
6)利用线程池创建多线程。常用线程池:4种。
6.1)可缓存线程池:Executors.newCachedThreadPool();
6.1.1)灵活创建、回收。
6.1.2)线程最大数量Integer.MAX_VALUE;线程保持时间60L,注意大量线程工作,可能导致系统瘫痪。
6.2)指定线程数量的线程池:Executors.newFixedThreadPool(1);
6.2.1)参数:int nThreads,@param nThreads the number of threads in the pool。
6.2.2)工作线程数量大于线程池初始的最大数量,则将提交的工作加入队列中,但线程空闲时,不会释放线程。
6.3)单线程执行者:Executors.newSingleThreadScheduledExecutor();
6.3.1)保证所有任务按照指定顺序执行。
6.4)定长线程池:Executors.newScheduledThreadPool(1);
6.4.1)参数:int corePoolSize,@param corePoolSize the number of threads to keep in the pool。
6.4.2)定时、周期性,可以设置时间。如下:
在这里插入图片描述
在这里插入图片描述

你可能感兴趣的:(java后台)