Java设计模式的一些问题及思考

单例模式:

1.单例模式的声明过程

先私有构造方法,再在成员位置创建该类的对象,最后对外提供静态方法获取该对象。若是懒汉式,则不需要创建该类的对象。

2.懒汉式和饿汉式的区别

​ 饿汉式:类加载就会导致该单实例对象被创建

​ 懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时才会创建

3.双重检查锁定的使用场景与过程

使用场景:单例模式;防止接口调用

双重检查锁模式是一种非常好的单例实现模式,解决了单例、性能、线程安全问题

但是在多线程的情况下,可能会出现空指针问题,出现问题的原因是JVM在实例化对象的时候会进行优化和指令重排序操作。

要解决双重检查锁模式带来空指针异常的问题,只需要使用 volatile 关键字, volatile 关键字可以保证可见性和有序性。

原型模式:

1.浅克隆的原理、特点和方法

浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。

最普遍的克隆,即对象实现cloneable接口和重写clone方法,然后调用一次内部不做改写的clone方法克隆出一个对象,如果源对象内部存在引用类型的成员变量,那么就说该克隆是浅克隆,即对于引用类型属性,只克隆引用,两个对象的引用指向同一块内存地址,即同一个对象。

Object类中的clone方法是浅克隆。如何声明和使用?

声明:Cloneable 接口
使用:

  1. 被复制的类需要实现Clonenable接口, 该接口为标记接口(不含任何方法)
  2. 覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象。
  3. 将得到的复制对象返回

2.深克隆的定义和方法

深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。

方法:使用序列化流、嵌套clone

序列化的声明和使用过程?

**序列化:**对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存了Java对象的状态以及相关的描述信息。序列化机制的核心作用就是对象状态的保存与重建。

使用过程:

1.创建一个字节数组输出流 内存数组输出流
2.用对象输入流包装 序列化流
3.将该对象写入序列化流中,随后会被传递到内存数组输出流中,将对象序列化为byte[]类型的数据

4.从内存数组输出流中获取到this对象的byte[]类型的数据,传入内存数组输入流
5.用对象输入流包装 将内存数组输入流传给反序列化流,这样也实现了byte[]类型的数据的传递

概述:

1.设计模式概述:设计模式的定义和分类

设计模式 是指在特定环境下为解决某一通用软件设计问题提供的一套定制的解决方案,该解决方案描述了对象和类之间的相互作用,

结构型模式、行为型模式、创建者模式

2.面向对象设计原则:七大原则的定义与特征

开闭原则:对扩展开放,对修改关闭

单一职责原则:一个对象只包含一个职责,封装在一个类中

迪米特原则:陌生的类不能作为变量引入

合成复用原则:优先使用对象组合,而不是继承

依赖倒转原则:依赖于抽象的接口。高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。 简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

里氏代换原则:不重写或重载父类的方法。子类可以扩展父类的功能,但不能改变父类原有的功能

接口隔离原则:客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。

Java知识扩展

1.多线程的创建(Thread类和Runnable接口)

继承Thread类:
每个线程都是通过某个特定的 Thread 对象的 run()方法来完成操作的,经常把 run()方法的主体称为线程体

通过该 Thread 对象的 start()方法来启动这个线程,而非直接调用 run()

实现Runnable接口:
开发中优先选择 Runnable 接口方式

  1. 实现的方式没有类的单继承性
  2. 实现的方式更适合来处理多个线程有共享数据的情况
  3. public class Thread implements Runnable

2.多线程的协同(如何在主线程序中等待子线程结束等)

synchronized

3.函数式接口的声明与使用

@FunctionalInterface注解
有且只有一个抽象方法的接口被称为函数式接口,函数式接口的本质还是一个接口,你可以创建一个接口的实现类,重写其中的抽象方法

4.Lambda表达式的使用场景

列表循环、事件监听、代替 Runnable、Map 映射、Reduce 聚合

集合框架的使用

1.常见的集合框架分类

list、set、Map

2.set的实现类及特点

Set接口:存储无序的,不可重复的元素

  • 1.无序性: 无序性不等于随机性。真正的无序性,指的是元素在底层存储的位置是无序的.

  • 2.不可重复性:当向set中添加进相同的元素时,后面的这个不能添加进去。

    Set set =new HashSet();

3.list的实现类及其特点。List有哪些遍历方式

List 是一种存放单列数据的集合,可以存放同一种类型的元素、元素之间有序、元素允许重复的集合,集合中每个元素都有其对应的顺序索引。
List 中的元素都有对应的一个序列号(索引)记录着元素的位置,因此可以通过这个序列号快速访问指定位置的元素。
在List接口内部定义了一些除Collection接口已有方法之外的新方法。比如get,indexOf,subList,lastIndexOf等方法。

实体类

public class News{
    private int id;
    private String title;
    private String author;
    
    public News(int id, String title, String author) {
        super();
        this.id = id;
        this.title = title;
        this.author = author;
    }
    
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getTitle() {
        return title;
    }
 
    public void setTitle(String title) {
        this.title = title;
    }
 
    public String getAuthor() {
        return author;
    }
 
    public void setAuthor(String author) {
        this.author = author;
    }
 
}

for循环

import java.util.ArrayList;
 
public class Demo01 {
 
  public static void main(String[] args) {
   ArrayList<News> list = new ArrayList<News>();
    
   list.add(new News(1,"list1","a"));
   list.add(new News(2,"list2","b"));
   list.add(new News(3,"list3","c"));
   list.add(new News(4,"list4","d"));
   for (int i = 0; i < list.size(); i++) {
            News s = (News)list.get(i);
            System.out.println(s.getId()+"  "+s.getTitle()+"  "+s.getAuthor());
    }
  }
}

使用foreach遍历List

import java.util.ArrayList;
 
public class Demo02 {
 
  public static void main(String[] args) {
 
    ArrayList<News> list = new ArrayList<News>();
 
     list.add(new News(1,"list1","a"));
             list.add(new News(2,"list2","b"));
             list.add(new News(3,"list3","c"));
             list.add(new News(4,"list4","d"));
    for (News s : list) {
            System.out.println(s.getId()+"  "+s.getTitle()+"  "+s.getAuthor());
   }
  }
}

适用迭代器Iterator遍历:直接根据List集合的自动遍历

import java.util.ArrayList;
 
public class Demo03 {
 
  public static void main(String[] args) {
 
   ArrayList<News> list = new ArrayList<News>();
    
   list.add(new News(1,"list1","a"));
   list.add(new News(2,"list2","b"));
   list.add(new News(3,"list3","c"));
   list.add(new News(4,"list4","d"));
   
     Iterator<News> iter = list.iterator();
     while (iter.hasNext()) {
            News s = (News) iter.next();
            System.out.println(s.getId()+"  "+s.getTitle()+"  "+s.getAuthor());
    }
  }
}

4.Map的实现类及其特点

HashMap:采用哈希表算法,此时Map中的key不会保证添加的先后顺序,key也不允许重复。(key判断重复的标准:key1和key2是否equals为true,并且hashCode相等)

TreeMap:采用红黑树算法,此时Map中的key会按照自然排序或定制排序进行排序,key也不允许重复。(key判断重复的标准:compareTo/compare的返回值是否为0)

LinkedHashMap:采用链表和哈希表算法,此时Map中的key会保证先后添加的顺序,key也不允许重复。(key判断重复的标准和HashMap中的key的标准相同)

Hashtable:采用哈希表算法,是HashMap的前身。(类似Vector是ArrayList的前身)

5.HashMap的原理

HashMap是基于hashing的原理,底层使用哈希表(数组 + 链表)实现。里边最重要的两个方法put、get,使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真不会coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值