Java周报3

设计模式:

设计模式的分类:

1、创建型模式(5个)

    工厂方法模式、抽象工厂模式、单列模式、建造者模式、原型模式;

2、结构模式(7个)

     适配器模式、装饰模式、代理模式、外观模式、桥接模式、享元模式、组合模式;

3、行为模式(11个)

策略模式、模板方法模式、观察者模式、选代子模式、责任连接模式、命令模式、状态模式、访问者模式、中介模式、解释器模式、备忘录模式;

 

单列模式:单例模式是创建对象的一种特殊方式,程序从始至终都只创建一个对象叫单例(单实例);

 

对于简单工厂, 工厂方法模式和抽象工厂的区别和用途:

 1、对于简单工厂(静态和非静态),用于生产同一结构中的任意产品,对于新增产品不适用;

 2、对于工厂方法,在简单工厂的基础上,生产同一个等级结构中的固定产品,可以支持新增产品;

 3、抽象工厂: 用于生产不同种类(品牌)的相同类型(迷你,SUV) ,对于新增品牌可以,不支持新增类型;

 

类和异常:

类:  在一个类中,定义另一个类的代码结构,通常定义在类的内部称为“内部类”,外面的类称为“外部类”,在逻辑关系上内部类与外部类是从属关系,比如一个People类存在收货地址类(收货人,收货地址,收货人的联系方式);

内部类:普通内部类(inner  class),一个类A中定义另一个类B,其中类B就是类A的内部类,也是类A的一部分;

匿名内部类: 定义一个没有类名,只有对方法的具体实现。通常它依赖于实现关系(接口)或继承关系(父类);

 

异常:

异常定义:在程序中,发生“不正常”的事件或发生错误,导致程序无法运行,并使JVM中断,都称为异常;

捕获异常:  当程序在运行时,发生了异常 ,为了让程序正常执行,需要对异常捕获(catch),称之为捕获异常 ;

Java是面向对象的语言, 异常本身就是一个类(Exception),当发生异常时会创建异常对象,捕获的就是该对;

异常关键字:

Try:试一试 ,将可能发生的代码使用try包裹   ,try不能单独出现;

catch :  捕获异常,  当发生指定的异常对象时,执行catch代码;

finally :   异常之后的最终处理 (无法是否发生异常,程序都执行 );

 

由于有些异常是不能直接抛出的  ,需要先声明才可以抛出,异常可以分为两大类:

1、编译期异常(check 异常或者检查异常):在编译期间检查异常,如果没有处理异常,则编译出错;

2、运行期异常(runtime 异常或者运行异常):在运行期间检查异常, 编译期可以不处理异常;

 

面试题:  关于 finally 和 return的执行顺序问题?

回答:当方法有返回值时,先执行fianlly,再return, 但是 finally的代码不会改变return结果;

自定义异常:

1、定义编译期异常类,创建一个类继承 java.lang.Exception ;

2、定义运行期异常类,创建一个类继承java.lang.RuntimeException;

 

Java的util包:

日期类  Date:

在Java中用于表达日期的类java.util.Date() ,用于获取日期和时间的对象,不过这个类的一些方法以及过时(被日历类取代);

    java.util.Calendar 是表示日历类,, 它是一个单例模式 ,通过 getInstance()获取一个日历对象, 并获取日历的任意时间,日期;

 

常用方法 :

getInstance() : 获取日历对象;

get() :获取指定的单位的日历数值   (年,月,日 等等);

set():设置指定单位的日历数值;

add() :添加指定单位的日历数值;

getTimeInMills() :获取日期的毫秒数;

 

正则表达式(Regular Expression)由字母和符号组成的具有特定意义的公式,用于匹配或检索符合条件的字符串;

^ :表示以指定的字符开头;

$:以指定符合结尾;

︿[a-zA-Z]: 字符必须是这个a-z或 A-Z之间的一个字符;

{8,16}:匹配前面的字符8次到16次之间;

正则表达式不属于某一门编程语言,可以在很多语言中使用, 例如 Java  ,Python 、JS、MySql ;

Java提供对正则表达式的支持,有如下类:

1、java.util.regex.Pattern 正则表达式的编译器类 ;

2、java.util.regex.Matcher 正则表达式的匹配器;

3、java.lang.String  中的方法自动兼容 正则语法;

元字符:

“ . ”:匹配任意一个字符;

“\w” :匹配一个数字,字母,_  或汉字\\W :对\w取反;

“\d”:匹配一个数字\D:对\d取反;

“\s”:匹配一个空白字符 \S:对\s取反;

“\b”:匹配以什么字符开头;

“^”:以指定的字符串开头 ,用于正则开始的标志位;

“$”:以指定的字符串结尾,用于正则结束的标志位;

 

重复限定符:

“*” : 匹配前一个字符0次或多次;

“?”:匹配前一个字符0次或1次;

“+”:匹配前一个字符1次或多次;

“{n}”:匹配前一个字符n次;

“{n,}”: 匹配前一个字符至少n次;

“{n,m}”:匹配前一个字符n到m次(包含n次,m次);

 

定时器类:

Timer类;java.util.Timer类 是一个任务调度的定时器类,可以安排任务一次执行,或定期重复执行;

TimerTask类: java.util.TimerTask类是由定时器执行的任务类,是一个抽象类;

 

Lang包:

API中根据不同的功能分如下包(package):

java.applet.*:java的小程序;

java.awt.* 和 java.swing.*:java的图形用户界面;

java.lang.*:  java的语言包;

java.util.*:  java工具类包、集合框架包;

java.io.*:java文件读写包(Input、Output);

java.net.*:java的网络编程包(Socket机制相关,URL);

java.sql./javax.sql.   :   java的数据库操作;

java.lang.reflect.* 反射相关包;

 

基本数据类型:

byte    Byte;

short   Short;

int     Integer;

long    Long;

float    Float;

double  Double;

char    Character;

boolean Boolean;

 

数据类型的装箱和拆箱:

装箱: 将基本数据类型自动转换成 它的包装类,可以使用包装类的方法和属性;

拆箱: 将包装类型 自动转成 对应的基本数据类型;

 

Object类是lang包提供的 ,对于lang包的类不需要import,所以 Object类无处不在,你不需要自己创建

常用方法:

1、getClass: 返回该对象的类型    任何类都有它的类型  ;

2、equals : Java中所有的equals 方式都是重写Object的方法 ;

原生的equals 比较的是 对象的地址 ,我们通常说的 equals比较两个对象的值是因为几乎所有的数据类型(包装类,String)都重写了equals 方法的;

hashCode()  : 返回该对象的hash值;

finalize()   资源回收调用该方法, 当对象地址不在被引用时,会被GC回收 并调用该方法;

Object obj = null ;

toString() : 返回该对象的字符串表现形式(通常会被子类重写);                                                                                       

wait():线程等待;

notify():唤醒其中一个等待的线程;

notifyAll:唤醒所有等待中的线程;

 

面试题:

为什么要重写HashCode呢?

回答: 在JMV中如果HashCode不相等,一定不能认为是同一个对象

 

字符串类:

String类的特点:它是一个不可变字符串 ,它的值创建后不能被改变;

字符串类常用方法:

将此字符串与指定对象进行比较:public boolean equals (Object anObject);

将此字符串与指定对象进行比较,忽略大小写:public boolean equalsIgnoreCase (String anotherString);

获取功能的方法:

返回字符串的长度:public int length();

将指定的字符串连接到该字符串的末尾:public String concat (String str);

返回指定索引处的char值:public char charAt (int index);

返回指定字符串第一次出现在该字符串内的索引:public int indexOf(String str);

返回一个子字符串,从beginIndex开始截取字符串到字符串结尾:public String substring (int beginIndex);

返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex,不含endIndexpublic String substring (int beginIndex,int endIndex);

 

转换功能的方法:

将字符串转换为新的字符数组:public char[] toCharArray();

使用平台的默认字符集将该String编码转换为新的字节数组:public byte[] getBytes();

将与targer匹配的字符串使用replacement字符串替换public String rep;ace (CharSequence targer,CharSequence replacement);

 

分割功能的方法:

将字符串按照给定的regex(规则)拆分为字符串数组:public String[] split(String regex);

 

StringBuffer类:是一个字符串缓冲区的类,线程安全运行效率低,用户存储可变字符串;

常用方法:

 1.、append() :追加字符;

 2、delete(int  start,int end):删除指定位置的字符;

 3、insert(int  start,String):插入到指定位置;

 4、reverse():反转字符;

 5、capacity():获取初始容量;

 6、ensureCapacity(int):设置最低所需容量;

 

StringBuffer类(其StringBuilder的方法与StringBuffer几乎一样):也是字符串缓冲区的类,它是线程不安全,且运行效率高的可变字符串缓冲类;

 

StringBuffer、StringBuilder和String的区别:

1、在运行速度上  : StringBuilder > StringBuffer  >  String;

原因: String是字符串常量,而StringBuilder和StringBuffer是字符串变量,当需要改变字符串内容时,Stirng重新创建变量并赋值, 而StringBuilder和StringBuffer可直接改原有的值,所有效率高;    

2、在线程安全上:   StringBuffer >  StringBuilder > String ;

原因: StringBuffer是线程安全的,而StringBuilder线程不安全,在StringBuffer上的很多方法增加同步关键字(synchronized),导致在多个线程运行时,保持数据的完整性和一致性,而StringBuilder的方法并没有同步 ,如果在多线程环境下为了确保数据安全,建议使用StringBuffer ,如果在单线程环境下,提高效率使用StringBuilder;

 

克隆:

我们知道任意一个类都继承自Object类,其中Object类提供一个clone方法 用于克隆对象;

实现步骤:

1、 实现 接口  Cloneable  ;

2、重写 clone方法(由于该方法是Object的 protectect修饰 不能直接访问);

浅克隆:

在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址;

Java的对象克隆默认是浅克隆;

深克隆:

在深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象;

简单来说,在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将复制;

Math类:

java.lang.Math类用于数学计算的工具类 ,它提供都是静态方法  ,不需要构造Math对象;

常用方法:

Math.random():获取随机数;

Math.abs() 获取绝对值;

Math.ceil(): 向上取整;

Math.floor() :向下取整;

Math.rint():取接近它的整数 ,如果两个同样接近,往偶数靠近;

Math.max(int,int):返回两个数的最大值;

Math.min(int,int):返回两个数的最小值;

Math.round():四舍五入整数;

Math .sqrt():对一个数开平方;

Math.pow(double,double),对一个数的几次幂;

 

BigDecimal类:

两个double类型的计算可能导致精度不准确,这里使用;

java.math.*里面提供了BigDecimal类(提供高精度计算的方法);

 

NumberFormat类:

java.text.NumberFormat类 :用于将数值格式转成指定格式并输出字符串形式的类 ;

DecimalFormat类: 属于NumberFormat的子类;

 

泛型(generics)是JDK5.0以后的特性,提供了编译期间安全监测机制,它是将数据类型参数化的一种方式;

泛型类(generic class):

它是一种具有一个或多个类型变量的类,(一个变量可以有多种类型)

语法:

public  class  类<T>{

      // 类里面的数据类型 和 方法返回值,以及方法的参数都可以使用T 

      // <>里面可以是任意大写字母

     

  }

 

定义泛型的字母:

T : Type: 变量类型;

K: Key : 任意键的类型;

V: Value  : 任意值的类型;

E:ELement 用于定义集合的元素类型;

 

泛型接口(generic interface):

在接口中定义泛型,使接口的方法可以使用该泛型,实现类实现该接口时需要指定接口的类型;

语法:

public interface Genarator<T> {

    public T getValue();

    public void setValue(T s);

}

泛型接口的好处:让接口的方法的返回值或参数类型 也参数化 (泛型);

泛型方法:

1、  为什么会使用泛型方法 :

当一个类中 只有某个方法需要使用泛型,而不是类的全部方法使用泛型,这时可以将泛型定义的范围缩小,通常我们可以定义进行泛型方法;

2、  定义泛型方法

 语法:

  public  class 普通类:

  public <T>  T  getValue()  { 

      }

      public <T> void setValue(T t){

           } 

       }

泛型的好处:可以对类的数据类型 写通用类型,提高代码的复用性 和 可扩展性;

泛型通配符:

在定义泛型时除了可使用大写字母表示一种泛型类以外,还可以使用通配符表示泛型类型,如下三种表示方法:

<?>  :表示一种通用的泛型类,与<T>相似;

<? extends T> :表示 泛型类型是T的子类,或者是T;

<? super T> : 表示泛型类型是T的父类,或者是T;

<T> 是一种确定的类型 , 可以表示定义泛型类或泛型方法;

<?> 是一种不确定的类型, 不能定义泛型类或泛型方法, 通常用于作为方法的形参 ;

 

集合框架:

存储多个元素我们以前学过数组类型, 由于数组类型特点是 相同类型且长度固定  ,如果需要存储某一天的新闻数据,用数组不合理 ,无法确定当天数量。 Java中提供可变长度的存储多个元素的数据类型,还可以存储不同数据结构的数据。这样的类型 就是“集合类型” ;

数组和集合的区别:

1、数组的长度固定,集合的长度可自动扩容;

2、数组的数据类型固定,集合可以存储任意类型 ,集合可以支持泛型;

3、数组没有方法,而集合提供大量的方法;

4、Java中提供一个动态数组 集合类型,或其他结合类型;

 

集合的顶级接口:

Collection属于单列集合的根接口,它扩展的主要子接口包括 java.util.List  和 java.util.Set接口;

List接口特点存储有序 且 可重复的元素, 而Set接口特点存储无序且不可重复的元素,其中List下扩展常用的实现类包括 java.util.ArrayList 和java.util.LinkedList  和Vector , 其中Set接口下扩展的实现类包括 java.util.HashSet 和 java.util.TreeSet .

集合接口的常用方法:

public void add(E) : 把给定的元素添加到集合中;

public void clear():清空集合中的所有元素;

public boolean remove(E):删除集合中指定的元素,删除成功返回true;

public boolean contains(E):判断该元素是否存在集合中;

public boolean isEmpty():判断是否为空集合对象   null会报异常;

public int size():获取几个元素的大小;

publict Object toArray() : 将集合元素转成对象数组 ;

 

ArrayList类:

java.util.ArrayList是一个数组结构的集合,实现动态数组的功能,扩展所有Collection的方法;

数组结构的本质: 线性结构的顺序结构,ArrayList中使用连续的内存空间存储, 访问时通过下标(元素所在的位置)访问;

 

posted @ 2020-10-25 23:15  刘176  阅读(122)  评论(0)    收藏  举报