Java基础学习--关于java设计模式、java容器

Java基础知识点-1

Java基础知识点

  1. 面向对象和面向过程的区别

    面向过程:

    自顶向下,逐步细化。当我们遇到一个问题时,按部就班的罗列其中从开始到结束所需要解决的问题,然后对每一步骤设计函数,需要使用时逐步调用函数解决。

    面向对象:

    将问题中的事物封装成一个对象。用以描述作为解决问题的步骤中的一个行为。

    示例:

    当我们需要解决一个五子棋下棋问题时。面向过程的思想是加载棋盘,A先下棋,判断胜负情况,B下棋子,判断胜负情况···直至游戏结束。面向对象的思想是,封装A棋对象和B棋对象,负责棋子移动,在通过封装棋盘系统和规则系统判断游戏胜负。

    优缺点:

    面向过程的性能更高,对计算机的消耗更少、开销更少。面向对象的系统更为灵活,面向对象的封装、继承、多态等特性,使其易拓展、复用、维护。

  2. Java的设计模式

    什么是设计模式(Design Pattern)?

    设计模式是一套被开发人员反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式是软件工程的基石,使用好Java设计模式可以帮助开发人员减少很多问题的出现,优化解决问题的方法。

    设计模式的分类:

    创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程。

    结构型模式:把类或对象结合在一起形成一个更大的结构。

    行为型模式:类和对象如何交互,责任划分和算法。

    在这里插入图片描述

    模式关键点
    单例模式某个类只能有一个实例,提供一个全局的访问点
    工厂方法模式定义一个创建对象的接口,让子类决定实例化哪个类
    抽象工厂模式创建相关或依赖对象的家族,而无需明确指定具体类
    建造者模式封装一个复杂对象的构建过程,并可以按步骤建造
    原型模式通过复制现有的实例来创建新的实例
    适配器模式将一个类的方法接口装换成客户希望的另一个接口
    组合模式将对象组合成树形结构以表示“部分-整体”的层次结构
    装饰模式动态的给对象添加新的功能
    代理模式为其他对象提供一个代理以便控制这个对象的访问
    亨元模式通过共享技术来有效的支持大量细粒度的对象
    外观模式对外提供一个统一的方法,来访问子系统中的一群接口
    桥接模式将抽象部分和它的实现部分分离,使他们都可以独立的变化
    模板模式定义一个算法结构,而将一些步骤延迟到子类实现
    解释器模式给定一个语言,定义它的文法的一种表示,并定义一个解释器
    策略模式定义一系列算法,把他们封装起来,并且使它们可以相互替换
    状态模式允许一个对象在其对象内部状态改变时改变它的行为
    观察者模式对象间的一对多的依赖关系
    备忘录模式在不破坏封装的前提下,保持对象的内部状态
    中介者模式用一个中介对象来封装一系列的对象交互
    命令模式将命令请求封装为一个对象,使得可以用不同的请求来进行参数化
    访问者模式在不改变数据结构的前提下,增加作用域一组对象元素的新功能
    责任链模式将请求的发送者和接收者解耦,使得多个对象都有处理这个请求的机会
    迭代器模式一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构

    具体可前往Java设计模式总结进行学习

  3. Java容器:Collection和Map

    Java中的容器分为Collection和Map两类。Map不是Collection的子类
    Collection:

    Collection集合的子接口有Set、List、Queue三种,图解如下:

    在这里插入图片描述

    Set集合的实现类主要有:HashSetTreeSet(后续会有哈希表、二叉树、红黑树的讲解)

    HashSet:底层是哈希表,通过hashCode()equals()保证元素唯一,LinkedHashSet底层是链表和哈希表。链表可保证元素有序。

    TreeSet:底层是红黑二叉树,通过比较返回值是否为0保证元素唯一。

    List集合的主要实现类有LinkedListArrayListVector(后续会展开详细的讲解)

    LinkedList:通过双向循环链表来实现,元素无下标,查询、修改慢,复杂度为;插入、删除快,实现了Queue中的Deque接口。(因此图中LinkedList应该多一个指向到Deque

    ArrayList:通过数组来实现,元素具有下标,查询快、修改快;插入、删除慢

    Vector:与ArrayList一样用数组实现,区别是其支持线程同步,同一时刻内只支持一个线程写Vector,但与此带来的是高昂的花费,与ArrayList相比降低了访问速度。

    Map:

    Map集合并不继承自CollectionMap是一个键值对集合,Key无序,主要实现类有HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap,网上参考了一张图,图解如下:

    在这里插入图片描述

    后续详解HashMapHashTable的区别。

    Queue:

    笔试面试应该不问吧,就按照队列去理解就好了???先进先出。

  4. ArrayListLinkedList的区别

    共同点:

    两者都是单列集合List接口的实现类,存储的数据都是有序的,有索引,可以存储重复的值。

    不同点:

    内存:LinkedListArrayList更占据内存,因为链表除了数据还需要存储引用。

    扩容: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

  5. HashMapHashTable的区别

    共同点:

    它们都是存储键值对(key-value)的散列表,而且都采用链地址法。同时它们判断两个key和value相等的标准相等。

    HashmapHashtable都实现了map、Cloneable(可克隆)、Serializable(可序列化)这三个接口。

    不同点:

    继承类:HashMap继承自AbstractMap类,HashTable继承自Dictionary类(已被废弃)。

    底层实现:HashMapHashTable在jdk1.7之前都是数组+链表的实现,jdk1.8之后HashMap则加入了红黑树。

    键值:HashTable不允许键和值为Null,HashMap则都可以为Null。

    初始化容量:HashMap初始容量为16,HashTable为11。

    扩容机制:HashMap为当前容量翻倍,HashTable为当前容量翻倍+1。

    同步机制:HashMap不是synchronized(同步)的,线程不安全,适用于单线程环境;HashTable是synchronized的,适用于多线程环境,线程安全。

如有错误还望各位不吝赐教,持续更新ing

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值