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中使用连续的内存空间存储, 访问时通过下标(元素所在的位置)访问;

浙公网安备 33010602011771号