11.Java基础
1. 集合
List,Set,Queue和Map。
List,Set,Queue都是接口,他们都继承至Collection接口。
Map是独立接口。
1.1 List
有序,可重复。(按照进入的先后顺序)
ArrayList,底层数据结构是数组,查询快,增删慢。线程不安全,效率高。 Vector,底层数据结构是数组,查询快,增删慢。线程安全,效率低 LinkedList,底层数据结构是链表,查询慢,增删快。线程不安全,效率高。
1.2 Set
无序,唯一。
HashSet,底层数据结构是哈希表。(无序,唯一)
通过两个方法:hashCode()和equals()保证元素唯一性。LinkedHashSet,底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
由链表保证元素有序。由哈希表保证元素唯一。TreeSet,底层数据结构是红黑树。(有序,唯一)
自然排序,比较器排序保证有序。根据比较的返回值是否是0来决定唯一性。
1.3 Map
键值对集合。键唯一,值可重复。
HashMap,无序的。不同步,线程不安全。 允许key/value为空。
TreeMap,有序的。红黑树对所有的键排序。
HashTable,无序的。同步,线程安全。
2. 面向对象的特性
2.1 Java中抽象类和接口的特点
共同点:
- 抽象类和接口都不能生成具体的实例。
- 都是作为上层使用。
不同点:
- 抽象类可以有属性和成员方法,接口不可以。
- 一个类只能继承一个类,但是可以实现多个接口。
- 抽象类中的变量是普通变量,接口中的变量是静态变量。
- 抽象类表达的是
is-a
的关系,接口表达的是like-a
的关系。
2.2 面向对象的三大特性
面向对象的三大特性:继承、封装和多态。
封装:封装就是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别。
继承:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
多态:多态同一个行为具有多个不同表现形式或形态的能力。
多态存在的三个必要条件:
- 要有继承。
- 要有复写。
- 父类引用指向子类对象。
Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中的方法重载。
重载:是指多个方法名一样,参数类型和个数不一样,返回值类型可以一样,也可以不一样。
重写:是指在子类中继承父类方法,方法名和参数相同,对该方法进行重新定义。
5. == 和 equals的区别
== 是运算符,当比较对象为基本数据类型时,比较的是数据的大小;当比较对象为引用类型时,比较的是引用类型中存放的地址。
equals,是Objec类的方法,默认用于比较两个对象是否相等,也就是地址值。
案例:
A和B值相同,String A==String B相等吗? true。
如果A和B是2个对象,虽然值相同,但是用==号比较返回false。如果用equals比较就是true。
6. equals和hashcode的关系
默认情况下,
equals
相等,hashcode
必相等,hashcode
相等,equals
不是必相等。hashcode基于内存地址计算得出,可能会相等,虽然几率微乎其微。
7. String,StringBuffer和StringBuild的区别
String
:String
属于不可变对象,每次修改都会生成新的对象。
StringBuilder
:可变对象,非多线程安全。
StringBuffer
:可变对象,多线程安全。大部分情况下,效率是:
StringBuilder
>StringBuffer
>String
。
8. Http和Https
HTTPS = HTTP + SSL/TLS
HTTP作用于应用层,使用80端口,起始地址是
http://
,明文传输,消息容易被拦截,串改。
HTTPS作用域传输层,使用443端口,起始地址是https://
,需要下载CA证书,传输的过程需要加密,安全性高。
9. final,finally,finalize
final关键字:
final修饰的类无法继承
final修饰的方法无法重写
final修饰的变量不可修改finally关键字:
用于与try语句连用,用于异常处理机制
finally中的语句时必须执行的finalize标识符:
是一个Object类中的方法名
这个方法是垃圾回收器gc负责调用的
一般用来记录对象在JVM中被释放时的时间,即记录对象内存被释放的时间
12. 算法
1.排序算法
分为两大类,比较类配和非比较类排。
1.1 比较类排
a. 交换排序
冒泡排序
- 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
- 重复步骤1~3,直到排序完成。
b. 插入排序
插入排序法
- 从第一个元素开始,该元素可以认为已经被排序;
- 取出下一个元素,在已经排序的元素序列中从后向前扫描;
- 如果该元素(已排序)大于新元素,将该元素移到下一位置;
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
- 将新元素插入到该位置后;
- 重复步骤2~5。
c. 选择排序
选择排序法
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。