String类、字符串缓冲区、正则表达式、
1、String类
(1)概述:
String类代表字符串,字符串是常量,创建之后不能更改,一旦这个字符串确定了,就会在内存中(堆中的常量池)生成这个字符串,字符串本身不能改变,但变量的地址是能够改变的,字符串的本质是一个字符的数组。
(2)字符串的构建
字符串中有大量的的重载构造方法,通过String类的构造方法可以完成字符穿的构建,还可以通过双引号的方式进行创建对象
两者的是否相同?
package com.oracle.demo02; public class Demo02 { public static void main(String[] args) { String str1="aaabbb"; String str2=new String("aaabbb"); System.out.println(str1==str2); System.out.println(str1.equals(str2)); } }
str1创建在内存中只有一个对象
str2创建在内存中有两个对象,一个 new的对象在堆中,一个字符串本身对象,在字符串常量池中
(3)String构造方法
-------------------String()初始化一个新创建的String对象,表示一个空字符序列
例如:String s1 = new String(); //创建String对象,字符串中没有内容
------------------- String(byte[ ] bytes)通过平台使用的默认字符解码指定byte数组,构建新的String
例如:byte[] bys = new byte[]{97,98,99,100};
String s2 = new String(bys);
--------------------String(byte[ ] bytes int offset ,int length )通过平台使用的默认字符解码指定byte子数组,构建新的String
例如:String s3 = new String(bys, 1, 3); //创建String对象,把一部分数组元素作为字符串的内容,参数offset为数组元素的起始索引位置,参数length为要几个元素
--------------------String(char[ ] values) 分配一个新的 String
,使其表示字符数组参数中当前包含的字符序列。
例如:
char[] chs = new char[]{’a’,’b’,’c’,’d’,’e’};
String s4 = new String(chs); //创建String对象,把数组元素作为字符串的内容
--------------------String(char[] value, int offset, int count)
分配一个新的 String
,它包含取自字符数组参数一个子数组的字符。
例如:
String s5 = new String(chs, 0, 3);//创建String对象,把一部分数组元素作为字符串的内容,参数offset为数组元素的起始索引位置,参数count为要几个元素
(4)String类的方法查找
---------------length()返回字符串的长度
String aaa="abcdefgrthajnsdjkcv"; int b=aaa.length(); System.out.println(b);
----------------------获取部分字符串substring(int beginindex)或者substring(int beginIndex , int endIndex)
---------------------判断是否以xxx为开头starsWith(xxx)返回值为true或false
----------------------判断是否以xxx为结尾endsWith(xxx)返回值为true或false
----------------------判断字符串是否包含另一个字符contains( char s)判断是否包含指定字符串,包含返回true,不包含返回false
String str = "abcde"; int index = str.indexOf(“bcd”); //判断是否包含指定字符串,包含则返回第一次出现该字符串的索引,不包含则返回-1 boolean b2 = str.contains("bcd");//判断是否包含指定字符串,包含返回true,不包含返回false
----------------------- 将字符串转成一个字符数组。或者字节数组。.getBytes()转换成一个数组。toCharArray()转换成一个字符数组
String str = "abcde"; char[] chs = str.toCharArray(); byte[] bytes = str.getBytes();
-------------------------- 判断两个字符串中的内容是否相同equals()
--------------------------判断两个String是否相等,不考虑大小equalsIgnoreCase()
String str = "abcde"; String str2 = "abcde"; String str3 = "hello"; boolean b1 = str.equals(str2); boolean b2 = str.e/quals(str3);
---------------------------------获取该字符串的内容toString()
public class Demo02 { public static void main(String[] args) { String str = new String("hello"); System.out.println( str.toString() ); System.out.println(str); } }
还有:
l 判断该字符串的内容是否为空的字符串
l 获取给定的字符,在该字符串中第一次出现的位置
l 获取该字符串中指定位置上的字符
l 把该字符串转换成 小写字符串
l 把该字符串转换成 大写字符串
l 在该字符串中,将给定的旧字符,用新字符替换
l 在该字符串中, 将给定的旧字符串,用新字符串替换
l 去除字符串两端空格,中间的不会去除,返回一个新字符串
public class Demo03 { public static void main(String[] args) { String str="hellojavanihaojava.txt"; //求字符串长度 System.out.println(str.length()); //截取字符串 System.out.println(str.substring(3)); System.out.println(str.substring(3,5)); //判断前缀 System.out.println(str.startsWith("b")); //判断结尾 System.out.println(str.endsWith(".txt")); //判断一个字符串中是否包含另一个字符串 System.out.println(str.contains("java")); //返回一个字符串在另一个字符串中第一次出现的索引值 //如果不存在该字符串则返回-1 System.out.println(str.indexOf("5")); String str1="nihaojava"; //将字符串转为字节数组 byte[] b1=str1.getBytes(); for(int i=0;i<b1.length;i++){ System.out.print(b1[i]+" "); } //将字符串转为字符数组 char[] c1=str1.toCharArray(); for(int j=0;j<c1.length;j++){ System.out.print(c1[j]+" "); } //判断两个字符串是否内容相同(忽略大小写) System.out.println(str1.equalsIgnoreCase("NiHaojava")); } }
String类方法使用练习
题目一:获取指定字符串中,大写字母、小写字母、数字的个数。
package demo01; public class Demo03 { public static void main(String[] args) { String str="ADSFGbaersg1123125337"; int bigCount = 0; //大写字母的个数 int smallCount = 0; //小写字母的个数 int numberCount = 0; //数字的个数 for (int i=0; i < str.length(); i++) { char ch = str.charAt(i); //获取指定位置上的字符 if (ch>='A' && ch<='Z') { bigCount++; } else if (ch>='a' && ch<='z') { smallCount++; } else if (ch>='0' && ch<='9') { numberCount++; } } System.out.println("大写字母个数:"+bigCount); System.out.println("小写字母个数:"+smallCount); System.out.println("数字个数:"+numberCount); } }
l 题目二:将字符串中,第一个字母转换成大写,其他字母转换成小写,并打印改变后的字符串。
package demo01; public class Demo04 { public static void main(String[] args) { String str="aA"; //获取第一部分为字符串 String start = str.substring(0,1); //获取第二部分为字符串 String end = str.substring(1); //把第一部分字符串转换成大写字母,把第二部分字符串转换成小写字母 String big = start.toUpperCase(); String small = end.toLowerCase(); //把两部分字符串连接在一起,得到一个完整的字符串 System.out.println(big+small); } }
l 题目三:查询大字符串中,出现指定小字符串的次数。如“hellojava,nihaojava,javazhenbang”中查询出现“java”的次数。
public static int getCount(String big, String small){ int count = 0; //出现小串的次数 int index = -1;//出现小串的位置 /* while的循环条件三步骤: 步骤一. big.indexOf(small) 获取小串在大串中出现的位置 步骤二. 把小串出现的位置,赋值给变量index 步骤三. 判断出现的位置是否为-1, 如果位置等于-1,说明大串中已经查询不到小串了;如果位置不等于-1,那么,进行循环,完成次数累加与修改大串的操作 */ while ((index = big.indexOf(small)) != -1 ){ count++;//出现次数+1 //更改大串内容 big = big.substring(index+1); } return count; }
练习2
用代码演示String类中的以下方法的用法
(1)boolean isEmpty(): 判断字符串是不是空串,如果是空的就返回true
(2)char charAt(int index): 返回索引上的字符
(3)String toLowerCase(): 字符串转成小写
(4)String toUpperCase(): 字符串转成大写
(5)String replace(char oldChar, char newChar): 将字符串中的老字符,替换为新字符
(6)String repalce(String old, String newstr): 将字符串中的老字符串,替换为新字符串
(7)String trim(): 去掉字符串两端空格
public static void main(String[] args) { //(1)boolean isEmpty(): 判断字符串是不是空串,如果是空的就返回true String str1=new String(); boolean a=str1.isEmpty(); System.out.println(a); //(2)char charAt(int index): 返回索引上的字符 String str2="abcde"; char b=str2.charAt(2); System.out.println(b); //(3)String toLowerCase(): 字符串转成小写 String str3="ABCDEFG"; String c=str3.toLowerCase(); System.out.println(c); //(4)String toUpperCase(): 字符串转成大写 System.out.println(c.toUpperCase()); //(5)String repalce(char oldChar, char newChar): 将字符串中的老字符,替换为新字符 String str4="abc"; String d=c.replace("b","s"); System.out.println(d); //(6)String repalce(String old, String newstr): 将字符串中的老字符串,替换为新字符串 String e=d.replace(d, "falg"); System.out.println(e); //(7)String trim(): 去掉字符串两端空格 String str5=" ffff "; System.out.println(str5); String f=str5.trim(); System.out.println(f); }//main }/
2、字符串缓冲区
字符串缓冲区支持可变的字符串,
StringBuffer又称为可变字符序列,它是一个类似于 String 的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容。
(1)StringBuffer类
StringBuffer方法的使用:
-----------------append():将指定字符串添加到此字符序列
----------------delete(int start,int end)删除从start到end的字符
-----------------insert(int offset ,String str)将str插入该字符串中
-----------------replace(int start ,int end .String str)使用str替换该字符串中从start到end的字符
-----------------reverse()将字符串使用反序取代
-----------------toString()返回此序列中数据的字符串表现形式
创建一个字符串缓冲区对象。用于存储数据。 StringBuffer sb = new StringBuffer(); sb.append("haha"); //添加字符串 sb.insert(2, "it");//在指定位置插入 sb.delete(1, 4);//删除 sb.replace(1, 4, "cast");//替换指定范围内的内容 String str = sb.toString();
练习:int[] arr = {34,12,89,68};将一个int[]中元素转成字符串 格式 [34,12,89,68]
public static String toString_2(int[] arr) { StringBuffer sb = new StringBuffer(); sb.append("["); for (int i = 0; i < arr.length; i++) { if(i!=arr.length-1){ sb.append(arr[i]+","); }else{ sb.append(arr[i]+"]"); } } return sb.toString(); }
StringBuilder类它也是一个可变的字符序列它比 StringBuffer 要快。
3、正则表达式
正则表达式在项目中使用的地方是在注册时,看看注册的名字,邮箱,电话等符不符合具体的规则
正则表达式是一个字符串,使用单个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。
在Pattern类中有正则表达式的的规则定义,正则表达式中明确区分大小写字母
举例:校验qq号码. 1: 要求必须是5-15位数字 2: 0不能开头 代码演示: String qq = "604154942"; String regex = "[1-9][0-9]{4,14}"; boolean flag2 = qq.matches(regex);
举例:校验手机号码 1:要求为11位数字 2:第1位为1,第2位为3、4、5、7、8中的一个,后面9位为0到9之间的任意数字。 代码演示: String phone = "18800022116"; String regex = "1[34578][0-9]{9}"; boolean flag = phone.matches(regex);
匹配合法的邮箱 匹配规则: ”[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(\\.[a-zA-Z_0-9]+)+” ”\\w+@\\w+(\\.\\w+)+”
获取IP地址(192.168.1.100)中的每段数字
匹配规则:
”\\.”