10.21Java - 正则表达式、Java内存模型、虚拟机

正则表达式

1 、简介

正则表达式用于处理字符串,它通过约束字符的排列规则,可以:

  1. 验证字符串是否匹配正则规则;
  2. 检索符合规则的字符串;

完整的正则表达式包括:

  1. 特殊字符(或“元字符”)
  2. 文字(或“普通文本字符”)

2、元字符

2.1、

字符关键词解释
\d数字字符匹配一个数字字符,等价于[0,9]
\D匹配一个非数字字符
\n换行符匹配一个换行符
\r回车符匹配一个回车符
\s空白字符匹配任何空格字符,包括空格、制表符、换页符等,等价于[\f\n\r\t\v]
\S匹配任何非空白字符
\w单词字符匹配一个单词字符(包括下划线字符),等价于[A-Za-z0-9]
\W匹配任何非单词字符

2.2、

.匹配任意一个字符
\(反斜杠)转义字符,将特殊字符转义成普通字符

2.3、

()标记一个子表达式,一个子表达式可以匹配一段字符串
|意为’或’,|两边的子表达式称为多选分支

形如(子表达式a|子表达式b)这样的结构称为“多选结构”,|两边的子表达式称为“多选分支”。

2.4、限制符

?匹配前面的子表达式或字符0或1次至多1次
*****匹配至少0次[0,n]
+匹配至少1次[1,n]
{min,max}匹配至少min次,至多max次[min-max]
{n}匹配n次
{n,}至少匹配n次

注意:***** 和 + 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个**?**就可以实现非贪婪或最小匹配。

贪婪匹配:贪婪模式会尽可能多的匹配

**非贪婪匹配:**非贪婪模式会尽可能少的匹配

当**?*紧跟在任何一个其他限制符、+、?、{n}、{n,}、{n,m}后面时,匹配模式都是非贪婪的。

2.5、

^匹配文本的开始位置,^称为脱字符
$匹配文本的结束位置

3、字符组

字符组用**[]表示,一个字符组匹配一个字符的位置**,且该位置可以匹配字符组中的任一个字符。

3.1 连字符

字符组元字符 -(连字符),表示一个范围,注意如果用在字符组开头,如[-]或[^-],则只代表是一个 - 字符,不表示范围

3.2 排除字符

排除型字符组:[^…] 匹配 除字符组内所有字符 之外的 任何字符

注意:在字符组内部,元字符的定义规则(及他们的意义)是不一样的。例如,在字符组外部,点号是元字符,但是在内部则不是如此。相反,连字符只有在字符组内部才是元字符,否则就不是。

Pattern 类:

pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。

Matcher 类:

Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。

//1 正则校验
//写一个正则表达式,匹配手机号
		
String str = "31415";
String regx = "\\d\\d+";
boolean tar = Pattern.matches(regx, str);
System.out.println(tar);
		
//2 正则检索
String ip = "192.168.1.141";
//
String r2 = "\\d{2,}?";
//编译指定的正则表达式
Pattern p2 = Pattern.compile(r2);
//将传入的字符串匹配指定的正则表达式
Matcher m = p2.matcher(ip);
while(m.find()) {//向下查找一次,是否存在匹配的字符串,返回布尔值
	System.out.println(m.group());//打印匹配到的字符串
}

Java内存模型

1、 Java内存模型JMM (Java Memory Model)

Java虚拟机(JVM)在执行Java程序的过程中,会把它管理的内存划分为几个不同的数据区域(也就是运行时的数据区域),这些区域都有各自的用途、创建时间、销毁时间。

2、 Java虚拟机运行时数据区(JVM Runtime Data Area)

在Java虚拟机规范(JVMS)中定义了多种程序运行时会用到的存储不同类型数据的内存区域,统称为“Java虚拟机运行时数据区”,有的数据区是全局共享的(static),有的是线程私有的(局部变量)。

全局共享:随着JVM启动而创建,随着JVM退出而销毁

线程私有:随着线程开始而创建,随着线程结束而销毁

2.1 运行时数据区划分

  1. 程序计数器 (program counter register)

  2. Java虚拟机栈 (VM stack)

  3. 本地方法栈 (native method stack)

  4. 堆 (heap)

  5. 方法区 (method area)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nWHRaNHt-1666355927467)(file:///C:\Users\19912\AppData\Local\Temp\ksohtml20800\wps1.jpg)]

jdk1.8之前的JMM模型图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ayjlcN4z-1666355927468)(file:///C:\Users\19912\AppData\Local\Temp\ksohtml20800\wps2.png)]

JDK1.8以后的JMM模型图

2.2 程序计数器(Program Counter Register)

  1. 一块较小的内存空间,他的作用可以看做是:当前线程所执行的字节码的行号指示器

  2. 如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法(JDK自带的方法),这个计数器值为空。

  3. 此内存区域是唯一一个在JVM规范中没有规定任何OutOfMemoryError(内存溢出)情况的区域

2.3 虚拟机栈(VM Stack)

  1. 线程私有

  2. 后进先出(LIFO)栈 last in first out

  3. 存储栈帧,支撑Java方法的调用,执行和退出

  4. 可能出现OutOfMemeoryError异常和StackOverFlowError异常

OutOfMemeoryError(内存溢出):当jvm栈被设计成可动态扩展,在动态扩展时无法申请到足够的内存

StackOverFlowError(栈溢出):线程请求的栈深度大于jvm允许的最大深度

2.4 本地方法栈(Native Method Stack)

在HotSpot中本地方法栈与VM Stack合并

本地方法栈与Java虚拟机栈基本相同,区别在于:

  1. Java虚拟机栈为JVM执行字节码所服务

  2. 本地方法栈为JVM执行Native方法所服务,支撑Native方法的调用,执行和退出

2.5 方法区: static final

方法区存放了要加载的类的信息Class(名称、修饰符等)、类中的静态常量、类中定义为final类型的常量、类中的Field信息、类中的方法信息Method,当在程序中通过Class类的方法来获取对象信息时,这些数据都来源于方法区。方法区是被Java线程所共享的,不像Java堆中其他部分一样会频繁被GC回收,它存储的信息相对比较稳定,在一定条件下会被GC,当方法区要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。方法区也是堆中的一部分,就是我们通常所说的Java堆中的永久区 Permanet Generation,大小可以通过参数来设置,可以通过-XX:PermSize指定初始值方法区包含所有的class和static变量、final变量,-XX:MaxPermSize指定最大值。

· 又叫静态区,跟堆一样,被所有的线程共享。

· 方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。(两者区别为堆区存放new出来的对象信息,方法区存放类信息)

2.6 堆heap

堆是JVM所管理的内存中最大的一块,是被所有Java线程共享的,不是线程安全的,在JVM启动时创建。堆是存储Java对象的地方,这一点Java虚拟机规范中描述是:所有的对象实例以及数组(即所有的引用类型)都要在堆上分配。Java堆是GC管理的主要区域,从内存回收的角度来看,由于现在GC基本都采用分代收集算法,所以Java堆还可以细分为:新生代和老年代;新生代再细致一点有Eden空间、From Survivor空间、To Survivor空间等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0H6pmTxE-1666355927468)(file:///C:\Users\19912\AppData\Local\Temp\ksohtml20800\wps3.jpg)]私有内存区——伴随线程的产生而产生,一旦线程终止,私有内存区也会自动消除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值