@paynev
2023-02-07T02:39:34.000000Z
字数 10185
阅读 2318
java
说一下jvm的运行数据区
说说jvm的G1
jvm新生代老年代是怎么样的
jdk1.8开始方法区换成元数据空间是怎样的,为什么
把你记得的jvm参数配置说说
说一下jvm栈的具体
怎么避免老年代经常回收
说说你知道的gc算法
说一下集合,比如hashmap的原理(线程安全,哈希碰撞,链表,红黑树都要我说),ArrayList
jdk的线程池原理流程是怎么样的,源码还有一些参数是怎样的
sql怎么优化的
有做过项目压力测试吗,怎么做的
redis的持久化以及原理
redis的哨兵模式跟集群模式原理,选举原理
redis是单线程的,集群下多请求它是怎么处理的
观察者模式说说
单例有哪些实现方式
你们项目上nginx是怎么配置的
画出你们项目的架构图
缓存雪崩跟穿透的解决方案
springcloud的组件说说
springcloud的断路器说说
springcloud的服务发现是怎么做的
你是怎么使用mq解决延迟订单处理的
说说activemq(还有的忘了具体问mq啥了)
说说你们项目上的分布式事务以及怎么实现的
lua脚本可以怎么优化
你项目上遇到的难点有哪些,列举几个来说说
io和nio有什么区别
jvm的内存模型分那几块,都有什么作用
内存泄露和内存溢出有什么区别
java中如何保证线程安全(代码层面)
原子类在java中是如何实现的
事务的隔离级别和传递方式有哪些
springMVC和struts2底层实现上有什么主要区别
重载和重写的区别?如果两个同名方法,返回类型不一样,是重载还是重写?如果两个同名方法,方法A的入参是方法B入参的子类,这两个方法是重写还是重载或者都不是?
如何实现一个可以无限扩展入参数量的方法(如实现1+2+3+……+n)
Sql中函数和存储过程有什么区别?
decode是什么意思,有什么作用?
mysql的索引有几类?如何实现?
synchonize用在静态方法上和普通方法上有什么区别
用过哪些集合,他们的底层数据结构是怎样的,都有什么特点
事务传递的方式有几种,spring中用注解的方式控制事务都可以加在哪里
a,b两个方法都写数据库,各自在方法上加了事务注解。在a方法中,写完数据库操作后调用b方法。此时b方法抛异常了,a中的操作会回滚吗
Spring最受欢迎的两大特性是什么
Sleep方法结束前,cpu资源是否释放
如何设计一个微信红包的架构
数据库单表数据量很大之后(千万级以上),如何进行优化,有哪些策略,各有什么优缺点?
Oracle使用什么命令或者方式去分析sql的执行效率
Oracle在很大的表(千万级数据量以上)中,如何实现快速分页
Java多线程的锁都有哪些种类,各自适用于哪些场景
除了加锁,java中还有什么方式可以保证线程安全?
springboot的注解配置底层源码实现看过吗?
手写一个二分法查找代码
手写一个生产者消费者模型的实现
如何保证分布式架构事务的一致性
redis集群中单点服务宕机后,如何处理
linux中如何启动一个定时任务
说说你项目中redis缓存的应用场景,如何保证redis数据与数据库数据的同步
主从架构的数据库中,如何实现读写分离和数据同步?各个方案有什么优缺点?
如何实现一个分布式锁?
数据库层面上能否做到数据隔离(如业务系统与管理系统的数据操作隔离)?
mysql的索引原理,B数说说
mysql的引擎有哪些以及区别
平衡二叉树用笔画画
你说的分布式锁怎么实现的
说一下spring aop使用跟原理
说一下spring ioc使用跟原理
重定向和请求转发有什么区别?
session和cookie有什么区别?
字符串拼接怎么实现,是直接+吗?
sting buffer和string builder什么区别?
mybatis的xml里面的$和#有什么区别?
声明一个字符串变量的时候会在内存里创建几个对象?
例如,new String(“XYZ”)
在有什么比较明显的,影响效率sql的写法例如:where条件里写带的索引字段不等于空会影响效率,还有其他的吗?
not in 和in应该用什么代替?
mysql和oracle,分别怎么分页?
在项目中有没有什么印象深刻的,自己通过努力调查出来的问题?
jquery调用 ajax过程?
js里的null和undefined有什么区别?
get和post请求有什么区别?
maven打包发布项目的过程?
接口和抽象类他们两个有什么区别?
ajax用到什么类了?
jvm参数都是什么?
hashtable hashmap怎么实现的?
多线程
排序
树排序
ACID
非关系型数据库
1. Java的特点:面向对象,跨平台,健壮,安全
2. Java的三个体系:Java SE(Java Platform,Standard Edition)标准版,定位在桌面应用程序(客户端程序),是其余两个平台的基础;Java ME(Java Micro Edition )微缩版,定位在移动设备电子产品的开发;Java EE(Java Enterprise Edition)企业版,定位在大中型的企业级应用。
3. JDK是Java语言开发包,可以将.java文件编译为可执行的Java程序。JRE即Java运行环境。JVM (Java Virtual Machine)。JVM是在一台计算机上由软件或硬件模拟的计算机。Java虚拟机(JVM)读取并处理经编译过的平台无关的字节码class文件 。JDK包含JRE,JRE包含JVM。
4. Java中的八种基本类型:byte(1字节=8位),short(2字节=16位),int(4字节=32位),long(8字节=64位),float(4字节=32位),double(8字节=64位),char(2字节=16位),boolean。
5. 基本数据类型之间的转换规则:(1)高精度的数值赋值给低精度的变量需要强制类型转换;(2)浮点数的数值赋值给整数的变量需要强制类型转换(取整!!!);(3)不同类型的数值参与计算,首先低精度自动往高精度转换,类型一致后再进行计算
6. Java中的运算符:算术操作符(+,-,,/,%(取余));赋值运算符(=,+=,-=,=,/=,%=);比较运算符(>,<,>=,<=,==,!=);逻辑运算符(&&(逻辑与),||(逻辑或),!(逻辑非));自增(++)和自减(--)运算符;三目操作符:结果值=(条件)?值1:值2
7. switch分支语句中类型必须是byte,short,int,char
8. While语句和do while语句的区别:While语句是先判断再执行,do while语句是先执行再判断。当条件判断为false的时候,While语句不会被执行。而do while至少执行一次。
9. 算法之冒泡排序:两两比较,大的排后边。大的排后边以后就不用管了,进入下一轮比较。
10. 算法之直接插入排序:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部排序完为止。
11. 算法之递归:方法调用自身就是递归。
12. 怎样设计递归算法:确定递归公式;确定边界(终了)条件。
13. 递归算法解决问题的特点:(1) 递归就是在过程或函数里调用自身。 (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 (3) 递归算法解题通常显得很简洁,但递归算法的运行效率较低。所以一般不提倡用递归算法设计程序。
14. 基本数据类型数组没有赋值的时候,整型的数组默认是0;浮点类型数组是0.0;布尔类型的数组是false;字符类型的数组默认是'\u0000';类类型的数组没有赋值的时候,默认是null
15. 局部变量和成员变量的区别: 1。作用域不同 2。初期值不一样,局部变量必须在使用前进行初期化,成员变量系统会默认初期化;3。内存里布局不一样,局部变量是放在栈内存里面,成员变量是放在堆内存里面。
16. 继承:新定义的类从已有的类中获取属性和方法。提高代码复用性。程序设计变得简洁高效。
17. 构造函数的特点:1.构造函数名和类名相同;2.没有返回值,也不用加void关键字;3.在创建实例时被调用。
18. 构造函数的作用:1。创建对象;2。初始化成员变量
19. 构造方法的注意点:如果创建类的时候没有构造函数,系统会默认给你指定一个构造函数,并且是无参数的,没有任何语句。如果有自定义的构造函数,java就不提供默认的构造方法.如果想用默认的构造函数,自己添加一下。
20. 构造方法的分类:默认构造方法和自定义构造方法
21. 引用和实例的关系:一个引用可以指向0个或1个实例;一个实例可以由多个引用指向它
22. 关键字static:static可以修饰变量,方法和静态块。被static修饰的成员变量属于类,称为类的静态变量,也被称为类变量。可以通过“类名.成员变量名”的方式调用。所有对象共享类的静态变量,这时也可以通过“对象.成员变量名”的方式调用。但是任何对象对类变量的修改都会反映到其他对象的应用上。类的静态变量,在类加载内存时,没有创建对象的时候就已经分配了空间。
23. 声明为static的方法有以下几条限制:1。它们仅能调用其他的static 方法;2。它们只能访问static属性;3。它们不能以任何方式引用this 或super。
24. 静态块:有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块。 静态代码块是主动执行,并且只执行一次。静态方法是被动执行。每次创建对象的时候,都会加载非静态代码块.
25. 关键字(final):(1)被final修饰的变量是常量,赋值以后就不能修改;(2)被final修饰的方法不能被重写;(3)被final修饰的类不能被继承,例如String类。
26. 为什么static和final通常连用? 回答:static和final的意义是不一样的。static修饰的变量是静态的, final修饰的变量只能赋值一次。它们连用的时候是因为定义的变量既要是静态的,又需要它的值不能修改。这样定义成static final以后,内存就不用重复的申请和释放空间。interface里的变量就是默认用public static final修饰的。
27. StringBuffer和StringBuilder的区别:StringBuffer支持并发操作,保证线程安全,适合多线程。StringBuilder不支持并发操作,不能保证线程安全,适合单线程。单线程适用前提下StringBuilder比StringBuffer速度快。
28. String类的常用方法:length(); charAt(i); toLowerCase(); toUpperCase();trim();substring(int beginIndex);startsWith(String str);endsWith(String str);equals();equalsIgnoreCase();indexOf();split();compareTo();valueOf()
29. 多态:同一个事件发生在不同对象上产生不同的结果。
30. 方法重载:一个类里面,方法的名字一样,但参数不一样(1。参数的个数不一样 2。参数的类型不一样)。注意:不比较方法的返回值和形参的变量名
31. 成员变量隐藏:子类声明的成员变量名字和父类继承来的成员变量名字相同,子类就会隐藏所继承的成员变量。
32. 方法重写(override):在子类中可以根据需要对父类中继承的方法进行重写。重写方法必须和被重写的方法具有相同的方法名字,形参列表和返回类型。重写方法不能使用比被重写的方法更严格的访问权限。
33. 有继承关系的类的初始化顺序:1。父类静态成员和静态初始化块,按在代码中出现的顺序依次执行;2。子类静态成员和静态初始化块,按在代码中出现的顺序依次执行;3。父类非静态代码块,按在代码中出现的顺序依次执行;4。父类的构造方法;5。子类非静态代码块,按在代码中出现的顺序依次执行;6。子类的构造方法
34. 继承中的构造方法:1.子类对象构造的过程中必须调用父类的构造方法;2.子类可以在自己的构造方法中使用super(形参列表)调用父类的构造方法(2.1 使用this(形参列表)调用本类的另外的构造方法,2.2如果使用super,必须写在子类构造方法的第一行);3。如果子类没有显示的调用父类的构造方法,则系统默认调用父类无参的构造方法;4。如果子类既没有显示的调用父类的构造方法,而父类总又没有无参的构造方法,则编译出错。
35. 面向对象:面向对象是一种编程思想. 在java中,万事万物皆对象。
36. 面向对象编程: 编程过程中,所有操作都是对对象的属性和方法的操作
37. 类:是现实世界一个抽象的概念,可以看成描述一类对象的模板
38. 对象:类的具体实例
39. 实例:程序使用类创建对象时,生成的对象叫做类的实例(instance)
40. ==: 对基本类型的数据而言,==比较的是两边的值,即==号两边的值是否相等;而对引用来说,==比较的是两边的地址,即比较==号左右两边的引用是否都指向同一个堆中的实例
41. java的值传递问题:基本数据类型传递的是实实在在的值;类类型传递的是地址(引用).
42. this:表示当前使用的这个对象.this可以出现在构造方法和实例方法中,但不可以出现在类方法(静态)中。
43. super:java利用关键字super来引用父类的成员变量和方法
44. 什么是封装?(1)Java将相关的变量和方法封装到类中。(2)Java通过可见性来实现封装。对外提供方法供外界主动调用,对内隐藏数据以防止不合理的破坏性修改。
45. 可见性(访问限制修饰符):private,protected,public 可见性和继承完全没有关系!!!
46. 对象转型(casting):上转型就是一个父类的引用指向子类的对象。如果子类重写了父类的方法,则上转型对象调用的是子类重写的方法!!!!如果子类重写了父类的静态方法,则上转型对象调用的是父类的静态方法!!!!
47. 动态绑定:是指执行期间(而非编译期)判断引用对象的实际类型, 根据实际的类型去调用相应的方法。是实现多态的技术.
48. 多态的分类:继承多态(方法重写)和类内部多态(方法重载)
49. 继承多态存在的三个条件:1。要有继承 2。要有方法重写 3。父类引用指向子类对象
50. 关键字:abstract:用abstract修饰的类称为抽象类。用abstract修饰的方法称为抽象方法。含有抽象方法的类必须声明为抽象类,抽象类必须被继承,抽象方法必须被重写。抽象方法只需要声明,而不需要实现。抽象类中可以有构造方法,抽象方法,也可以有实例方法。抽象类不能被实例化。抽象类的作用:用来设计,用来被继承。
51. 接口:使用interface来定义一个接口。接口中没有构造方法,不能创建对象。接口体里包含常量和抽象方法两个部分。接口里的成员变量只能是public static final类型的常量。接口里的方法必须都是抽象方法,默认被public abstract 修饰。在类中实现接口可以用关键字 implements.一个类可以实现多个接口.
52. 接口的回调:接口变量可以指向实现了该接口的类创建的对象。通过接口变量就可以调用被类实现的接口的方法。例如:集合的运用
53. 基本数据类型的包装类:char Character; int Integer 作用:在堆中封装成一个一个对象,并提供操作方法,能简化代码.
54. 自动打包(装箱),自动解包(拆箱)(jdk1.5以后):自动打包:把基本数据类型转换为对象自动解包:把对象转换为基本数据类型
55. 为什么要用集合?因为数组有以下缺点:每次创建都要指定长度;效率比较低,且操作比较麻烦。
56. java的集合体系:6个接口和一个工具类,位于java.util包下。6个接口:Collection,List,Set,SortedSet,Map,SortMap 一个工具类:Collections 可以对集合进行排序。
57. Collection:是集合的一个顶级接口,定义了存取一组对象的方法,其子接口Set和List分别定义了对对象的存储方式。
58. Set:继承于Collection,数据没有顺序并且不可以重复 实现类:HashSet SortedSet的实现类是TreeSet
59. List:继承于Collection,数据有顺序并且可以重复。实现类:ArrayList和LinkedList
60. Map:是一组成对的键(key)-值(value)对象。实现类 : HashMap SortedMap的实现类是TreeMap
61. 泛型:可以指定集合中存储的数据类型,在编译器检查时候,强烈建议使用泛型。泛型在JDK1.5以后才可以用
62. 异常的体系结构:Throwable类是异常的顶级父类。在java抛出的是异常的对象。地下是Error(错误类):是程序本身无法处理的错误。Exception(异常类):是程序本身可以处理的异常。
63. 异常类和错误类的区别:异常能被程序本身可以处理,错误是无法处理。
64. finally块不会被执行:(1)在finally语句块中发生了异常。(2)在前面的代码中用了System.exit()退出程序。(3)程序所在的线程死亡。(4)关闭CPU
65. Java的异常处理的5个关键词:try、catch、throw、throws和finally
66. 自定义异常的步骤:(1)创建自定义异常必须继承Exception异常类;(2) 在方法中通过throw关键字抛出异常对象;(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。;(4)在出现异常方法的调用者中捕获并处理异常。
67. java常见异常:1.ArrayIndexOutOfBoundException:数组下标越界异常,常发生在数组下标小于零或大于数组长度时。;2.NullPointerException:空指针异常。引用指向的对象为空时发生。;3.ClassCastException:类转化异常。常发生在类型转化错误时。4.IllegalArgumentException:非法参数异常。通常在函数参数非法时由程序主动抛出;5.NumberFormatException:数字转化异常,如用Integer.parseInt方法转化非法字符串为数字时。;6.ArithmeticException:算术异常,如除零时。
68. File类:用于描述文件系统中的一个文件或目录。常用方法:getName()获取文件或目录的名字;length()获取文件的大小 以字节为单位;lastModified()获取文件的最后修改时间 毫秒值;getPath()获取当前文件或目录的路径,以字符串形式返回;exists()判断当前File对象描述的文件或目录是否存在;delete()删除文件或目录;isFile();isDirectory();File[] listFiles()获取当前目录下的所有子项,返回file对象的数组;String[] list()返回当前目录下子项的名字,以字符串数组形式返回;createNewFile()
69. Java的I/O体系:字节流(输入流:java.io.InputStream;输出流:java.io.OutputStream);字符流(输入流java.io.Reader,输出流java.io.Writer)
70. 字符流常用的类:FileReader,FileWriter ,BufferedReader,BufferedWriter字节流常用的类:FileInputStream,FileOutputStream,BufferedInputStream,BufferedBuffered
71. append和write方法的区别:1.append可以添加null的字符串,输出为"null“;2.而write不可以添加null的字符串
72. 进程和线程:进程:是程序的一次动态执行过程;线程:操作系统能够进行运算调度的最小单位,是进程的执行单位.
73. 线程的创建和启动:1。继承与Thread类,重写run()方法;2。实现Runnable接口.线程启动需要创建一个Thread的对象,并且调用start()方法。
74. 线程安全:多个线程去访问一个资源的时候,需要保证数据的同步。单线程一定是安全的。
75. 非线程安全:多个线程去访问一个资源的时候,不能够保证数据的同步
76. 如何保证多线程安全:给方法或代码块加上同步,用关键字 synchronized 1。方法锁(同步方法);2代码块锁(同步代码块)
77. 造成死锁的两种原因:1。synchronized修饰run函数,run()函数中有一个无限循环,一个线程进入后会在其中往复操作,这使它永远不会放弃对this的锁定,结果导致其它线程无法调用;2.两个线程都要获得两个对象的锁定才能执行实质性操作,但运行起来却发现其它线程持有了自己需要的另一个锁定,于是停在Wait Set中等待对方释放这个锁定,结果造成了死锁。
78. 解决死锁的办法:1.某线程持续不退出同步函数会造成死锁.解决方法是去掉或更换不正确的同步锁;2.两个线程都等待对方释放自己需要的资源也会造成死锁.这种情况的解决方法是确保同步锁对象的持有顺序。
79. 为什么要使用内部类:1。内部类方法可以访问该类定义所在的作用域中的数据,包括私有变量。 2。内部类可以对同一个包中的其它类进行隐藏。
80. 内部类的分类:1。静态内部类(开发中用的非常少); 2。非静态内部类(成员内部类,方法内部类,匿名类(继承式匿名内部类,接口式匿名内部类,参数式匿名内部类))
81. 构造器Constructor是否可被override: 构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载.
82. 是否可以继承String类: String类是final类故不可以继承
83. try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后 答:会执行,在return前执行
84. 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对 答:1,对String类来说,重写了equals,hashCode两个方法,因此字符串内容相等的话,就会有相同的哈希码。这句话是不对的。2。但是对于其他类来说,如果没有重写equals,hashCode两个方法的话,Object类的equals方法比较的是引用,这样的话x和y应该有相同的哈希码。
85. Object类的equals方法比较的地址,即两个引用是否指向同一个实例。但是String类重写了equals方法,比较的是字符串的内容。
86. Sleep()和wait()的区别:1。Sleep()不释放同步锁,wait()释放同步锁;2。Sleep()自动醒来,时间不到可以用interreput来强行打断,wait()可以用notify()直接唤醒;3。Sleep()来源于类Thread,wait()来自原Object;4.wait,notify和notifyAll只能在同步方法或者同步块里面用,而sleep可以在任何地方使用;5。Sleep必须捕获异常,而.wait,notify和notifyAll不需要捕获异常。
87. 设计模式:是一套被反复使用,多数人知晓的,代码设计经验的总结。
88. 为什么要使用设计模式:是为了代码复用,让代码更容易让他人理解,保证代码的可靠性。
89. 单例模式:保证系统中一个类只有一个实例,可以有效节约CPU资源.
90. 单例模式的好处:1。某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销; 2。省去了new操作符,降低了系统内存的使用频率,减轻GC压力;3。安全性
91. 工厂模式的实现:1。工厂方法的具体做法是让子类实现一个统一的接口;2。工厂类根据输入的参数生成具体子类的实例,返回类型用接口变量来接
92. 工厂模式的分类:1。普通工厂模式,建立一个工厂类,对实现了同一接口的一些类进行实例的创建;2。多个工厂方法模式:对普通工厂模式的改进,在普通工厂模式中,如果传递的字符串出错,则不能正确地创建对象。;3.静态工厂方法模式:将上面的多个工厂模式里的方法变成静态的,不需要创建工厂的实例,直接调用即可。
93. 工厂模式的问题:类的对象的创建依赖于工厂类,如果想要拓展程序,必须对工厂类进行修改。
94. 抽象工厂模式:抽象工厂类:创建多个工厂类,一旦需要增加新的功能,直接增加工厂类就可以了,不需要修改之前的代码。