Java基础知识点-1
Java基础知识点
-
面向对象和面向过程的区别
面向过程:
自顶向下,逐步细化。当我们遇到一个问题时,按部就班的罗列其中从开始到结束所需要解决的问题,然后对每一步骤设计函数,需要使用时逐步调用函数解决。
面向对象:
将问题中的事物封装成一个对象。用以描述作为解决问题的步骤中的一个行为。
示例:
当我们需要解决一个五子棋下棋问题时。面向过程的思想是加载棋盘,A先下棋,判断胜负情况,B下棋子,判断胜负情况···直至游戏结束。面向对象的思想是,封装A棋对象和B棋对象,负责棋子移动,在通过封装棋盘系统和规则系统判断游戏胜负。
优缺点:
面向过程的性能更高,对计算机的消耗更少、开销更少。面向对象的系统更为灵活,面向对象的封装、继承、多态等特性,使其易拓展、复用、维护。
-
Java的设计模式
什么是设计模式(Design Pattern)?
设计模式是一套被开发人员反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式是软件工程的基石,使用好Java设计模式可以帮助开发人员减少很多问题的出现,优化解决问题的方法。
设计模式的分类:
创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程。
结构型模式:把类或对象结合在一起形成一个更大的结构。
行为型模式:类和对象如何交互,责任划分和算法。
模式 关键点 单例模式 某个类只能有一个实例,提供一个全局的访问点 工厂方法模式 定义一个创建对象的接口,让子类决定实例化哪个类 抽象工厂模式 创建相关或依赖对象的家族,而无需明确指定具体类 建造者模式 封装一个复杂对象的构建过程,并可以按步骤建造 原型模式 通过复制现有的实例来创建新的实例 适配器模式 将一个类的方法接口装换成客户希望的另一个接口 组合模式 将对象组合成树形结构以表示“部分-整体”的层次结构 装饰模式 动态的给对象添加新的功能 代理模式 为其他对象提供一个代理以便控制这个对象的访问 亨元模式 通过共享技术来有效的支持大量细粒度的对象 外观模式 对外提供一个统一的方法,来访问子系统中的一群接口 桥接模式 将抽象部分和它的实现部分分离,使他们都可以独立的变化 模板模式 定义一个算法结构,而将一些步骤延迟到子类实现 解释器模式 给定一个语言,定义它的文法的一种表示,并定义一个解释器 策略模式 定义一系列算法,把他们封装起来,并且使它们可以相互替换 状态模式 允许一个对象在其对象内部状态改变时改变它的行为 观察者模式 对象间的一对多的依赖关系 备忘录模式 在不破坏封装的前提下,保持对象的内部状态 中介者模式 用一个中介对象来封装一系列的对象交互 命令模式 将命令请求封装为一个对象,使得可以用不同的请求来进行参数化 访问者模式 在不改变数据结构的前提下,增加作用域一组对象元素的新功能 责任链模式 将请求的发送者和接收者解耦,使得多个对象都有处理这个请求的机会 迭代器模式 一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构 具体可前往Java设计模式总结进行学习
-
Java容器:Collection和Map
Java中的容器分为Collection和Map两类。Map不是Collection的子类
Collection:
Collection集合的子接口有Set、List、Queue三种,图解如下:
Set
集合的实现类主要有:HashSet
和TreeSet
(后续会有哈希表、二叉树、红黑树的讲解)HashSet
:底层是哈希表,通过hashCode()
和equals()
保证元素唯一,LinkedHashSet
底层是链表和哈希表。链表可保证元素有序。TreeSet
:底层是红黑二叉树,通过比较返回值是否为0保证元素唯一。List集合的主要实现类有
LinkedList
、ArrayList
、Vector
(后续会展开详细的讲解)LinkedList
:通过双向循环链表来实现,元素无下标,查询、修改慢,复杂度为;插入、删除快,实现了Queue
中的Deque
接口。(因此图中LinkedList
应该多一个指向到Deque
)ArrayList
:通过数组来实现,元素具有下标,查询快、修改快;插入、删除慢Vector
:与ArrayList
一样用数组实现,区别是其支持线程同步,同一时刻内只支持一个线程写Vector
,但与此带来的是高昂的花费,与ArrayList
相比降低了访问速度。Map:
Map
集合并不继承自Collection
,Map
是一个键值对集合,Key无序,主要实现类有HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap
,网上参考了一张图,图解如下:后续详解
HashMap
和HashTable
的区别。Queue:
笔试面试应该不问吧,就按照队列去理解就好了???先进先出。
-
ArrayList
和LinkedList
的区别共同点:
两者都是单列集合List接口的实现类,存储的数据都是有序的,有索引,可以存储重复的值。
不同点:
内存:
LinkedList
比ArrayList
更占据内存,因为链表除了数据还需要存储引用。扩容:
ArrayList
每次扩容的新的容量为1.5倍原容量+1,约为1.5倍,LinkedList
的扩容只需增加一个节点,修改前后两个节点的指向即可。底层实现:
ArrayList
底层实现是动态数组,LinkedList
底层实现是双向循环链表。数据类型:
ArrayList
支持Java基本数据类型和对象,LinkedList
只支持对象。对于随机查询:
ArrayList
通过数组地址和元素索引计算出元素地址,进行访问,复杂度为O(1);LinkedList
通过从头节点或尾节点(具体看哪个近)进行寻址查找,进行访问,复杂度平均为O(n)。对于随机增删:
ArrayList
的增删若不在尾部,都需要依次移动元素,平均复杂度O(n);LinkedList
只需要修改前后两个节点的指向即可,平均复杂度为O(1)。(PS:这里有一个问题是,当我们使用代码进行增删的实验时,会发现当数据量较大,ArrayList
的耗时反而比LinkedList
的少,这里我的理解是:我们分析的是单纯对于增删两个概念而言的复杂度,当我们使用代码时,就涉及到了元素的查询,这时就不是单纯的分析增删了。)总结:
业务中增删频繁的则使用
LinkedList
,业务查询频繁的则使用ArrayList
-
HashMap
和HashTable
的区别共同点:
它们都是存储键值对(key-value)的散列表,而且都采用链地址法。同时它们判断两个key和value相等的标准相等。
Hashmap
和Hashtable
都实现了map、Cloneable(可克隆)、Serializable(可序列化)这三个接口。不同点:
继承类:
HashMap
继承自AbstractMap
类,HashTable
继承自Dictionary
类(已被废弃)。底层实现:
HashMap
和HashTable
在jdk1.7之前都是数组+链表的实现,jdk1.8之后HashMap
则加入了红黑树。键值:
HashTable
不允许键和值为Null,HashMap
则都可以为Null。初始化容量:
HashMap
初始容量为16,HashTable
为11。扩容机制:
HashMap
为当前容量翻倍,HashTable
为当前容量翻倍+1。同步机制:
HashMap
不是synchronized(同步)的,线程不安全,适用于单线程环境;HashTable
是synchronized的,适用于多线程环境,线程安全。
如有错误还望各位不吝赐教,持续更新ing