前言:
设计模式这块还需要下大功夫,,,
一、设计模式:
工厂设计模式:
简单工厂+工厂:
都是同一种产品进行定义,采用抽象类无法实现多继承。
抽象工厂
里斯替换原则:
并不是所有的东西都可以被替换的,比如麻雀会飞,可以继承鸟飞这种的特性,但是并不是所有类都可以继承,比如鸵鸟不能继承鸟类,因为鸵鸟不会飞。还有对于许多类其实胡乱继承会导致子类过于复杂,因此应当合理的继承
总而言之,在后期使用到的框架其实只要学会向顾客一样使用即可,通常不会再让顾客new到具体的产品。
单例模式:
1.正常情况创建类都是new 。。。有些类只能有一个类,打印机、回收站都是单例,比如打印
特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。
链表模式
指挥者模式:
通过打印hashcode 判断是不是同一个类,单例模式基本上是要mo出来
instance
二、集合框架:为什么要使用集合框架:存储一维数据时,用数组越界问题容易发生。
List 输出数据不唯一,有序
Set 存储数据唯一,无序
Set和List的区别
- 1. Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。
- 2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。
- 3. List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector>
算法类中的方法都是静态的,可以通过类名直接使用
LinkedList额外的方法
查找多用ArrayList 删除多用LinkedList
借用迭代器,遍历集合元素:
下面堆set、map、arrayset进行测试:
前期准备好一些测试类:
测试狗类:
public class Dog {
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private int age;
public Dog(String name, String sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
}
主函数测试类
public static void main(String[] args) {
Dog dog1=new Dog("小白","公",11);
Dog dog2=new Dog("小白下","公",12);
Dog dog3=new Dog("小白上","公",13);
//ArrayList HashSet HashMap
System.out.println("ArrayList输出");
ArrayList<Dog> dogs=new ArrayList<Dog>();
dogs.add(dog1);
dogs.add(dog2);
dogs.add(dog3);
for (Dog dog : dogs) {
if ("小白".equals(dog.getName())) {
System.out.println("找到小白"+dog.getName());
dog.setName("小黑");
}
}
dogs.remove("小白上");
for (Dog dog : dogs) {
System.out.println(dog.getName());
}
System.out.println("MapHash输出");
Map<String, Dog> dogMap=new HashMap<String, Dog>();
dogMap.put(dog1.getName(),dog1);
dogMap.put(dog2.getName(),dog2);
dogMap.put(dog3.getName(),dog3);
Dog delDog=dogMap.get("小黑");
dogMap.remove("小黑");
dogMap.put(delDog.getName(),delDog);
for (String key : dogMap.keySet()) {
System.out.println(dogMap.get(key).getName());
}
System.out.println("HashSet输出");
Set<Dog> dogSet=new HashSet<Dog>();
dogSet.add(dog1);
dogSet.add(dog2);
dogSet.add(dog3);
for (Dog dogSet1 : dogSet) {
System.out.println(dogSet1.getName());
if ("小白上".equals(dogSet1.getName())) {
System.out.println("找到小白上,下面对其修改");
dogSet1.setName("小黑2");
}
}
dogSet.remove("小黑2");
for (Dog dogSet1 : dogSet) {
System.out.println(dogSet1.getName());
}
}
三、异常:
一、 异常机制的概述
异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执 行的流程发生改变,程序的控制权转移到异常处理器。
处理运行时异常:处理机制五个关键字:try、fatch、finally、throw、throws
程序错误分为三种:1.编译错误;2.运行时错误;3.逻辑错误。
NullPointerException 空指针异常,好朋友。。。
Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。
Exception(异常):是程序本身可以处理的异常。Exception 类有一个重要的子类 RuntimeException。RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。
二、 Exception(异常)分两大类:
运行时异常和非运行时异常(编译异常)。
程序中应当尽可能去处理这些异常。
1.运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
2.非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
三、 异常处理的机制
对于错误、运行时异常、可查异常,Java技术所要求的异常处理方式有所不同。
1. 错误:对于方法运行中可能出现的Error,当运行方法不欲捕捉时,Java允许该方法不做任何抛出声明。因为,大多数Error异常属于永远不能被允许发生的状况,也属于合理的应用程序不该捕捉的异常。
2. 运行时异常:由于运行时异常的不可查性,为了更合理、更容易地实现应用程序,Java规定,运行时异常将由Java运行时系统自动抛出,允许应用程序忽略运行时异常。
3. 可查异常:对于所有的可查异常,Java规定:一个方法必须捕捉,或者声明抛出方法之外。也就是说,当一个方法选择不捕捉可查异常时,它必须声明将抛出异常。
常见的异常:
参照一下这个博客
(0)