士多啤梨喺边🌈 士多啤梨係边度
To
关注数: 21 粉丝数: 676 发帖数: 3,079 关注贴吧数: 15
数据库三范式 什么是范式:简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些 规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。 什么是三大范式: 第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要 求,否则,将有很多基本操作在这样的关系模式中实现不了。 第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。 第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF. 注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性 第一范式 1、每一列属性都是不可再分的属性值,确保每一列的原子性 2、两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据。 如果需求知道那个省那个市并按其分类,那么显然第一个表格是不容易满足需求的,也不符合第一范式。显然第一个表结构不但不能满足足够多物品的要求,还会在物品少时产生冗余。也是不符合第一范式的。 第二范式 每一行的数据只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。 一个人同时订几个房间,就会出来一个订单号多条数据,这样子联系人都是重复的,就会造成数据冗余。我们应该把他拆开来。 这样便实现啦一条数据做一件事,不掺杂复杂的关系逻辑。同时对表数据的更新维护也更易操作。 第三范式 数据不能存在传递关系,即没个属性都跟主键有直接关系而不是间接关系。像:a-->b-->c 属性之间含有这样的关系,是不符合第三范式的。 比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话) 这样一个表结构,就存在上述关系。 学号--> 所在院校 --> (院校地址,院校电话) 这样的表结构,我们应该拆开来,如下。 (学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话) 最后: 三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。
数据库三范式 什么是范式:简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些 规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。 什么是三大范式: 第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要 求,否则,将有很多基本操作在这样的关系模式中实现不了。 第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。 第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF. 注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性 第一范式 1、每一列属性都是不可再分的属性值,确保每一列的原子性 2、两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据。 如果需求知道那个省那个市并按其分类,那么显然第一个表格是不容易满足需求的,也不符合第一范式。显然第一个表结构不但不能满足足够多物品的要求,还会在物品少时产生冗余。也是不符合第一范式的。 第二范式 每一行的数据只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。 一个人同时订几个房间,就会出来一个订单号多条数据,这样子联系人都是重复的,就会造成数据冗余。我们应该把他拆开来。 这样便实现啦一条数据做一件事,不掺杂复杂的关系逻辑。同时对表数据的更新维护也更易操作。 第三范式 数据不能存在传递关系,即没个属性都跟主键有直接关系而不是间接关系。像:a-->b-->c 属性之间含有这样的关系,是不符合第三范式的。 比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话) 这样一个表结构,就存在上述关系。 学号--> 所在院校 --> (院校地址,院校电话) 这样的表结构,我们应该拆开来,如下。 (学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话) 最后: 三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。
序列化 序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。 序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例。 序列化就是一种用来处理对象流的机制。所谓对象流也就是将对象的 内容进行流化,流的概念这里不用多说(就是I/O)。我们可以对流化后的对象进行读写 操作,也可将流化后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)! 在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的! 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。 序列化使其他代码可以查看或修改,那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的SecurityPermission。在默认策略下,通过 Internet 下载的代码或 Internet 代码不会授予该权限;只有本地计算机上的代码才被授予该权限。 通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也与可访问性规则无关。 对于任何可能包含重要的安全性数据的对象,如果可能,应该使该对象不可序列化。如果它必须为可序列化的,请尝试生成特定字段来保存不可序列化的重要数据。如果无法实现这一点,则应注意该数据会被公开给任何拥有序列化权限的代码,并确保不让任何恶意代码获得该权限。 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。 当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。
序列化 序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。 序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例。 序列化就是一种用来处理对象流的机制。所谓对象流也就是将对象的 内容进行流化,流的概念这里不用多说(就是I/O)。我们可以对流化后的对象进行读写 操作,也可将流化后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)! 在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的! 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。 序列化使其他代码可以查看或修改,那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的SecurityPermission。在默认策略下,通过 Internet 下载的代码或 Internet 代码不会授予该权限;只有本地计算机上的代码才被授予该权限。 通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也与可访问性规则无关。 对于任何可能包含重要的安全性数据的对象,如果可能,应该使该对象不可序列化。如果它必须为可序列化的,请尝试生成特定字段来保存不可序列化的重要数据。如果无法实现这一点,则应注意该数据会被公开给任何拥有序列化权限的代码,并确保不让任何恶意代码获得该权限。 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。 当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。
过滤器 filter 1、Filter(过滤器)用于在 servlet 之外对request 和 response 进行修改。 Filter 有一个 FilterChain 的概念,一个 FilterChain 包括多个 Filter。 客户端请求 request 在抵达 servlet 之前会经过 FilterChain 里面所有的 Filter, 服务器响应 response 从 servlet 抵达客户端浏览器之前也会经过 FilterChain 里面所有的 Filter 2、实现自定义的Filter 需要满足一下条件: 1)实现 javax.servlet.Filter 接口,实现其 init、doFilter、destroy三个方法。 2)实现在 web.xml 中的配置。 3、Filter接口有三个方法:这三个方法反应了 Filter 的生命周期。 1)init:只会在 web 程序加载的时候调用,即启动如 tomcat 等服务器时调用。一般负责加载配置的参数。 2)destroy :web 程序卸载的时候调用。一般负责关闭某些容器等。 3)doFilter:每次客户端请求都会调用一次。Filter 的所有工作基本都集中在该方法中进行。 4、在web.xml配置 每个过滤器需要配置在 web.xml 中才能生效,一个 Filter 需要配置 <filter> 和 <filter-mapping> 标签 1)<filter></filter> :配置 Filter 名称,实现类以及初始化参数。可以同时配置多个初始化参数 2)<filter-mapping></filter-mapping>:配置什么规则下使用这个 Filter ①、<url-pattern> :配置 url 的规则,可以配置多个,也可以使用通配符(*)。 ②、<dispatcher> :配置到达 servlet 的方式,可以同时配置多个。 有四种取值:REQUEST、FORWARD、ERROR、INCLUDE。如果没有配置,则默认为 REQUEST。它们的区别是: REQUEST :表示仅当直接请求 servlet 时才生效。 FORWARD :表示仅当某servlet 通过 forward 转发到该 servlet时才生效。 INCLUDE :Jsp 中可以通过 <jsp:include/> 请求某 servlet, 只有这种情况才有效。 ERROR :Jsp 中可以通过 <%@page errorPage="error.jsp"%> 指定错误处理页面,仅在这种情况下才生效。 ③、<url-pattern> 和 <dispatcher> 是且的关系, 只有满足 <url-pattern> 的条件,且满足 <dispatcher> 的条件,该 Filter 才能生效。 5、一个 Web程序可以配置多个 Filter ,访问有先后顺序,<filter-mapping>配置在前面的 Filter 执行要早于配置在后面的Filter 。
过滤器 filter 1、Filter(过滤器)用于在 servlet 之外对request 和 response 进行修改。 Filter 有一个 FilterChain 的概念,一个 FilterChain 包括多个 Filter。 客户端请求 request 在抵达 servlet 之前会经过 FilterChain 里面所有的 Filter, 服务器响应 response 从 servlet 抵达客户端浏览器之前也会经过 FilterChain 里面所有的 Filter 2、实现自定义的Filter 需要满足一下条件: 1)实现 javax.servlet.Filter 接口,实现其 init、doFilter、destroy三个方法。 2)实现在 web.xml 中的配置。 3、Filter接口有三个方法:这三个方法反应了 Filter 的生命周期。 1)init:只会在 web 程序加载的时候调用,即启动如 tomcat 等服务器时调用。一般负责加载配置的参数。 2)destroy :web 程序卸载的时候调用。一般负责关闭某些容器等。 3)doFilter:每次客户端请求都会调用一次。Filter 的所有工作基本都集中在该方法中进行。 4、在web.xml配置 每个过滤器需要配置在 web.xml 中才能生效,一个 Filter 需要配置 <filter> 和 <filter-mapping> 标签 1)<filter></filter> :配置 Filter 名称,实现类以及初始化参数。可以同时配置多个初始化参数 2)<filter-mapping></filter-mapping>:配置什么规则下使用这个 Filter ①、<url-pattern> :配置 url 的规则,可以配置多个,也可以使用通配符(*)。 ②、<dispatcher> :配置到达 servlet 的方式,可以同时配置多个。 有四种取值:REQUEST、FORWARD、ERROR、INCLUDE。如果没有配置,则默认为 REQUEST。它们的区别是: REQUEST :表示仅当直接请求 servlet 时才生效。 FORWARD :表示仅当某servlet 通过 forward 转发到该 servlet时才生效。 INCLUDE :Jsp 中可以通过 <jsp:include/> 请求某 servlet, 只有这种情况才有效。 ERROR :Jsp 中可以通过 <%@page errorPage="error.jsp"%> 指定错误处理页面,仅在这种情况下才生效。 ③、<url-pattern> 和 <dispatcher> 是且的关系, 只有满足 <url-pattern> 的条件,且满足 <dispatcher> 的条件,该 Filter 才能生效。 5、一个 Web程序可以配置多个 Filter ,访问有先后顺序,<filter-mapping>配置在前面的 Filter 执行要早于配置在后面的Filter 。
关于JavaJsp 1、Jsp是一种建立在Servlet规范提供的功能之上的动态网页技术,允许在网页文件中嵌入java代码和jsp标记。 Java 服务器页面(Java Server Page ,JSP) ;扩展名.jsp 2、jsp的执行过程 (1)Jsp文件在用户第一次请求时,会被编译成Servlet,然后由这个Servlet处理用户的请求,所以jsp可以看成是运行时的Servlet (2)Jsp容器(也就是Servlet容器)管理jsp页面声明周期分为两个阶段.即转换阶段和执行阶段 (3)当有一个对jsp页面的请求到来时,jsp容器检查jsp页面的语法是否正确,将jsp页面转换为Servlet源文件,然后调用javac命令编译Servlet源文件生成字节码文件.这是转换阶段 (4)Servlet容器加载转换后的Servlet类,这是执行阶段 3、JSP 页面的元素 静态内容 ------------→ HTML、js、css静态文本 指令 ------------→ 以<%@ 开始,以%> 结束 表达式 ------------→<%=Java表达式 %> * 代码块 ------------→ <%Java 代码(变量:_jspService方法的局部变量)%> 声明 ------------→<%! 函数或方法、变量(成员变量) %> * 动作 ------------→以 <jsp: 动作名 开始,以 </jsp:动作名> 结束 注释 ------------→<!--这是注释,但客户端可以查看到 --> <%-- 这也是注释,但客户端不能查看到 --%> * 4、JSP 指令 用来设置与整个 JSP 页面相关的属性。 <%@ page... %> 定义页面的依赖属性,比如脚本语言、error 页面、缓存需求等等 <%@ include... %> 包含其他文件 <%@ taglib... %> 引入标签库的定义,可以是自定义标签 4、jsp的九大内置对象 request HttpServletRequest 类的实例 response HttpServletResponse 类的实例 out PrintWriter 类的实例,用于把结果输出至网页上 session HttpSession 类的实例 application ServletContext 类的实例,与应用上下文有关 config ServletConfig 类的实例 pageContext PageContext 类的实例,提供对 JSP 页面所有对象以及命名空间的访问 page 类似于 Java 类中的 this 关键字 Exception Exception 类的对象,代表发生错误的 JSP 页面中对应的异常对象 JSP 作用域包括 page、request、session 和application 5 EL表达式 EL 为表达式语言(Expression Language),可以简化对变量的对象的访问 语法 :${EL Expression}所有的表达式以”${”开始,以”}”结束。 是否启用EL表达式 isELIgnored="true|false" JSP EL 表达式用于以下情形 静态文本 标准标签和自定义标签 EL不能在脚本元素中使用 脚本元素不是指JavaScript脚本,而是 <% Java 代码 %> JavaScript脚本在jsp中属于静态内容 EL使用”[ ]”和”.”操作符来访问数据 对于连字符(-)或者其它特殊字符的字符串只能用“[ ]”操作符,而不能用“.”操作符,这也是“[ ]”和“.”操作符的区别 如${header["User-Agent"]} EL表达式的操作内容可以是:常量、变量、jsp隐含对像 EL表达式还提供了对操作内容的运算:属性取值、运算、逻辑运算 EL表达式的操作结果会自动输出到输出流对像中 EL 表达式只能通过内置对象取值,也就是只读操作 EL 运算符 (1)、EL 算术运算符 + - * /(div) %(mod) (2)、EL 关系运算符 ==(eq) !=(ne) <(lt) <=(le) >(gt) >=(ge) (3)、EL 逻辑运算符 &&(and) ||(or) !(not) (4)、EL 其他运算符 1) empty 运算符 用来判断值是否为null 或空的 2) 条件运算符 ${ A ? B : C}意思是说,当A 为true 时,执行B;而A 为false 时,则执行C 3) ( ) 括号运算符 用来改变执行优先权,例如:${ A *(B+C) }
关于JavaJsp 1、Jsp是一种建立在Servlet规范提供的功能之上的动态网页技术,允许在网页文件中嵌入java代码和jsp标记。 Java 服务器页面(Java Server Page ,JSP) ;扩展名.jsp 2、jsp的执行过程 (1)Jsp文件在用户第一次请求时,会被编译成Servlet,然后由这个Servlet处理用户的请求,所以jsp可以看成是运行时的Servlet (2)Jsp容器(也就是Servlet容器)管理jsp页面声明周期分为两个阶段.即转换阶段和执行阶段 (3)当有一个对jsp页面的请求到来时,jsp容器检查jsp页面的语法是否正确,将jsp页面转换为Servlet源文件,然后调用javac命令编译Servlet源文件生成字节码文件.这是转换阶段 (4)Servlet容器加载转换后的Servlet类,这是执行阶段 3、JSP 页面的元素 静态内容 ------------→ HTML、js、css静态文本 指令 ------------→ 以<%@ 开始,以%> 结束 表达式 ------------→<%=Java表达式 %> * 代码块 ------------→ <%Java 代码(变量:_jspService方法的局部变量)%> 声明 ------------→<%! 函数或方法、变量(成员变量) %> * 动作 ------------→以 <jsp: 动作名 开始,以 </jsp:动作名> 结束 注释 ------------→<!--这是注释,但客户端可以查看到 --> <%-- 这也是注释,但客户端不能查看到 --%> * 4、JSP 指令 用来设置与整个 JSP 页面相关的属性。 <%@ page... %> 定义页面的依赖属性,比如脚本语言、error 页面、缓存需求等等 <%@ include... %> 包含其他文件 <%@ taglib... %> 引入标签库的定义,可以是自定义标签 4、jsp的九大内置对象 request HttpServletRequest 类的实例 response HttpServletResponse 类的实例 out PrintWriter 类的实例,用于把结果输出至网页上 session HttpSession 类的实例 application ServletContext 类的实例,与应用上下文有关 config ServletConfig 类的实例 pageContext PageContext 类的实例,提供对 JSP 页面所有对象以及命名空间的访问 page 类似于 Java 类中的 this 关键字 Exception Exception 类的对象,代表发生错误的 JSP 页面中对应的异常对象 JSP 作用域包括 page、request、session 和application 5 EL表达式 EL 为表达式语言(Expression Language),可以简化对变量的对象的访问 语法 :${EL Expression}所有的表达式以”${”开始,以”}”结束。 是否启用EL表达式 isELIgnored="true|false" JSP EL 表达式用于以下情形 静态文本 标准标签和自定义标签 EL不能在脚本元素中使用 脚本元素不是指JavaScript脚本,而是 <% Java 代码 %> JavaScript脚本在jsp中属于静态内容 EL使用”[ ]”和”.”操作符来访问数据 对于连字符(-)或者其它特殊字符的字符串只能用“[ ]”操作符,而不能用“.”操作符,这也是“[ ]”和“.”操作符的区别 如${header["User-Agent"]} EL表达式的操作内容可以是:常量、变量、jsp隐含对像 EL表达式还提供了对操作内容的运算:属性取值、运算、逻辑运算 EL表达式的操作结果会自动输出到输出流对像中 EL 表达式只能通过内置对象取值,也就是只读操作 EL 运算符 (1)、EL 算术运算符 + - * /(div) %(mod) (2)、EL 关系运算符 ==(eq) !=(ne) <(lt) <=(le) >(gt) >=(ge) (3)、EL 逻辑运算符 &&(and) ||(or) !(not) (4)、EL 其他运算符 1) empty 运算符 用来判断值是否为null 或空的 2) 条件运算符 ${ A ? B : C}意思是说,当A 为true 时,执行B;而A 为false 时,则执行C 3) ( ) 括号运算符 用来改变执行优先权,例如:${ A *(B+C) }
Javawait()、notify/notifyAll() 1、wait()、notify/notifyAll()方法是Object的final方法,无法被重写。 2、wait()使当前线程阻塞,前提是必须先获得锁,一般配合synchronized关键字使 用,即,一般在synchronized同步代码块里使用wait()、notify/notifyAll()方法。 3、由于wait()、notify/notifyAll()在synchronized代码块执行,说明当前线程一定是获取了锁的。当线程执行wait()方法时候,会释放当前的锁,然后让出CPU,进入等待状态。只有当notify/notifyAll()被执行时候,才会唤醒一个或多个正处于等待状态的线 程,然后继续往下执行,直到执行完synchronized代码块的代码或是中途遇到wait(), 再次释放锁。也就是说,notify/notifyAll()的执行只是唤醒沉睡的线程,而不会立即释 放锁,锁的释放要看代码块的具体执行情况。所以在编程中,尽量在使用了 notify/notifyAll()后立即退出临界区,以唤醒其他线程。 4、wait()需要被try...catch包围。 5、notify和wait的顺序不能错,如果A线程先执行notify方法,B线程在执行wait方法, 那么B线程是无法被唤醒的。 6、notify和notifyAll的区别 notify方法只唤醒一个等待(对象的)线程并使该线程开始执行。所以如果有多个14.6、wait()、notify/notifyAll()} System.out.println(Thread.currentThread().getName() + " 企图调用A实例的two()方法");a.two(); } public synchronized void two() { System.out.println("进入了B类的two()方法"); }} 70 71 72 73 74 75 76 77 78 79 线程等待一个对象,这个方法只会唤醒其中一个线程,选择哪个线程取决于操作 系统对多线程管理的实现。 notifyAll会唤醒所有等待(对象的)线程,尽管哪一个线程将会第一个处理取决于操 作系统的实现。如果当前情况下有多个线程需要被唤醒,推荐使用notifyAll方 法。 public class NotifyDemo { public static void main(String[] args) { final Printer p = new Printer(); new Thread() { public void run() { while (true) { p.printer1(); } } }.start(); newThread() { publicvoid run() { while(true) { p.printer2(); } } }.start(); } } class Printer { private int flag=1;public void printer1() { synchronized (this) { if(flag!=1){ try { //此线程等待 this.wait(); }catch (InterruptedException e) { // TODO Auto‐generated catch blocke.printStackTrace(); } } System.out.print("1");System.out.print("1"); System.out.print("1");System.out.print("1"); System.out.print("1");System.out.print("1"); System.out.print("1");System.out.print("1"); System.out.print("\r\n"); //设置标志为2,唤醒另外一个线程 flag=2; this.notify(); } } publicvoid printer2() { synchronized (this) { if (flag!=2) { try { //此线程等待 this.wait(); } catch (InterruptedException e) { // TODOAuto‐generated catch block e.printStackTrace(); } }System.out.print("2"); System.out.print("2");System.out.print("2"); System.out.print("2");System.out.print("2"); System.out.print("2");System.out.print("2"); System.out.print("2");System.out.print("\r\n"); //设置标志为1,唤醒另外一个线程 flag=1; this.notify(); } } }
Javawait()、notify/notifyAll() 1、wait()、notify/notifyAll()方法是Object的final方法,无法被重写。 2、wait()使当前线程阻塞,前提是必须先获得锁,一般配合synchronized关键字使 用,即,一般在synchronized同步代码块里使用wait()、notify/notifyAll()方法。 3、由于wait()、notify/notifyAll()在synchronized代码块执行,说明当前线程一定是获取了锁的。当线程执行wait()方法时候,会释放当前的锁,然后让出CPU,进入等待状态。只有当notify/notifyAll()被执行时候,才会唤醒一个或多个正处于等待状态的线 程,然后继续往下执行,直到执行完synchronized代码块的代码或是中途遇到wait(), 再次释放锁。也就是说,notify/notifyAll()的执行只是唤醒沉睡的线程,而不会立即释 放锁,锁的释放要看代码块的具体执行情况。所以在编程中,尽量在使用了 notify/notifyAll()后立即退出临界区,以唤醒其他线程。 4、wait()需要被try...catch包围。 5、notify和wait的顺序不能错,如果A线程先执行notify方法,B线程在执行wait方法, 那么B线程是无法被唤醒的。 6、notify和notifyAll的区别 notify方法只唤醒一个等待(对象的)线程并使该线程开始执行。所以如果有多个14.6、wait()、notify/notifyAll()} System.out.println(Thread.currentThread().getName() + " 企图调用A实例的two()方法");a.two(); } public synchronized void two() { System.out.println("进入了B类的two()方法"); }} 70 71 72 73 74 75 76 77 78 79 线程等待一个对象,这个方法只会唤醒其中一个线程,选择哪个线程取决于操作 系统对多线程管理的实现。 notifyAll会唤醒所有等待(对象的)线程,尽管哪一个线程将会第一个处理取决于操 作系统的实现。如果当前情况下有多个线程需要被唤醒,推荐使用notifyAll方 法。 public class NotifyDemo { public static void main(String[] args) { final Printer p = new Printer(); new Thread() { public void run() { while (true) { p.printer1(); } } }.start(); newThread() { publicvoid run() { while(true) { p.printer2(); } } }.start(); } } class Printer { private int flag=1;public void printer1() { synchronized (this) { if(flag!=1){ try { //此线程等待 this.wait(); }catch (InterruptedException e) { // TODO Auto‐generated catch blocke.printStackTrace(); } } System.out.print("1");System.out.print("1"); System.out.print("1");System.out.print("1"); System.out.print("1");System.out.print("1"); System.out.print("1");System.out.print("1"); System.out.print("\r\n"); //设置标志为2,唤醒另外一个线程 flag=2; this.notify(); } } publicvoid printer2() { synchronized (this) { if (flag!=2) { try { //此线程等待 this.wait(); } catch (InterruptedException e) { // TODOAuto‐generated catch block e.printStackTrace(); } }System.out.print("2"); System.out.print("2");System.out.print("2"); System.out.print("2");System.out.print("2"); System.out.print("2");System.out.print("2"); System.out.print("2");System.out.print("\r\n"); //设置标志为1,唤醒另外一个线程 flag=1; this.notify(); } } }
Java的集合 为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组), Java提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器 类,所有的集合类都位于 java.util包下。 集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存 的是对象的引用变量);而集合里只能保存对象(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。 Java的集合类主要由两个接口派生而出: Collection和Map,Collection和Map是Java 集合框架的根接口,这两个接口又包含了一些子接口或实现类。如下所示是 Java集合 简单结构图 1. List集合 List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。 Lst集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引,例如第一次添加的元素索引为0,第二次添加的元 素索引为1… list.add("A"); list.add("B");list.add("C"); list.add("D"); list.add("E");list.add("A");//允许元素重复 2. Set集合 Set集合类似于一个罐子,程序可以依次把多个对象“丢进”Set集合,而Set集合通常不能记住元素的添加顺序。 Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合 中,则添加操作失败,add()方法返回 false,且新元素不会被加入。 set.add("B"); set.add("A");set.add("D"); set.add("C"); set.add("A");set.add("F"); 3. Map集合 Map接口中键和值一一映射. 可以通过键来获取值。 给定一个键和一个值,你可以将该值存储在一个Map对象. 之后,你可以通过键 来访问对应的值。 9.5、Map集合 System.out.println(); // 返回第一个元素,并在队列中删除 System.out.println("‐‐‐‐‐‐poll‐‐‐‐‐‐"); System.out.println("poll="+ queue.poll()); System.out.println(queue); // 返回第一个元素System.out.println("‐‐‐‐‐‐element‐‐‐‐‐‐");System.out.println("element=" + queue.element());System.out.println(queue); // 返回第一个元素System.out.println("‐‐‐‐‐‐peek‐‐‐‐‐‐"); System.out.println("peek="+ queue.peek()); System.out.println(queue); } } 19 20 21 22 23 24 25 26 27 2829 30 31 32 33 34 当访问的值不存在的时候,方法就会抛出一个NoSuchElementException异常. 当对象的类型和Map里元素类型不兼容的时候,就会抛出一个 ClassCastException异常。 当在不允许使用Null对象的Map中使用Null对象,会抛出一个NullPointerException 异常。 当尝试修改一个只读的Map时,会抛出一个UnsupportedOperationException异 常。
Java的集合 为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组), Java提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器 类,所有的集合类都位于 java.util包下。 集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存 的是对象的引用变量);而集合里只能保存对象(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。 Java的集合类主要由两个接口派生而出: Collection和Map,Collection和Map是Java 集合框架的根接口,这两个接口又包含了一些子接口或实现类。如下所示是 Java集合 简单结构图 1. List集合 List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。 Lst集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引,例如第一次添加的元素索引为0,第二次添加的元 素索引为1… list.add("A"); list.add("B");list.add("C"); list.add("D"); list.add("E");list.add("A");//允许元素重复 2. Set集合 Set集合类似于一个罐子,程序可以依次把多个对象“丢进”Set集合,而Set集合通常不能记住元素的添加顺序。 Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合 中,则添加操作失败,add()方法返回 false,且新元素不会被加入。 set.add("B"); set.add("A");set.add("D"); set.add("C"); set.add("A");set.add("F"); 3. Map集合 Map接口中键和值一一映射. 可以通过键来获取值。 给定一个键和一个值,你可以将该值存储在一个Map对象. 之后,你可以通过键 来访问对应的值。 9.5、Map集合 System.out.println(); // 返回第一个元素,并在队列中删除 System.out.println("‐‐‐‐‐‐poll‐‐‐‐‐‐"); System.out.println("poll="+ queue.poll()); System.out.println(queue); // 返回第一个元素System.out.println("‐‐‐‐‐‐element‐‐‐‐‐‐");System.out.println("element=" + queue.element());System.out.println(queue); // 返回第一个元素System.out.println("‐‐‐‐‐‐peek‐‐‐‐‐‐"); System.out.println("peek="+ queue.peek()); System.out.println(queue); } } 19 20 21 22 23 24 25 26 27 2829 30 31 32 33 34 当访问的值不存在的时候,方法就会抛出一个NoSuchElementException异常. 当对象的类型和Map里元素类型不兼容的时候,就会抛出一个 ClassCastException异常。 当在不允许使用Null对象的Map中使用Null对象,会抛出一个NullPointerException 异常。 当尝试修改一个只读的Map时,会抛出一个UnsupportedOperationException异 常。
Java反射机制 1、反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。 2、反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所具有的成员变量和方法; 在运行时调用任意一个对象的方法; 3、get... 和getDeclared....的区别 * getFields() 与 getDeclaredFields() 区别: getFields() 只能访问类中声明为公有的字段, 私有的字段它无法访问,能访问从其它类继承来的公有方法. getDeclaredFields() 能访问类中所有的字段, 与 public,private,protect 无关,不能访问从其它类继承来的方法 * getMethods() 与 getDeclaredMethods() 区别: getMethods() 只能访问类中声明为公有的方法, 私有的方法它无法访问, 能访问从其它类继承来的公有方法. getDeclaredFields() 能访问类中所有的字段, 与 public,private,protect 无关, 不能访问从其它类继承来的方法 * getConstructors() 与 getDeclaredConstructors()区别:getConstructors() getConstructors()只能访问类中声明为 public 的构造函数. getDeclaredConstructors() 能访问类中所有的构造函数, 与public,private,protect 无关
Java反射机制 1、反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。 2、反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所具有的成员变量和方法; 在运行时调用任意一个对象的方法; 3、get... 和getDeclared....的区别 * getFields() 与 getDeclaredFields() 区别: getFields() 只能访问类中声明为公有的字段, 私有的字段它无法访问,能访问从其它类继承来的公有方法. getDeclaredFields() 能访问类中所有的字段, 与 public,private,protect 无关,不能访问从其它类继承来的方法 * getMethods() 与 getDeclaredMethods() 区别: getMethods() 只能访问类中声明为公有的方法, 私有的方法它无法访问, 能访问从其它类继承来的公有方法. getDeclaredFields() 能访问类中所有的字段, 与 public,private,protect 无关, 不能访问从其它类继承来的方法 * getConstructors() 与 getDeclaredConstructors()区别:getConstructors() getConstructors()只能访问类中声明为 public 的构造函数. getDeclaredConstructors() 能访问类中所有的构造函数, 与public,private,protect 无关
Java 面向对象 对象和类的概念 类:类是一个模板,它描述一类对象的行为和状态。对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状 态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。 修饰符 可以为public final abstract 或者不写 类名:大驼峰命名。 构造器 构造器也叫构造方法或者构造函数,构造器与类名相同,没有返回值,连void都不能写; 构造器定义格式: 名称与类名相同,没有返回值,不能写void 如果类中没有手动添加构造器,编译器会默认再添加一个无参构造器如果手动添加了构造器(无论什么形式),默认构造器就会消失 构造器可以重载。 定义类的基本格式: 8、Java 面向对象 8.1、Java中的类 1 [修饰符]class 类名 修饰符 可以为 public final abstract 或者不写 类名:大驼峰命名一、构造器 构造器也叫构造方法或者构造函数,构造器与类名相同,没有返回值,连void都不能写; 构造器定义格式: 名称与类名相同,没有返回值,不能写void 如果类中没有手动添加构造器,编译器会默认再添加一个无参构造器如果手动添加了构造器(无论什么形式),默认构造器就会消失 构造器可以重载。 成员变量 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。[修饰符]type 成员变量名称 [= 默认值]; 修饰符 (public protected private)三选一、 static、final { //零到多个构造器... //零到多个成员变量... //零到多个方法... //零到多个初始化块... } [修饰符] 类名 (形参列表) { //构造器方法体代码 } [修饰符] type 成员变量名称 [= 默认值];2 3 4 5 6 7 1 2 3 4 1 三、方法 Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的。 方法 Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 修饰符 (publicprotected private)三选一、 static、final、synchronize、native。 构造器的重载 /** * Person类 *@author sxj */ public class Person { String name; int age; static int intA; //构造器的重载:形参列表不同 public Person(){ System.out.println("无参构造方法"); this.age=20; this.name="小明";} public Person(int age){ this.age=age; this.name="小明"; System.out.println("有参构造方法1");} public Person(int age,String name){ this(age);//调用另外一个构造方法 this.name=name; System.out.println("有参构造方法2"); } public Person(String name,int age){ this(age,name);System.out.println("有参构造方法3"); } }
Java 面向对象 对象和类的概念 类:类是一个模板,它描述一类对象的行为和状态。对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状 态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。 修饰符 可以为public final abstract 或者不写 类名:大驼峰命名。 构造器 构造器也叫构造方法或者构造函数,构造器与类名相同,没有返回值,连void都不能写; 构造器定义格式: 名称与类名相同,没有返回值,不能写void 如果类中没有手动添加构造器,编译器会默认再添加一个无参构造器如果手动添加了构造器(无论什么形式),默认构造器就会消失 构造器可以重载。 定义类的基本格式: 8、Java 面向对象 8.1、Java中的类 1 [修饰符]class 类名 修饰符 可以为 public final abstract 或者不写 类名:大驼峰命名一、构造器 构造器也叫构造方法或者构造函数,构造器与类名相同,没有返回值,连void都不能写; 构造器定义格式: 名称与类名相同,没有返回值,不能写void 如果类中没有手动添加构造器,编译器会默认再添加一个无参构造器如果手动添加了构造器(无论什么形式),默认构造器就会消失 构造器可以重载。 成员变量 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。[修饰符]type 成员变量名称 [= 默认值]; 修饰符 (public protected private)三选一、 static、final { //零到多个构造器... //零到多个成员变量... //零到多个方法... //零到多个初始化块... } [修饰符] 类名 (形参列表) { //构造器方法体代码 } [修饰符] type 成员变量名称 [= 默认值];2 3 4 5 6 7 1 2 3 4 1 三、方法 Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的。 方法 Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 修饰符 (publicprotected private)三选一、 static、final、synchronize、native。 构造器的重载 /** * Person类 *@author sxj */ public class Person { String name; int age; static int intA; //构造器的重载:形参列表不同 public Person(){ System.out.println("无参构造方法"); this.age=20; this.name="小明";} public Person(int age){ this.age=age; this.name="小明"; System.out.println("有参构造方法1");} public Person(int age,String name){ this(age);//调用另外一个构造方法 this.name=name; System.out.println("有参构造方法2"); } public Person(String name,int age){ this(age,name);System.out.println("有参构造方法3"); } }
正则表达式 正则所需要的命名空间是 usingSystem.Text.RegularExpressions 它包含了8个类,用得最多是的Regex; Regex不仅可以用来创建正则表达式,而且提供了许多有用的方法。   创建一个Regex对象 new Regex(stringpattern) new Regex(stringpattern,RegexOptions options) 第一个参数是个字符串 第二个参数正则配置的选项有以下一些选项 · IgnoreCase 是匹配忽略大小写 默认情况区分大小写 · RightToLeft 从右到左查找字符串 默认是从左到右 · None 设定标志 这是默认选项,就是不设置第2个参数 表示区分大小写从左到右 · MultiLinc 指定了^和$可以匹配行的开头和结尾,也就是说使用了换行分割,每一行能得到不同的匹配 · SingleLine 定特殊字符"."匹配任一字符,换行符除外. 默认情况下特殊字符"."不匹配换行. IgnoreCase的例子 string test = "Abcccccc"; Regex reg = newRegex("abc"); Console.WriteLine(reg.IsMatch(test)); //false Regex reg1 = newRegex("abc",RegexOptions.IgnoreCase); //不区分大小写 Console.WriteLine(reg1.IsMatch(test));//true RightToLeft的例子 string test = "vvv123===456vvv"; Regex reg = newRegex("\\d+");// 123 从左到右 匹配连续数字 Console.WriteLine(reg.Match(test)); Regex reg1 = newRegex("\\d+",RegexOptions.RightToLeft); Console.WriteLine(reg1.Match(test));// 456 从右到左 匹配连续数字 MultiLinc的例子 StringBuilder input = new StringBuilder(); input.AppendLine("A bbbb A"); input.AppendLine("C bbbb C"); stringpattern = @"^\w"; Console.WriteLine(input.ToString()); MatchCollection matchCol =Regex.Matches(input.ToString(), pattern, RegexOptions.Multiline); foreach(Match item in matchCol) { Console.WriteLine("结果:{0}",item.Value); } IsMatch() 可以用来测试字符串,看他是否匹配正则表达式的模式.如果发现了一次匹配,就返回True.IsMatch有个静态方法重载 Regex.IsMatch(string str,string pattern); string str ="abcbbbbbbbb"; string reg =@"^abc"; Console.WriteLine(Regex.IsMatch(str,reg));//静态的重载方法 Regex pattern = new Regex("^abc"); Console.WriteLine(pattern.IsMatch(str)); //生成对象上的方法 Replace() 替换字符串一个匹配的模式,也有一个静态的重载方法,replace变体方法很多,我只记录我看到的 replace(string input ,string pattern,intcount,int start) 第3个参数是总共替换几个,第4分参数是从字符串的什么位置开始替换 string str ="123456abc"; Regex pattern = new Regex(@"\d+"); Console.WriteLine(pattern.Replace(str,"6666")); stringpattern1 = @"\d+"; Console.WriteLine(Regex.Replace(str,pattern1,"6666")); string str1= "asd,sss,asd,asdf,jjjj,cccc"; Regex pattern2 = new Regex(@"\w+"); Console.WriteLine(pattern2.Replace(str1, "v5v5", 2)); Console.WriteLine(pattern2.Replace(str1, "v5v5", 2,8)); Match() 获得匹配的内容(只是一次的 MatchCollection可以获得所有的的匹配的集合) 生成的对象上的方法 的用法 reg.Match(stringinput,int start,int length) 第一个参数是要处理的字符串 第二哥参数开始的位置 第3个参数是需要匹配的长度。第2第3个参数可以不需要 静态方法 Regex.Match(string input , string pattern,RegexOptions options) 第3个参数可以不要 string str ="vchaha vcoo vclielie vbguale vfggvckk"; Regex pattern = new Regex(@"vc\w*"); Match matchMode =pattern.Match(str); while(matchMode.Success) { Console.WriteLine(matchMode.Value); matchMode = matchMode.NextMatch(); } Console.WriteLine("-----------------------------------"); Match matchMode1 = Regex.Match(str,@"vc\w*"); while(matchMode1.Success) { Console.WriteLine(matchMode1.Value); matchMode1 =matchMode1.NextMatch(); } Match类的一些方法 · NextMatch 返回下一个成功匹配的match对象 · Result · Value 返回匹配的字符串 · Length 匹配的长度 · Index 第一个匹配内容在字符串中的起始位置 · Groups 返回一个分组对象集合 · Success 根据是否匹配成功返回ture or false MatchCollection() Regex.Matchs会返回MatchCollection类,这个集合包含了所有的Match的集合 string input= "hahaha 123xiaodi 55nihao66chifanlema ccc333 ccc"; Regex pattern = new Regex(@"\d+[a-z]+",RegexOptions.IgnoreCase); MatchCollection matchsMade =pattern.Matches(input); foreach(Match item in matchsMade) { Console.WriteLine(item.Value); }
正则表达式 正则所需要的命名空间是 usingSystem.Text.RegularExpressions 它包含了8个类,用得最多是的Regex; Regex不仅可以用来创建正则表达式,而且提供了许多有用的方法。   创建一个Regex对象 new Regex(stringpattern) new Regex(stringpattern,RegexOptions options) 第一个参数是个字符串 第二个参数正则配置的选项有以下一些选项 · IgnoreCase 是匹配忽略大小写 默认情况区分大小写 · RightToLeft 从右到左查找字符串 默认是从左到右 · None 设定标志 这是默认选项,就是不设置第2个参数 表示区分大小写从左到右 · MultiLinc 指定了^和$可以匹配行的开头和结尾,也就是说使用了换行分割,每一行能得到不同的匹配 · SingleLine 定特殊字符"."匹配任一字符,换行符除外. 默认情况下特殊字符"."不匹配换行. IgnoreCase的例子 string test = "Abcccccc"; Regex reg = newRegex("abc"); Console.WriteLine(reg.IsMatch(test)); //false Regex reg1 = newRegex("abc",RegexOptions.IgnoreCase); //不区分大小写 Console.WriteLine(reg1.IsMatch(test));//true RightToLeft的例子 string test = "vvv123===456vvv"; Regex reg = newRegex("\\d+");// 123 从左到右 匹配连续数字 Console.WriteLine(reg.Match(test)); Regex reg1 = newRegex("\\d+",RegexOptions.RightToLeft); Console.WriteLine(reg1.Match(test));// 456 从右到左 匹配连续数字 MultiLinc的例子 StringBuilder input = new StringBuilder(); input.AppendLine("A bbbb A"); input.AppendLine("C bbbb C"); stringpattern = @"^\w"; Console.WriteLine(input.ToString()); MatchCollection matchCol =Regex.Matches(input.ToString(), pattern, RegexOptions.Multiline); foreach(Match item in matchCol) { Console.WriteLine("结果:{0}",item.Value); } IsMatch() 可以用来测试字符串,看他是否匹配正则表达式的模式.如果发现了一次匹配,就返回True.IsMatch有个静态方法重载 Regex.IsMatch(string str,string pattern); string str ="abcbbbbbbbb"; string reg =@"^abc"; Console.WriteLine(Regex.IsMatch(str,reg));//静态的重载方法 Regex pattern = new Regex("^abc"); Console.WriteLine(pattern.IsMatch(str)); //生成对象上的方法 Replace() 替换字符串一个匹配的模式,也有一个静态的重载方法,replace变体方法很多,我只记录我看到的 replace(string input ,string pattern,intcount,int start) 第3个参数是总共替换几个,第4分参数是从字符串的什么位置开始替换 string str ="123456abc"; Regex pattern = new Regex(@"\d+"); Console.WriteLine(pattern.Replace(str,"6666")); stringpattern1 = @"\d+"; Console.WriteLine(Regex.Replace(str,pattern1,"6666")); string str1= "asd,sss,asd,asdf,jjjj,cccc"; Regex pattern2 = new Regex(@"\w+"); Console.WriteLine(pattern2.Replace(str1, "v5v5", 2)); Console.WriteLine(pattern2.Replace(str1, "v5v5", 2,8)); Match() 获得匹配的内容(只是一次的 MatchCollection可以获得所有的的匹配的集合) 生成的对象上的方法 的用法 reg.Match(stringinput,int start,int length) 第一个参数是要处理的字符串 第二哥参数开始的位置 第3个参数是需要匹配的长度。第2第3个参数可以不需要 静态方法 Regex.Match(string input , string pattern,RegexOptions options) 第3个参数可以不要 string str ="vchaha vcoo vclielie vbguale vfggvckk"; Regex pattern = new Regex(@"vc\w*"); Match matchMode =pattern.Match(str); while(matchMode.Success) { Console.WriteLine(matchMode.Value); matchMode = matchMode.NextMatch(); } Console.WriteLine("-----------------------------------"); Match matchMode1 = Regex.Match(str,@"vc\w*"); while(matchMode1.Success) { Console.WriteLine(matchMode1.Value); matchMode1 =matchMode1.NextMatch(); } Match类的一些方法 · NextMatch 返回下一个成功匹配的match对象 · Result · Value 返回匹配的字符串 · Length 匹配的长度 · Index 第一个匹配内容在字符串中的起始位置 · Groups 返回一个分组对象集合 · Success 根据是否匹配成功返回ture or false MatchCollection() Regex.Matchs会返回MatchCollection类,这个集合包含了所有的Match的集合 string input= "hahaha 123xiaodi 55nihao66chifanlema ccc333 ccc"; Regex pattern = new Regex(@"\d+[a-z]+",RegexOptions.IgnoreCase); MatchCollection matchsMade =pattern.Matches(input); foreach(Match item in matchsMade) { Console.WriteLine(item.Value); }
1 下一页