题目
面试记录
面试题搜索
- HTTP 的请求和响应都包含哪些内容
- spring的AOP的实现方式
- 数据库索引用的是哪种数据结构,为什么要用这个数据结构(https://blog.csdn.net/u013257679/article/details/80690521)
- redis有哪几种数据类型
- 用redis 写一个一小时内登陆5次 就禁止登陆的方法,写出方法即可,不用方法名
- sql 查找薪水最高的一为员工的姓名,用一条sql 将表1的数据复制到表2
- url 访问到页面展示的过程
- 聚簇索引 非聚集索引 问题本质是它们结构不同,决定了他们的性质不同。
- hashMap的原理怎么优化
- jvm 调优
- 用两个栈实现一个队列,要求能多线程访问( 只会 单独push和pop的)
- 字符串反序
- finally 执行前在try 或者 catch 块中已经return的话,finally 块中再次赋值return变量不会改变retrun的值。如果在finally之后return 则返回finally块中的赋值。
- 面向对象
面向对象编程:是一种编程风格或编程范式。以类或对象组织代码基本单元,并将封装、抽象、继承、多态作为代码设计和实现的基石。 - 封装:信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式(或者叫函数)来访问内部信息或者数据。
需要编程语言本身提供一定的语法机制来支持。这个语法机制就是访问权限控制。private、public 等关键字就是访问权限控制语法。 - 抽象:封装主要讲的是如何隐藏信息、保护数据,而抽象讲的是如何隐藏方法的具体实现,让调用者只需要关心方法提供了哪些功能,并不需要知道这些功能是如何实现的。
在面向对象编程中,我们常借助编程语言提供的接口类( interface 关键字语法)或者抽象类( abstract 关键字语法)这两种语法机制,来实现抽象这一特性。
实际上,抽象这个特性是非常容易实现的,并不需要非得依靠接口类或者抽象类这些特殊语法机制来支持。换句话说,并不是说一定要为实现类(PictureStorage)抽象出接口类(IPictureStorage),才叫作抽象。即便不编写 IPictureStorage 接口类,单纯的 PictureStorage 类本身就满足抽象特性。
是因为,类的方法是通过编程语言中的“函数”这一语法机制来实现的。通过函数包裹具体的实现逻辑,这本身就是一种抽象。调用者在使用函数的时候,并不需要去研究函数内部的实现逻辑,只需要通过函数的命名、注释或者文档,了解其提供了什么功能,就可以直接使用了。
抽象有时候会被排除在面向对象的四大特性之外。抽象这个概念是一个非常通用的设计思想,并不单单用在面向对象编程中,也可以用来指导架构设计等。而且这个特性也并不需要编程语言提供特殊的语法机制来支持,只需要提供“函数”这一非常基础的语法机制,就可以实现抽象特性、所以,它没有很强的“特异性”,有时候并不被看作面向对象编程的特性之一。 - 继承是用来表示类之间的 is-a 关系
从继承关系上来讲,继承可以分为两种模式,单继承和多继承。为了实现继承这个特性,编程语言需要提供特殊的语法机制来支持
继承最大的一个好处就是代码复用。
不过,这一点也并不是继承所独有的,我们也可以通过其他方式来解决这个代码复用的问题,比如利用组合关系而不是继承关系。
继承的概念很好理解,也很容易使用。不过,过度使用继承,继承层次过深过复杂,就会导致代码可读性、可维护性变差。为了了解一个类的功能,我们不仅需要查看这个类的代码,还需要按照继承关系一层一层地往上查看“父类、父类的父类……”的代码。还有,子类和父类高度耦合,修改父类的代码,会直接影响到子类。
所以,继承这个特性也是一个非常有争议的特性。很多人觉得继承是一种反模式。我们应该尽量少用,甚至不用。关于这个问题,在后面讲到“多用组合少用继承”这种设计思想的时候,我会非常详细地再讲解,这里暂时就不展开讲解了。 - 多态
子类可以替换父类,在实际的代码运行过程中,调用子类的方法实现。
多态这种特性也需要编程语言提供特殊的语法机制来实现:1.第一个语法机制是编程语言要支持父类对象可以引用子类对象。2.编程语言要支持继承。3.编程语言要支持子类可以重写(override)父类中的方法。
对于多态特性的实现方式,除了利用“继承加方法重写”这种实现方式之外,我们还有其他两种比较常见的的实现方式,一个是利用接口类语法,另一个是利用 duck-typing 语法。不过,并不是每种编程语言都支持接口类或者 duck-typing 这两种语法机制,比如 C++ 就不支持接口类语法,而 duck-typing 只有一些动态语言才支持,比如 Python、JavaScript 等。
多态特性能提高代码的可扩展性和复用性。
多态也是很多设计模式、设计原则、编程技巧的代码实现基础,比如策略模式、基于接口而非实现编程、依赖倒置原则、里式替换原则、利用多态去掉冗长的 if-else 语句等等。关于这点,在学习后面的章节中,你慢慢会有更深的体会。
- 封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式来访问内部信息或者数据。它需要编程语言提供权限访问控制语法来支持,例如 Java 中的 private、protected、public 关键字。封装特性存在的意义,一方面是保护数据不被随意修改,提高代码的可维护性;另一方面是仅暴露有限的必要接口,提高类的易用性。
- 封装主要讲如何隐藏信息、保护数据,那抽象就是讲如何隐藏方法的具体实现,让使用者只需要关心方法提供了哪些功能,不需要知道这些功能是如何实现的。抽象可以通过接口类或者抽象类来实现,但也并不需要特殊的语法机制来支持。抽象存在的意义,一方面是提高代码的可扩展性、维护性,修改实现不需要改变定义,减少代码的改动范围;另一方面,它也是处理复杂系统的有效手段,能有效地过滤掉不必要关注的信息。
- 继承是用来表示类之间的 is-a 关系,分为两种模式:单继承和多继承。单继承表示一个子类只继承一个父类,多继承表示一个子类可以继承多个父类。为了实现继承这个特性,编程语言需要提供特殊的语法机制来支持。继承主要是用来解决代码复用的问题。
- 多态是指子类可以替换父类,在实际的代码运行过程中,调用子类的方法实现。多态这种特性也需要编程语言提供特殊的语法机制来实现,比如继承、接口类、duck-typing。多态可以提高代码的扩展性和复用性,是很多设计模式、设计原则、编程技巧的代码实现基础。
- 封装隐藏内部实现细节,提高安全性(暴露细节可能导致出现bug,如多线程,导致并发修改问题)和简化编程(不需要知道实现细节,只需要使用开放功能)
- 继承代码复用机制。但是注意继承是紧耦合的,父类修改方法,子类的行为也会变动。滥用继承会起到反效果。
- 多态重载和重写,向上转型重载:相同名字,不同参数的方法重写:相同名字,相同参数,相同返回值(返回值不同,不能通过编译)
OOP设计原则:SOLID设计模式,经典问题的总结
16.for 和foreach的区别
17.if 判断和 switch的区别
18.优化sql ,
从语句入手Select 剔除不需要的字段
From 检查是否过多的表连接,无效表连接,连接条件
where条件(查看查询计划)对索引的命中情况,为什么没有命中,命中了索引是否是Index Seek
嵌套查询有多少
查看数据库IO,物理读取(逻辑读取一般不能控制,要读取数据就得去磁盘读取),逻辑读取(优化从数据库缓存读取数据页次数)
表设计方面优化,字段类型,NULL字段可以给默认值,有需要的话权衡数据一致性对业务复杂度提升可以适当冗余
19.sql 注入
输入验证,(预)编译,参数化