正则表达式
概述:
含义:正则表达式就是一个字符串;可以表示一个系列的字符串是否符合规则;正则中的一些内容都是规定好的特殊字符
正则的好处:
需求:判断一个qq号码是否合法
需遵循的规则:1、纯数字;2、5-14位;3、不能以0开头
System.out.println("343434556".matches("[1-9][0-9]{4,13}"));
好处:正则表达式可以非常简单的表达一些规则内容,不需要写很多判断
弊端:正则表达式的浓度比较高,可读性比较差,写正则时非常容易出问题
正则的引入
正则表达式在使用时需要调用方法来使用
matches("String regex")检查调用使用者字符串是否复合参数中的正则;String regex传递一个正则
正则中都是一些特定字符,使用正则就需要用到这些字符类
字符类:
含义:就是正则中表示范围或者其他规则的字符
解释:无论表示范围多大只对一个字符生效,只对自己前面紧贴的字符生效
罗列
[abc] a或者b或者c
[^abc] 除了abc其他的都符合规则
[a-m] 表示英文字母abcdefjhijklm
预定义字符类
含义:就是在表示一些比较常用的字符时【a-z】【A-Z】【0-9】【_】就可以将这些常用的字符预定义一个规则,用更加简单的正则符号表示他们
罗列:
. 表示通配符
\d 表示0-9 的数字
\D 表示除了数字
\s 表示空白字符
\S 除了空白字符
\w 表示单词字符[a-zA-Z0-9_]
\W 除了单词字符
System.out.println("9".matches("\\d"));
数量词
就是字符类和预定字符类都只对一个字符生效,所以还需要一些表示数量词的特殊符号
分类:
1、模糊的数量词:
A? A出现1次或者0次
A+ 出现1次或者多次
A* 0次或者多次
2、精确的数量词:
A{n} 表示恰好出现n次
A{n,} 至少出现n次
A{n,m} 至少出现n次至多出现m次 包含n也包含m
正则跟字符串相关的方法
split(string regex)根据正则切割字符串返回到一个数组中
replaceAll(String regex,String s)将调用者中可以匹配到正则的内容替换成指定的内容。
集合
概述:
存放对象的数组:
定义一个Person[]数组,存放一些对象,那么这个数组存放的是这些对象的引用
数组的弊端:1、容量固定,无法扩容;2、没有提供一些方法操作数组,只能手动操作数组,操作起来比较麻烦,我们就希望有一个类型底层存储的是数组,另外也给我们提供一些方法直接操作数组,就不需要我们直接对数组进行操作了,调用这个类型的方法就可以;3、类型比较单一
集合:
什么是集合,也是存放数据的容器,集合就是我们希望的类型。
数组和集合的关系:
相同点:
1、都是装零散数据的容器。
2、数组和集合都需要使用到特定的编号来操作。
3、数组就是集合的底层,集合更加方便的去操作数组
不同点:
1、储存数据类型方面
数组可以储存 基本数据类型和引用数据类型
集合只能存引用数据类型,但是基本数据类型可以通过自动装箱存储到集合中。
2、储存个数方面
数组存储数据的个数有限并且固定
集合顶层可以实现一个自动的扩容。
3、功能方面
数组功能比较少 只能用Object继承过来的功能。
集合提供了很多的功能可以去操作数组。
集合的体系:
体系的简介:
单列集合顶级父接口:单列集合元素之间都是相互独立的个体
collection: 存储单列集合中的都需要具备的方法。
List 有序单列集合的接口
ArrayList 底层是数组操作 顺序存储
LinkedList 链表操作 节点操作
Set 无序单列集合的接口
HashSet
Linkedhashset 哈希表存储 通过哈希码值操作
双列集合顶级父接口:
两个单独的个体组成一个单位作为一个元素。成对出现。
Map
HashMap 哈希表操作
linkedHashmap 哈希表操作
Collection
常用的方法
Add()
Contains()
Isempty()
Remove()
Clear()
Size()
集合和集合之间的操作
addAll(Collection c) 添加参数中集合c的所有元素到调用集合中
Remove(Collection c) 删除参数集合c中在调用集合中存在的元素 (删除两个集合的交集)
RetainAll(Collection c) 保留被调用集合参数集合c中存在的元素 (计算两个集合的交集)
Contatins(collection c) 判断参数c集合中的元素是否在调用集合中全部存在(判断子集)
集合的遍历方式
第一种遍历方式:转数组
Object[] toArray()
可以将集合转换为数组
然后在采用数组遍历的方式间接对集合进行遍历
第二种遍历方式:
迭代器
情况:单列集合中有不同的子接口不同的子接口中又有不同的实现类。每种实现类都有自己实现的方式。针对每种实现类的集合遍历也都是不同的情况。
希望出现一种类型用来专门处理每种集合的遍历。并且这个类型给每个实现类都提供了响应的遍历方法。我们只需要使用这个类型就可以完成不同集合的遍历。
迭代器的含义:在每个接口中都有迭代器的接口。并且每个实现类都对应了一种迭代对象。
获取迭代器:每个接口中都有一个获取对应迭代器的方法 我们可以通过这个方法来获取该集合对应的迭代对象 就可以使用顶层的迭代接口来指向这个引用。我们就不需要关注这个迭代对象是如何实现对集合的遍历。直接使用即可。
Iteroter() 返回一个对象的迭代器对象
迭代器的使用:
顶级的迭代器接口中的方法
1、hasNext() 判断是否有下一个元素
2、Next() 可以获取到集合中的每个元素
3、Remove() 可以删除迭代器判断到的最后一个元素
特点:
1、迭代、更新。一步一步的迭代。
2、不具有全局的视野只能获取周围的信息,短视。
迭代器的注意事项
1、hasNext相关的
不会一直往下走 只会去判断下一步是否有元素。
2、next相关的
会一直往下执行直到判断没有一下个元素才能结束
3、java.util.NoSuchElementException
当迭代器遍历到最后还是要往前走这是就会出现找不到元素的异常。
List
定位:就是collection的子接口
特点:
1、是一个有序的集合接口,因为每个元素有会有一个相应的位置。
2、位置的编号就是它的索引。
3、可以有重复的元素。
特有的功能:索引可以操作集合 它的特有方法都是与索引相关。
Add(int index,Obejct o)
Remove(int index)
Set(int index,Object o)
Get(int index)
List独有的遍历方式
思路:
Size()可以获取当前集合的长度
Get(int index) 可以获取指定位置的元素
就可以结合使用直接对list集合进行遍历。
并发修改的异常
对异常的描述:
当我们在使用迭代器遍历list集合时在去使用list中的方法对集合操作时就会出现这个异常。
ConcurrentModificationException
如何避免异常的出现:
方式1:集合遍历 集合修改
方式2:迭代器遍历 迭代器修改
顶级的迭代器接口中只提供了remove删除的方法没有添加修改相关的方法。
List集合中有listiterator 这样的方法 可以返回list中独有的迭代器对象。
这个类型中就提供了可以添加 add set previous 相关的方法。