JaveSE 内容
面向对象:
面向对象是模型化的,你只需抽象出一个类,这个类只需要写解决问题的方法,在需要某些功能的时候调用出来就行(面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们使用的就是面向对象了)
- 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
- 缺点:因为类调用时需要实例化,开销比较大,比较消耗资源
Java 面向对象编程三大特性
封装:封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法。
继承:继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。
继承的特性:
1. 子类拥有父类非 private 的属性和方法;
2. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展;
3. 子类可以用自己的方式实现父类的方法;
多态:父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。
- 方法重载(overload):实现的是编译时的多态性(也称为前绑定)
- 方法重写(override):实现的是运行时的多态性(也称为后绑定)
抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
**在Java中有两种形式可以实现多态:**继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。
面向对象五大基本原则是什么
- 单一职责原则SRP(Single Responsibility Principle):类的功能要单一,不能包罗万象,跟杂货铺似的;
- 开放封闭原则OCP(Open-Close Principle):对于一个模块,是开放扩展的,但关闭修改的;
- 里式替换原则LSP(the Liskov Substitution Principle LSP):子类可以替换父类出现在父类能够出现的地方;
- 依赖倒置原则DIP(the Dependency Inversion Principle DIP):高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象;
- 接口分离原则ISP(the Interface Segregation Principle ISP):设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好;
对象相等判断
== 和 equals 的区别是什么
== : 它的作用是判断两个对象的地址是不是相等,equals() : 它的作用也是判断两个对象是否相等(没重写方法,作用和==一样)。
hashCode 与 equals
HashSet如何检查重复:
当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。
两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?(hashCode和equals方法的关系)
- 两个对象equals相等,则它们的hashcode必须相等,反之则不一定
- 两个对象==相等,则其hashcode一定相等,反之不一定成立
(因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖)
hashcode 解决hash冲突的两种方法
String 类
String, StringBuffer和StringBuilder区别
String是字符串常量,final修饰:StringBuffer字符串变量(线程安全),StringBuilder 字符串变量(线程不安全)。
String和StringBuffer
String和StringBuffer主要区别是性能:String是不可变对象,每次对String类型进行操作都等同于产生了一个新的String对象,然后指向新的String对象。所以尽量不在对String进行大量的拼接操作,否则会产生很多临时对象,导致GC开始工作,影响系统性能。
StringBuffer是对对象本身操作,而不是产生新的对象,因此在有大量拼接的情况下,我们建议使用StringBuffer。
StringBuffer和StringBuilder
StringBuffer是线程安全的可变字符串,其内部实现是可变数组。StringBuilder是jdk 1.5新增的,其功能和StringBuffer类似,但是非线程安全。因此,在没有多线程问题的前提下,使用StringBuilder会取得更好的性能。
Map类
HashMap和Hashtable有什么区别?
- HashMap是非线程安全的,HashTable是线程安全的;
- HashMap的键和值都允许有null值存在,而HashTable则不行;
- 因为线程安全的问题,HashMap效率比HashTable的要高;
- Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境
一般不建议用HashTable:1、是HashTable是遗留类,内部实现很多没优化和冗余;2、即使在多线程环境下,现在也有同步的ConcurrentHashMap替代,没有必要因为是多线程而用HashTable
Mysql数据库
DELETE与TRUNCATE区别
- DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作,不清空AUTO_INCREMENT记录数
- TRUNCATE则直接将表删除并重新建表,不会把单独的删除操作记录记入日志保存,删除行是不能恢复的,AUTO_INCREMENT将置为0,效率比DELETE高
存储过程
概念
存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
创建存储过程
“test_add” 是个简单的 MySQL 存储过程,这个MySQL 存储过程有两个 int 类型的输入参数 “a”、“b”,返回这两个参数的和。
drop procedure if exists pr_add;
create procedure test_add ( a int, b int ) begin declare c int;
if a is null then set a = 0;
end if;
if b is null then set b = 0;
end if;
set c = a + b;
select c as sum;