第一章 String & StringBuilder
String类用类final修饰,不能被继承,String字符串被创建后永远无法被改变,但字符串引用可以重新赋值,改变引用的指向
java字符串中任何一个字符对应16位(2个字节)的定长Unicode编码;
java为了提高性能,静态字符串(字面量、常量、常量连接的结果)在常量池中创建,并尽量使用同一个对象,重用静态字符串
对于重复出现的字符串直接量,JVM会首先在常量池中查找,如果存在则返回该对象;
*str.length();获取字符串中的字符的个数;
*int str.indexOF(String str)//在字符串中检测str第一次出现的位置,返回int型下标值,找不到返回-1值
*int indexOf(String str,int fromIndex)//从字符串的fromIndex位置开始检索str第一次出现的位置,返回下标
*int lastIndexOf(String str,int from)//str在字符串中最后一次出现的位置
面试题:
String str ="java,我爱java,我热爱java,我非常热爱java";
//问:子字符串java出现的次数
int index=0;//java出现的下标 int count=0;//java出现的次数 while((index=str.indexOf("java",index))!=-1){ System.out.println("index="+index); count++; index+="java".length(); } System.out.println(count);
*String substring(int beginIndex)//截取从指定下标开始到字符串结尾结束的子字符串,返回值为String类型
*String substring(int beginIndex,int endIndex);//截取从指定下标开始到指定下标结束的子字符串,返回值为String类型
(java中很多方法经常出现两个临界值,通常都是包头不包尾)
【例】
//截取第一个逗号到最后一个逗号之间的字符串
int beginIndex=str.indexOf(","); int endIndex=str.lastIndexOf(","); String sub = str.substring(beginIndex+1, endIndex); System.out.println(sub);
注意:java字符串中:中文输入法的","和英文输入法的","是不同的,写串了可导致查询结果为-1(即查询不到)
*str.trim();//去掉字符串str开头和结尾处的空白字符格
*char charAt(int index);//返回指定下标处的char字符
*str.startsWith(String prefix);//判断str字符串是否以指定前缀prefix开头,返回boolean型判断结果
*str.endsWith(String suffix);//判断str字符串是否以指定后缀suffix结尾,返回boolean型判断结果
StringBuilder字符串生成器
StringBuilder sub = new StringBuilder();//初始可放16个字符
* .append(String str);用于实现大量字符串拼接
* .insert(int offset,String str),在指定位置插入指定内容
* .delete(int start,int end);删除指定位置开始到指定位置结束之间的字符串
* .reverse(String str);完成字符串的反转
-------------------------------------------------------------------------------
第二章 Regex正则表达式 & Object类 & 包装类
RegularExpression正则表达式
定义:一串特定字符组成的“规则字符串”,用于描述/记录文本规则。
意义:方便实现对字符串进行匹配、查找、替换等复杂操作。
1)字符集合:
[abc] :a,b,c中的任何一个
[^abc] :除了a,b,c的任意字符
[a-z] :a到z中的任意一个字符
[a-zA-Z0-9] :a到zA到Z0~9中任意一个字符
[a-z&&[^bc]]:a到z除了b和c以外的任意一个字符,&&表示与的关系;
2)预定义字符集
. :任意一个字符
d :任意一个数字字符,相当于[0-9];
D :非数字字符,相当于[^0-9];
w :单词字符,相当于[a-zA-Z_0-9];
W :非单词字符
s :空白字符
S :非空白字符
3)数量词
X? :表示0个或1个
X* :表示0个或任意多个
X+ :表示1到任意多个
X{n} :表示n个X
X{n,m} :表示n到m个X
4)分组(),将一系列正则表达式看作一个整体,可以使用|表示或的关系
字符转义
^ $ :边界匹配,^变是字符串开始,$表示字符串结束
String正则API
1)str.matches(regex):
将一个字符串与正则表达式进行匹配,匹配成功返回true,否则返回false
* 用户输入一个字符串,对此字符串进行校验
* 必须满足第一个字符是abc的任意一个字符
* 第二个字符是任意数字
Scanner sc=new Scanner(System.in); boolean flag; do { System.out.println("请输入用户名,以a/b/c开头,包含数字"); String str =sc.next(); String regex="[abc][0-9]{2,8}"; flag = str.matches(regex); if(flag==false) {System.out.println("输入错误,请重新输入:") }else {System.out.println("正确:");} }while(flag==false);
str.matches(regex)默认自带^$,在匹配时一定是String.matches(regex)
判断email格式是否合法:
String regex1 ="^[a-zA-Z0-9_.-]+@([a-zA-Z0-9]+\.)+[a-zA-Z]{2,4}$";
2)str.split(String regex);返回值为字符串数组
String [] s = email.split("[_@\.]");
System.out.println(Arrays.toString(s));
//[mr, w123, baidu, com, cn]
3)replaceAll(String regex,String replacement)
//将字符串中符合正则表达式regex规则的字符串替换成replacement
String s2="中国,没有国中之国";
String s3=s2.replaceAll("中国","*");
System.out.println(s3);
//*,没有国中之国
Object(鼻祖类)
如果定义一个Java类时没有使用extends关键字声明其父类,则其父类默认为:java.lang.Object类
Object类型的引用变量可以指向任何类型对象。
1)toString()重写
* Object类中的toString()默认返回一个对象的字符串表示,
* 而这个字符串在实际开始中没有什么具体意义,通常强烈建议
* 在子类中重写toString()使其具有具体的意义
* 重写规则:通常此方法将对象的属性值作为字符串返回
/*
* 在内存中,point是引用,保存的对象的地址值
* 打印输出引用时会调用该类的toString(),如果该类没有
* 那么,调用父类中的toString()
* Object类中的toString()作用:返回一个表示该对象的字符串
* 字符串形式:类名@散列码(十六进制的整数)
* 散列码是根据地址值经过算法计算得出的一个整数
*/
Point point = new Point(10, 20);
System.out.println(point); //此对象表示的点的坐标
2)equals()重写
* Object类中的equals()方法作用等同于==
* 用于比较两个引用是否指向同一个对象
* 在实际开发中,通常建议根据实际业务重写equals方法,使得
* 对象之间的比较更具有实际意义。
* javaAPI中的很多类已经重写了equals(),如String
包装类
在进行类型转换的范畴内,有一种特殊的转换,需要将int这样的基本类型转换为对象;
所有基本类型都有一个与之相对应的类,即包装类(wrapper)
包装类是不可变类,在构造了包装类对象后,不允许更改包装在其中的值
包装类是final的,不能定义他们的子类
Number抽象类,是Byte,Double,Float,Integer,Long,Short类的父类;
Number的子类必须提供方法(将表示的数值转换为byte,double,float,int,long,short等基本类型)
intValue() 以int形式返回指定的数值
doubleValue() 以double形式返回指定的数值
floatValue() 以float形式返回指定的数值
Number n = 123;
Number m=123.45;
int a =n.intValue();//a=123;
double d =n.doubleValue();//d=123.0
int a1 =m.intValue();//a1=123;
double d1 =m.doubleValue();//d1=123.45;
1)Integer常用功能:
表示常量:
static int MAX_VALUE值为2的31次方减1;表示int类型能表示的最大值
static int MIN_VALUE值为-2的31次方;表示int类型能表示的最小值
2)Integer静态方法parseInt:用于将字符串传为int
Integer i =new Integer(3);//将3转换为对象i
double d=i.doubleValue();//将对象中的值用于计算,
System.out.println(d);//3.0
Double d1 =Double.valueOf(d);//将数字表示的值用于面向对象开发
/*
* parseInt(String),将String转换为int类型
* 转换的前提是该String类型的值一定是整数类型
* 否则失败,抛出异常
*/
String str ="123"; int s1=Integer.parseInt(str); System.out.println(s1+4);//123+4=127 str="a123"; //s1=Integer.parseInt(str); System.out.println(s1);//NumberFormatException数字格式异常