装箱和拆箱详解 正则

int和integer有什么区别

区别1:类型不同

Integer是int的包装类;
int是基本数据类型;

区别2:实例化引用不同

Integer变量必须实例化后才能使用;
int变量不需要;

区别3:存储位置不同

Integer是对象的引用,指向此new的Integer对象;
int是直接存储数据值

区别4:存储默认值不同

Integer的默认值是null;int的默认值是0。

int和integer的转换成为封箱和拆箱;

装箱:

就是将一个基本数据类型转换为包装类的过程。

比如:int转换为Integer

int i=333;
Integer I=Integer.valueOf(i);

装箱又分为手动装箱和自动装箱

手动装箱需要调用包装类valueOf()方法,返回的是对象。
自动装箱是对.valueOf()的隐藏式调用,Java虚拟机自动转换;

例如:

Integer I=10;
Character Ch=‘b’;

拆箱:

就是将一个包装类转换成基本数据类型的过程;

比如:将Integer转换为int类型

Integer In=10;
int a=In.intValue();

拆箱分为自动拆箱和手动拆箱

booleanValue() Boolean转为boolean
bytevalue() Byte 转为 byte
shortValue() Short转为 short
intValue() Integer转为int
longValue() Long转为long
floatValue() Float转为float
doubleValue() Double转为double
charValue() Character转为char

手动拆箱:就是显示的调用拆箱方法

比如:

Boolean a=new Boolean(false);
boolean a1=a.booleanValue();

自动拆箱:隐式调用拆箱方法
比如:

Integer j=10;
int i=j++;

正则表达式详解 切割

正则表达式是一种用于模式匹配和替换的规范;
比如正则表达式:

^[1-9]\d{5}$ 表示QQ号码

一个正则表达式就是由字符以及特殊字符组成的文字模式;

功能:

对字符串进行查找、提取、分割、替换等工作

在java中定义的任何一个字符串都可以作为正则表达式使用

判断字符串是否匹配正则表达式的方式

  • 方式一

1 将一个字符串编译成Pattern对象。


Pattern p = Pattern.compile(正则表达式);

2 使用Pattern对象创建Matcher对象

Matcher m = p.matcher(要匹配的字符串);

3 调用Matcher类的matches()方法

m.matches() 返回true表示匹配,返回false表示不匹配。
  • 方式二

使用Pattern下的静态方法 matches()。

Pattern.matches(正则,字符串)

示例代码

String regex = "abc";
String str = "abc";
System.out.println(Pattern.matches(regex, str));
  • 方式三

String类下提供了直接匹配的方法。

str.matches(正则)

正则表达式常用符号

  • 预定义字符类
.任何字符(与行结束符可能匹配也可能不匹配)
\d数字:[0-9]
\D非数字: [^0-9]
\s空白字符:[ \t\n\x0B\f\r]
\S非空白字符:[^\s]
\w单词字符:[a-zA-Z_0-9]
\W非单词字符:[^\w]
  • Greedy 数量词
X?X,一次或一次也没有
X*X,零次或多次
X+X,一次或多次
X{n}X,恰好n次
X{n,}X,至少n次
X{n,m}X,至少n次,但是不超过m次
正则的匹配功能
需求:校验QQ号,要求:必须是5~15位数字,0不能开头。
  • 没有正则表达式之前
 public static void checkQQ(String qq){
		int len = qq.length();
		if(len>=5 && len <=15){
			if(!qq.startsWith("0")){
				try{
					long l = Long.parseLong(qq);
					System.out.println("qq:"+l);
				}		
				catch (NumberFormatException e){
					System.out.println("出现非法字符");
				}
			}
			else
				System.out.println("不可以0开头");
		}
		else
			System.out.println("QQ号长度错误");
	}
  • 使用正则表达式
public static void checkQQ2(){                                     
    String qq = "12345";              
    String reg = "[1-9][0-9]{4,14}";  
    boolean b = qq.matches(reg);      
    System.out.println("b="+b);                                 
} 

####正则的切割功能

需求1:根据空格对一段字符串进行切割。
public static void testSplit(){                                                                                           
    String str = "-1     99    4    23";                           
    String[] arr = str.split(" +");                         
    for(String s : arr){                                                       
        System.out.println(s);                              
    }                                                       
} 
需求2:根据重叠词进行切割
public static void testSplit2(){                                      
    String str = "adqqfgkkkhjppppcat";
    String[] arr = str.split("(.)\\1+");
    for(String s : arr){                                  
        System.out.println(s);         
    }                                                                     
} 
  • 范围表示
[abc]a、b 或 c(简单类)
[^abc]任何字符,除了 a、b 或 c(否定)
[a-zA-Z]a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]]a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]]d、e 或 f(交集)
[a-z&&[^bc]]a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]]a到z,而非m到p

单词边界 \b
\b 表示单词边界,除了 \w 中的字符外的其他字符都可以作为单词边界。

例如: “hi.*” 和 “high” 匹配

		"ahi.*" 和  "ahigh" 匹配

	 	"a.hi.*"和  "axhigh" 匹配

		但 "a.\\bhi.*" 和  "axhigh" 不匹配  为什么?

因为**\b**表示单词的边界 空格把 a 和high分成了两个单词 也就是说 high是另一个单词的开始处在边界上,所以就匹配。而x不会把a和high分成两个单词。

正则表达式分组

使用分组解决重复的多个字符;
使用分组:在正则表达式中,使用()来表示分组

所谓分组就是使用小括号将一些项包括起来,使其成为独立的逻辑域,那么就可以像处理一个独立单元一样去处理小括号的内容。

这种分组叫做捕获组,或者叫做反向引用
捕获组指的就是使用**\\组号** 来表示引用前面哪一组中的内容。

比如:

String regex = “((a)(b©))”;
//如何确定分组
//查看向左的括号即可
//第一组:((a)(b©))
//第二组:(a)
//第三组:(b©)
//第四组:©

正则的匹配功能
需求:校验QQ号,要求:必须是5~15位数字,0不能开头。
  • 没有正则表达式之前
 public static void checkQQ(String qq){
		int len = qq.length();
		if(len>=5 && len <=15){
			if(!qq.startsWith("0")){
				try{
					long l = Long.parseLong(qq);
					System.out.println("qq:"+l);
				}		
				catch (NumberFormatException e){
					System.out.println("出现非法字符");
				}
			}
			else
				System.out.println("不可以0开头");
		}
		else
			System.out.println("QQ号长度错误");
	}
  • 使用正则表达式
public static void checkQQ2(){                                     
    String qq = "12345";              
    String reg = "[1-9][0-9]{4,14}";  
    boolean b = qq.matches(reg);      
    System.out.println("b="+b);                                 
} 

正则的切割功能
需求1:根据空格对一段字符串进行切割。
public static void testSplit(){                                                                                           
    String str = "-1     99    4    23";                           
    String[] arr = str.split(" +");                         
    for(String s : arr){                                                       
        System.out.println(s);                              
    }                                                       
} 
需求2:根据重叠词进行切割
public static void testSplit2(){                                      
    String str = "adqqfgkkkhjppppcat";
    String[] arr = str.split("(.)\\1+");
    for(String s : arr){                                  
        System.out.println(s);         
    }                                                                     
} 
正则的替换功能
String类的replaceAll方法

示例代码

public class Demo13_替换功能 {

    public static void main(String[] args) {
        String str = "www.baidu.com";
        String str2 = str.replace("w", "x");
        System.out.println(str2);//xww.baidu.com

        String str3 = str.replaceAll("w","x");
        System.out.println(str3);//xxx.baidu.com

        String str4 = str.replaceAll(".", "x");
        System.out.println(str4);//wwwxbaiduxcom

        String str5 = str.replaceAll("[a-z]", "x");
        System.out.println(str5);//xxx.xxxxx.xxx
    }
}
需求1:替换电话号码为 ******
String str = "联系我:18610637606联系我:13510637606联系我:13810637606联系我:18610637606联系我:17610637606联系我:18910637606";

示例代码

String str = "联系我:18610637606联系我:13510637606联系我:13810637606联系我:18610637606联系我:17610637606联系我:18910637606";

String reg = "(\\d{3})(\\d{4})(\\d{4})";

String x = str.replaceAll(reg, "$1****$3");
System.out.println(x);
需求2: 
String str = “我我我我我我要要要要要要要要要要努努努努努努努力力力力力力”;
// 还原成 “我要努力”

示例代码

public static void main(String[] args) {

    String str = "我我我要要要要放放放放放放假假假假假假";   // "我要放假"
    String regex = "(.)\\1+";
    str = str.replaceAll(regex, "$1");  // $1在正则表达式外取某组中的内容
    System.out.println(str);
}

1.2正则的获取功能(查找子串)

查找子串同样要由 Pattern 和 Matcher 来完成。

Matcher 下的常用方法 :

  • find() 是否包含匹配正则的子串
  • group() 取出子串
需求:查找字符串中所有四个长度的子串

示例代码

public class Demo1{

    public static void main(String[] args) {
        String str = "aaa  abcd     axss  xssdf"; // 找到所有4个长度的子串
        String regex = "\\b[a-zA-Z]{4}\\b";

        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(str);
        while(m.find()){
            System.out.println(m.group());
        }
    }
}

正则转换

contains API源码

 public boolean contains(Object o) {
        Iterator<E> it = iterator();
        if (o==null) {
            while (it.hasNext())
                if (it.next()==null)
                    return true;
        } else {
            while (it.hasNext())
                if (o.equals(it.next()))
                    return true;
        }
        return false;
    }

split 方法

将一个字符串分割为子字符串,然后将结果作为字符串数组返回

string类的substring()方法

方法简介:

public String substring(int beginIndex)
beginIndex - 起始索引(包括)。

返回一个新的字符串,它是此字符串的一个子字符串。该子字符串从指定索引处的字符开始,直到此字符串末尾。

示例:

“unhappy”.substring(2) returns “happy”
“Harbison”.substring(3) returns “bison”
“emptiness”.substring(9) returns “” (an empty string)

第二种

public String substring(int beginIndex,
int endIndex)

示例:

“hamburger”.substring(4, 8) returns “urge”

smiles".substring(1, 5) returns “mile”
返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex。
示例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值