2021-04-27

1.jvm搭建与优化

java生命周期

加载:将源文件的class文件找到类的信息并将其加载到方法区中然后在实例化一个对象作为方法区中这个类的信息的入口

验证:确认其是否符合java语言规范,是否有重复的属性和行为,继承是否合理反正就是为了保证jvm能够执行

准备:主要就是未由static修饰的成员变量分配内存,并设置其默认的初始值

解析:将常量池中的符号引用转换为直接引用

初始化:就是将静态变量赋值的过程

使用:在类的使用中存在三步:对象实例化、垃圾收集、对象终结

对象实例化:就是如果该类存在父类jvm会通过显示或者隐示的方式先执行父类的构造函数,在堆内存中为父类的实例变量开辟空间,并赋予其默认的初始值,然后在根据构造函数的代码将真正的值赋予实例变量本身,然后引用变量获取对象的首地址,通过操做对象来调用实例变量和方法

垃圾收集:当对象不再被引用时就会被虚拟机标上特别的垃圾记号,在堆中等待GC回收

对象终结:对象被GC回收后对象不在存在其生命走到了尽头

类卸载:类的生命周期也结束了,程序中不在有该类的引用该类也会被jvm垃圾回收从此结束

2.java基本数据类型  数据类型之间能否相互转换

Int char double long short boolean byte float

可以相互转换

3.int和integer的区别

integer是int的包装类 int是java中的一个基本类型

Integer必须实例化之后才可以使用,而int变量不需要

Integer是对象的引用当new一个integer时实际是生成一个指针指向此对象而int则是直接存储数据值

Integer默认值为null而int默认值为0

4.select a,b from d group by a 上述代码能否执行正确 group by 分组会产生什么影响

执行报错group by语句中select指定的字段必须是“分组依据字段”或者聚合函数不能有b

 

5.面向对象的三大特性并说说其在代码中如何实现?

封装 继承 多态

利用修饰符private,默认修饰符(default),protected和public对成员变量进行修饰,或者各种内部类实现对细节代码的隐藏。封装就是利用这些方式将信息隐藏,只留下一些受限制的接口给外部访问。

利用extends关键字(新类extends旧类),将新一类与某一类形成is-a的关系,实现代码复用,减轻工作量,新类具有父类的许多方法与属性。

继承和接口(interface)的实现是多态的基础,接口的实现是利用implements关键字,将新类实现了接口的所有方法。而继承则是通过方法重写(父子关系,方法名、参数、返回值相同,访问权限修饰符不小于父类)完成不同的类对同一消息作出不同反应。

 

用父类(接口)的引用指向子类(实现类)的构造器。然后利用多态参数(传入父类,子类所有都可以隐式转化为父类),对同一消息(指令)作出不同的反应,得到不同的结果实现多态。

 

6.多态的体现及应用

      主要体现在方法的重写以及方法的重

  1. 多态用于形参类型的时候,可以接收更多类型的数据 。
  2.  2. 多态用于返回值类型的时候,可以返回更多类型的数据。

7.简述编写代码时出现的异常怎样检查错误

    1. runtimeException子类:

    1、 java.lang.ArrayIndexOutOfBoundsException
    数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。
    2、java.lang.ArithmeticException
    算术条件异常。譬如:整数除零等。
    3、java.lang.NullPointerException
    空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等
    4、java.lang.ClassNotFoundException
    找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。

   5、java.lang.NegativeArraySizeException  数组长度为负异常

   6、java.lang.ArrayStoreException 数组中包含不兼容的值抛出的异常

   7、java.lang.SecurityException 安全性异常

   8、java.lang.IllegalArgumentException 非法参数异常

2.IOException

IOException:操作输入流和输出流时可能出现的异常。

EOFException   文件已结束异常

FileNotFoundException   文件未找到异常

3. 其他

ClassCastException    类型转换异常类

ArrayStoreException  数组中包含不兼容的值抛出的异常

SQLException   操作数据库异常类

NoSuchFieldException   字段未找到异常

NoSuchMethodException   方法未找到抛出的异常

NumberFormatException    字符串转换为数字抛出的异常

StringIndexOutOfBoundsException 字符串索引超出范围抛出的异常

IllegalAccessException  不允许访问某类异常

InstantiationException  当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常

 

Throw抛出异常  try catch finally捕获异常

 

8.序列化与反序列化

序列化
以流的方式写进文件中保存,也叫写对象

反序列化
把文件中的对象以流的方式读出来,也叫读对象

9.设计模式

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

结构型模式,共七种:适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

原则:单一职责原则 里氏替换原则 依赖倒转原则 接口隔离原则 迪米特法则 合成复用原则

10.Mybatis一级缓存和二级缓存

Mybatis的一级缓存是指Session缓存。一级缓存的作用域默认是一个SqlSession。Mybatis默认开启一级缓存。
也就是在同一个SqlSession中,执行相同的查询SQL,第一次会去数据库进行查询,并写到缓存中;第二次以后是直接去缓存中取。当执行SQL查询中间发生了增删改的操作,MyBatis会把SqlSession的缓存清空。一级缓存的范围有SESSION和STATEMENT两种,默认是SESSION,如果不想使用一级缓存,可以把一级缓存的范围指定为STATEMENT,这样每次执行完一个Mapper中的语句后都会将一级缓存清除。如果需要更改一级缓存的范围,可以在Mybatis的配置文件中,在下通过localCacheScope指定

Mybatis的二级缓存是指mapper映射文件。二级缓存的作用域是同一个namespace下的mapper映射文件内容,多个SqlSession共享。Mybatis需要手动设置启动二级缓存。

二级缓存是默认启用的(要生效需要对每个Mapper进行配置),如想取消,则可以通过Mybatis配置文件中的元素下的子元素来指定cacheEnabled为false。

11.接口与实现类的区别

1. 接口是最抽象的一层,不需要进行任何实现;抽象层可以实现部分接口方法,也可以自定义方法;实现类必须实现所有方法。

2. 接口能被类(抽象类和具体类)实现,区别在于抽象类实现接口,可以实现该接口的方法,也可以不实现该接口的方法;具体类必须实现接口的所有方法

3. 接口可以被接口继承,但不允许被类继承

4. 类之间可以相互继承,而且只能单继承

5. abstract是抽象的意思,在java中,规定只能修饰类或者方法,所以不能修饰属性。被abstract修饰的内容都是暂未被实现的,比如类、方法。属性之所以不能被abstract修饰,是因为属性不存在"尚未被实现"的状态。比如你可能会联想到int age; 或是String name; 但可惜的是,在申明变量时,int会默认给age赋予初始值0,String会默认给name赋予初始值""。因此属性达不到"尚未被实现的状态",从而不能被abstract修饰。

6. 抽象类和普通类在于:抽象类不能进行实例化,一方面抽象方法类似于接口的方法;另一方面,非抽象方法又和普通类方法相同,所以它兼备接口和普通类两种特型。

7. 由于抽象类不能实例化,因此一般是作为父类,由子类进行扩充和实例化,因此,在抽象类的所有protected级别以上的方法或变量,均可以在子类中调用。

12.Mysql优化

1、MySQL不会使用索引的情况:非独立的列

2、前缀索引:如果列很长,通常可以索引开始的部分字符,这样可以有效节约索引空间,从而提高索引效率

3、多列索引和索引顺序:在多个列上建立独立的索引并不能提高查询性能,新的版本会采用合并索引的策略

4、避免多个范围条件

5、覆盖索引:果一个索引包含或者说覆盖所有需要查询的字段的值,那么就没有必要再回表查询,这就称为覆盖索引;索引条目远小于数据行大小,如果只读取索引,极大减少数据访问量

索引是有按照列值顺序存储的,对于I/O密集型的范围查询要比随机从磁盘读取每一行数据的IO要少的多

6、使用索引扫描来排序:其一是对结果集进行排序的操作,其二是按照索引顺序扫描得出的结果自然是有序的。如果explain的结果中 type列的值为 index表示使用了索引扫描来做排序

7、冗余和重复索引:冗余索引是指在相同的列上按照相同的顺序创建的相同类型的索引,应当尽量避免这种索引,发现后立即删除。

8、删除长期未使用的索引:定期删除一些长时间未使用过的索引

9、优化COUNT()查询

10、优化关联查询

11、优化LIMIT分页:优化这种查询一个最简单的办法就是尽可能的使用覆盖索引扫描,而不是查询所有的列。然后根据需要做一次关联查询再返回所有的列

13.Mycat分库分表

实际上分库跟分表是有区别的,简单来说有垂直和水平两种方式,垂直就是将表按字段进行拆分,水平就是将表按照数据分布来做行拆分

mycat里面通过定义路由规则来实现分片表(路由规则里面会定义分片字段,以及分片算法)。分片算法有多种,你所说的hash是其中一种,还有取模、按范围分片等等。在mycat里面,会对所有传递的sql语句做路由处理(路由处理的依据就是表是否分片,如果分片,那么需要依据分片字段和对应的分片算法来判断sql应该传递到哪一个、或者哪几个、又或者全部节点去执行)

14.Mycat主从复制原理

(1)master将数据改变记录到二进制日志(binary log)中,也即是配置文件log-bin指定的文件(这

些记录叫做二进制日志事件,binary log events)

(2)slave将master的binary log events拷贝到它的中继日志(relay log)

(3)slave重做中继日志中的事件,将改变反映它自己的数据(数据重演)

多线程创建

程序 进程 线程

分布式锁如何实现

Linux常用命令

Arraylist和linkedlist区别

list和Set区别

消息中间件在项目中的作用

数据结构

Servlet生命周期

Sleep和wait的区别

Hashmap你有哪些了解

线程的创建

Redis集群使用

mycat使用的话你项目数据库是多大的

api的实现

JBK是什么?

SQL语句和伪SQL语句?

JVM内存

JDK1.5

API的实现使用的设计模式例子

程序中经常会出现和处理的异常类型

使用反射的方式调用String对象的toUpperCase方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值