目录
一、本周学习内容:
1.正则表达式校验数据格式
2.泛型类、接口、方法的使用方法
3.Lambda表达式简化函数式接口的匿名内部类
4.单列集合Collection中List:ArrayList、LinkedList
Set:hashSet、LinkedhashSet、treeSet
5.小知识:链表、红黑树、哈希值、哈希表
二、笔记:
(一)正则表达式
正则表达式:就是由一些特殊的字符组成,代表的是一个规则
作用:1.用来校验数据格式是否合法;
2.在一段文本中查找满足要求的内容
格式:字符串对象.matches(“匹配条件”),若对象的内容符合条件,则返回true作用1的书写规则:1.[abc]匹配单个字符,若为abc其中一个,则输出true
2.[^abc]匹配单个字符,若为abc其中一个,则输出false3.\\d匹配单个数字
4.\\D匹配单个非数字
\\w匹配单个字符 不能匹配中文,也可以为数字
.匹配任意单个字符
\\s匹配空格
数量词:
5.X? 匹配一次或零次
6.X*匹配0次或多次
7.X+匹配一次或多次
8.X{n}匹配n次
9.X{n,}匹配至少n次
10.X{n,m}匹配n次或m次
11.?i表示忽略大小写
12.(我爱)+表示我爱至少出现一次\\w+表示匹配1次或多次是否为字符(非汉字)
\\w{5,}表示匹配5次以上,若字符串小于5位,为false
(二)泛型
定义类.接口 方法时,同时声明了一个或多个类型变量(如<E>,E可以为基本数据类型(包装类里面的),也可以为引用数据类型,如填类名),称为泛型类 接口 方法,统称为泛型
无泛型时默认为Object类
作用:泛型提供了在编译阶段约束所能操作的数据类型,标签的作用
<>里面可以同时写多个类型
泛型类://创建一个泛型类用来模拟ArrayLIst类
//创建测试类
public class FanXingLei{
public static void main(String[] args){ //MyArraylist<String> list=new MyArraylist<>();
//class MyArraylist<E>{
MyArraylist<String> list=new MyArraylist<>(); //表示E被String取代,为字符串类型
list.add("java1");
list.add("java2");
list.add("java3");
String a=list.get(2);
System.out.println(a);
MyArraylist<String,String> list2=new MyArraylist<>();
list2.add("ba","da");
}}
//创建泛型类
class MyArraylist<E>{
private Object[] arr=new Object[10];
private int size=0;
public boolean add(E e){ //E表示形参类型为E型,e表示形参
arr[size++]=e;
return true;
}
public E get(int suo){
return (E)arr[suo];
}
}
class MyArraylist<E,T>{
public boolean add(E e,T e){ //E,T表示形参类型为E T型,e表示形参
arr[size++]=e;
return true;
}
<>里面的类型可以为类,也可以为类的子类:<E extends Animal>表示E类型只能是继承与Animal类的
-------------------------------------------------------------------------------------------------------------------------
泛型接口:定义格式:public interface 名<E>{ //表示该接口类里面方法的数据类型 为E类,E可以为一个类名,在实 现类里面实例化,即填一个确切的数据类型
void add(E e);
}
泛型实现类:public class 实现类名 implements 接口名<E> {} //E处填你想要带入的数 据 类型
-------------------------------------------------------------------------------------------------------------------------泛型方法:定义格式:修饰符<类型变量...> 返回值类型 方法名(参数列表){
}
对于方法来说使用泛型能规定调用该方法的数据类型
在参数列表里面使用泛型可以规定调用方法实参的数据类型-------------------------------------------------------------------------------------------------------------------------
使用泛型:类:创建对象时规定类型
接口:创建实现类时规定类型
方法:调用方法时规定类型-------------------------------------------------------------------------------------------------------------------------
通配符:? 在使用泛型的时候可以代表一切类型 //ETKV等是在定义泛型的时候用的例如:public static void go(ArrayList<?> x) 表示调用该方法的集合可以为任意类型
可以? extends dog,表示类型为任意的继承DOG的类,dog为上限
? super dog, 表示类型为dog类或dog类的父类,dog为下限
-------------------------------------------------------------------------------------------------------------------------
注意事项:1.泛型擦除:泛型是工作在编译阶段的,.class文件里面每有泛型
2.泛型不支持基本数据类型,只支持对象类型(引用数据类型)
(三)Lambda表达式
Lambad表达式:
作用:用于简化匿名内部类的代码写法
格式:(被重写方法的形参列表)->{
别重写方法的方法体代码。
}注意:Lambda表达式只能简化函数式接口的匿名内部类。
(即只能简化接口的内部类,且该接口里面只有一个抽象方法)
省略写法:
1.参数类型可以省略不写
2.如果只有一个参数,参数类型可以省略,()也可以省略
3.如果方法体里面只有一行代码,可以省略大括号不写,同时要省略分号。如果代码为return语句,return不写
(四)Collection单列集合
1.List
List系列集合:添加的元素是有序、可重复、有索引的。
有序:存的数据顺序和取的数据顺序相同
ArrayList、LinkedList:添加的元素是有序、可重复、有索引的。其不但有Collection的各种方法,因为其有索引,所以多了很多与索引有关的方法:
1.a.add(索引,要添加的元素)
2.a.remove(索引) //删除指定索引位的数据,并返回被删除元素
3.a.set(索引,要修改成的数据) //修改索引位的数据,并且会返回原来的数据
4.a.get(索引) //获取索引位数据
遍历:1.for循环(索引)
2.Itrator迭代器
3.增强for循环
4.Lambda表达式
两个实现类:ArrayList、LinkedList
区别:底层采用的数据结构(存储和组织数据的方式)不同,应用场景不同*ArrayList:基于数组实现的(1.根据索引查询数据快:根据地址值和索引查询,耗时相同
2.删除效率低:一个一个的往前移来删除数据,慢
3.添加效率极低:一个一个往后移,可能也需要扩容数组
查询快,增删慢)
* LinkedList:基于双链表(见小知识点)实现的(1.根据索引查询数据较慢
2.增删数据较快,对首尾元素的增删改查是极快的)
特有方法(首尾操作):1.addFirst(); //在列表开头插入指定的元素
2.addLast(); //将指定的元素追加到列表的末尾
3.getFirst(); //返回此列表的第一个元素
4.getLast(); //返回此列表的最后一个元素
5.removeFirst();//删除该列表的第一个元素,并返回
6.removeLast(); //删除该列表的最后一个元素,并返回
应用场景:设计队列和栈
1.队列:先进先出,后进后出 上下口开着,上进下出
2.栈:后进先出,先进后出 上口开,下口闭,上进上出
进栈也叫压栈push,出栈也叫弹栈pop
可以用来设计手枪弹夹....
c.addFirst(内容)==c.push(内容);
c.removeFirest(内容)==c.pop(内容)
2.Set
Set集合特点:添加的元素是无序、不重复、无索引的。
HashSet:添加的元素是无序、不重复、无索引的。
LinkedHashSet:添加的元素是有序、不重复、无索引的。
TreeSet:按大小默认升序排序、不重复、无索引
(无序:输入和输出顺序不同,只能无序一次)创建对象:Set<Integer> s=new HashSet<>();
方法:几乎没有增加新方法(全都是Collection的方法)
哈希值:见小知识点7
哈希表:见小知识点8HashSet:底层原理:基于哈希表实现的---哈希表是一种增删改查数据性能都较好的数据结构
哈希表=数组(查询好)+链表(增删好)+红黑树
由于两个对象的哈希值不同,对于两个内容相同的对象,不能去重复
解决:想办法令两个内容相同的对象的哈希值相同就行了
重写hashCode和equals方法: 1.重写hashCode方法,使两个对象的哈希值一样,保证计算的索引位相同
2.重写equals方法,重写前比较的是对象的地址,重写后比较的是内容LinkedHashSet(hashset的子类):
*也是基于哈希表实现的
*它的每个元素都额外的多了一个双链表的机制纪录它前后元素的位置,达到有序的目的
*相比于hashSet,多了一个双链表来把输入的数据穿起来,有顺序了,同时其它特性保留*缺点:内存大
TreeSet:底层是基于红黑树实现排序的
注意:1.对于Integer、Double来说是根据数值本身大小排序的
2.对于String来说是默认按照首字符的编号排序
3.对于自定义的对象,无法直接排序
(五)小知识
1.链表
链表:
*单链表:数据1.下一个数据的地址--->数据2.下一个数据的地址--->数据3.下一个数据的地址--->数据4.下一个数据的地址
链表中的每个节点在内存中是独立的,每个节点包含一个数值和下一个节点的地址
优点:增删数据时只用改地址就可以了,不用挪动每个数据,速度快
缺点:查询数据时会沿着链表逐一查询,较慢
*双链表:^(头地址)数值.下一个数值的地址--->……上一个数值的地址.数值.下一个数值的地址……--->上一个数值的地址.数值^
优点:查询数据时会判断数据在前还是在后,再查询,速度稍微快些
增删改查首尾数值特别快
能双向查询
2.哈希值、哈希表
哈希值:就是int类型的数值,java中的每个对象都有一个哈希值
*得到:Object类提供了一个供所有对象调用的方法hashCode();
c.hashCode(); //表示对象c的哈希值
*特点:一个对象的哈希值是固定的;
不同对象的哈希值一般不同,也有可能相同(超出了Int类型的极限,称为哈希碰撞)哈希表:JDK8之前,哈希表=数组+链表
JDK8之后,哈希表=数组+链表+红黑树*结构:数组+链表:一个链表占一个数组位
*Jdk8之前:创建一个默认长度16的数组,默认加载因子为0.75,数组名table
②使用元素的哈希值对数组的长度求余计算出应存入的位置(索引)
③判断当前位置是否为null,如果是null直接存入
如果不为null,表示有元素,则调用equals方法比较
相等,则不存;不相等,则存入数组
*JDK8之前,新元素存入数组,占老元素位置,老元素挂下面
JDK8开始之后,新元素直接挂在老元素下面
扩容:当哈希表数组里边面的数据个数=数组长度*加载因子时(默认0.75),会扩容为原来的两倍
三、本周学习感悟
本周主要的学习计划是集合,通过这周的学习,认识到了java想学好,记和练习少不了,学一个hashSet,要知道哈希表和它的原理,没有足够的记忆非常容易混。java贵在坚持....
四、下周学习计划
学习Map双列集合、复习前面的基本API和语法结构等等