文档注释
- 文档注释一般修饰三个地方 类,方法,属性。
- 文档注释可以被javadoc翻译并生成为手册。
- 文档注释是功能级注释,用来说明整体功能。
String
String是不可变对象,即: 字符串对象一旦创建内容是不可改变的,改变一定要创建新对象。JVM对字符串有一个优化:字符串常量池
字符串常量池中会缓存所有使用字面量形式创建的字符串对象,一旦发现再次使用已有的字面量创建字符串时会直接重用已创建对象。
- 例如
String s = "123";
String s1 = "123";
// 返回true
System.out.println(s == s1);
int常量池也会缓存-128-127之间的直接量
- 例如
Integer i = 127;
Integer i1 = 127;
// 返回true
System.out.println(i == i1);
Integer i2 = 128;
Integer i3 = 128;
// 返回false
System.out.println(i2 == i3);
String常用的API
- int length():求字符串长度,无论中英,每个字符1个长度
- Int indexOf(String str):查找str在当前字符串中位置,没有则返回-1
- index = str.indexOf(“in”, 3):从指定位置开始检索
- index = str.lastIndexOf(“in”):检索最后一次出现的位置
- String substring(int start,int end):截取子串,范围是[start,end),含头不含尾
- String trim():去除字符串两边的空白字符
- char charAt(int index):获取指定下标的字符
- boolean startsWith(String str),
- boolean endsWith(String str):判断是否以指定字符串开头或者结尾
- String toUpperCase(),
- String toLowerCase():将字符串英文转换为全大写,或者全小写
- String String.valueOf():String静态方法,将其他类型转换为字符串
空串与null串
String s = "";
// 0
System.out.println(s.length());
String s1 = " ";
// 3
System.out.println(s1.length());
String s2 = null;
// null
System.out.println(s2);
// 判断一个字符串既不是空串也不是null串
string != null && string.length() != 0
StringBuilder——拯救频繁修改字符串带来的性能损耗
由于String在java中的优化倾向于重用性,这就导致频繁修改字符串对于性能的损耗是非常可观的。为此,java提供了一个专门用来修改字符串内容的类:StringBuilder
StringBuilder内部维护一个可变的字符数组,所有操作均在该数组中完成。速度快,内存消耗小。
StringBuilder提供了一套用于修改字符串内容的方法。
所以在实际开发中,频繁修改字符串操作都应当使用StringBuilder来完成。
例如:
String str = “好好学习java”;
- StringBuilder builder= new StringBuilder(str) 实例化StringBuilder对象
- 增:builder.append(",为了找个好工作!") 字符串末尾追加内容
- 删:builder.delete(0, 8) 删除指定范围字符串,[0,8);
- 改:builder.replace(9, 16, “就是为了改变世界”) 替换对应位置字符串,依旧[9,16)
- 插:builder.insert(0, “活着”) 在指定位置插入一个字符串
- 反转:builder.reverse() 颠倒字符串
- void setChar(int i, char c) 将第i个单元设置为c
StringBuffer 和StringBuilder的区别:
StringBuffer是线程安全的,同步处理的,性能稍慢;
StringBuilder是后推出的, 非线程安全的,并发处理的,性能稍快。
正则表达式、String与包装类
正则表达式基础
正则表达式就是使用一系列预定义的特殊字符来描述一个字符串的格式规则,然后使用该格式规则匹配某个字符串是否符合格式要求。
java中的正则表达式本身也是一个字符串String reg="\w";
- “.”:点儿,在正则表达式中表示任意一个字符。
- “”:在正则表达式中是转意字符
- \d:表示任意一个数字
- \w:表示任意一个单词字符(只能是 数字,字母,下划线)
- \s:表示任意一个空白字符(\t \r \n \f \x0B)
- \D:表示任意一个非数字字符
- \W:表示任意一个非单词字符
- \S:表示任意一个非空白字符
- “字符集合 []”:"[]"用来描述单一字符,方括号内部可以定义这个字符的内容,也可以描述一个范围。
- “+”:表示内容可以连续出现至少1次以上
- “*”:表示内容出现0-若干次
- “?”:表示内容出现0-1次
- {n}:表示内容必须出现n次
- {n,m}:表示内容出现n-m次
- {n,}:表示内容出现至少n次
分组"()"。() 可以将内容看做一个整体,()中可以使用"|"来表示或关系。例如,(+86|0086) 表示这里可以是+86或者0086。 - "“和”$":首位加…$表示一个整体。若不使用它们,那么正则表达式只匹配某个字符串的部分内容是否符合格式规则,但使用它们,则要求字符串必须从头到尾都满足该格式规则。
##String正则相关API: - boolean matches(String regex): 使用给定的正则表达式验证当前字符串是否满足格式要求
注意:给定的正则表达式无论是否加了边界符(^…$)都是进行全匹配验证。
@Test//字符串是否为任意三个字符,若为\\.则点仅为一个.
public void test4(){
String reg=".{3}";
System.out.println("css".matches(reg)); //true
}
- String[] split(String regex):按满足正则表达式内容进行拆分,拆分出来的内容装入String[]。
@Test
public void test5(){
String str="吃饭,睡觉,打豆豆";
String[] strs=str.split(",");
for(String s:strs){
System.out.println(s); //吃饭 睡觉 打豆豆
}
}
- String replaceAll(String regex,String str):按满足正则表达式内容替换成str
@Test //str本身不会改变,会返回一个新的字符串
public void test5(){
String str="吃饭,睡觉,打豆豆";
String s=str.replaceAll(",", "and");
System.out.println(s); //吃饭and睡觉and打豆豆
}
包装类
为了解决基本类型不能直接参与面向对象开发的问题,java为8个基本类型分别定义了8个包装类
- Integer i1 = new Integer(1):基本类型转换为包装类
- Integer i3 = Integer.valueOf(127):推荐使用valueOf进行转换
包装类有两个常量,表示基本类型的最大和最小值
- MAX_VALUE
- MIN_VALUE
JAVA 1.5推出了一个新的特性:自动拆装箱 ,它由编译器认可,而非虚拟机认可。会在编译源代码时将基本类型与包装类之间补充代码进行转换。
- 自动拆箱:int i = new Integer(123)
原型:int i = new Integer(123).intValue() - 自动装箱:Integer in = i
原型:Integer in = Integer.valueOf(i)
包装类有一个静态方法:parseXXX(String str),可以将给定的字符串转换为对应的基本类型值。
前提是该字符串表示的内容是该基本类型可以保存的值。
//以下输出结果为true,有点不一样的地方。double也是如此
Integer i=100;
int i1=100;
System.out.println(i==i1);
//会自动拆装箱,但不会自动转型
@Test
public void test1(){
double i=100;
Double i1=100; //编译报错,不能从int to Double
}
java.util.Date
Date的实例用于表示一个时间点。 Date内部维护一个long值,该值是UTC时间,是从1970年1月1日 00:00:00到该Date所经过的毫秒数。由于Date存在时区及千年虫问题,所以大部分操作时间的方法都被声明为过时的。
- Date now = new Date() 默认实例化出来的Date表示当前系统时间
- long time = now.getTime() 1970年至date日期之间经历的毫秒数
- now.setTime(time) 使用到1970年的毫秒数设置日期
- boolean after(Date when)
- boolean before(Date when)
- int compareTo(Date anotherDate) 比较时间,大于返回1,等于是0,小于返回-1
Date date1 = DateUtils.parseDate("2019-06-07", "yyyy-MM-dd");
Date date2 = DateUtils.parseDate("2019-06-6", "yyyy-MM-dd");
Date date3 = DateUtils.parseDate("2019-06-06", "yyyy-MM-dd");
// false
System.out.println(date1.before(date2));
// true
System.out.println(date1.after(date2));
// 1
System.out.println(date1.compareTo(date2));
// 0
System.out.println(date2.compareTo(date3));
java.text.SimpleDateFormat
申明日期格式
- SimpleDateFormat sdf= new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
日期转字符串
- String str = sdf.format(new Date()) 将日期转为指定格式字符串
- String str = sdf.format(time) 重载方法,将long time转为字符串
字符串转日期
- Date date = sdf.parse(str) 将字符串按指定格式转为Date对象
java.util.Calendar
-
Calendar calendar = Calendar.getInstance():默认创建出来也表示当前系统时间
-
Date date = calendar.getTime():将Calendar表示的日期用Date形式表示
-
calendar.setTime(date):将Calendar表示Date date日期
-
void set(int field,int value):对指定时间分量设置给定的值
-
calendar.set(Calendar.YEAR, 2008);
calendar.set(Calendar.MONTH, Calendar.AUGUST);
calendar.set(Calendar.DAY_OF_MONTH, 8);
calendar.set(Calendar.HOUR_OF_DAY, 20);
calendar.set(Calendar.MINUTE, 8);
calendar.set(Calendar.SECOND,8);
calendar.set(Calendar.DAY_OF_WEEK, 3); -
int get(int field):获取Calendar时间分量对应的值
* 天有不同的时间分量:
* DAY_OF_MONTH:月中的天,即:几号
* DAY_OF_WEEK:周中的天,即:星期几
* DAY_OF_YEAR:年中的天。
* DATE:与DAY_OF_MONTH意思一致。 -
获取时间分量
-
int year = calendar.get(Calendar.YEAR):获取年
int month = calendar.get(Calendar.MONTH)+1:月从0开始
int days = calendar.get(Calendar.DAY_OF_YEAR):今天是今年的第多少天
days = calendar.get(Calendar.DAY_OF_WEEK)-1:周从周日开始 -
添加时间分量
-
void add(int field,int value):时间分量加上指定的值,负数是减去
calendar.add(Calendar.YEAR, 3):加3年
calendar.add(Calendar.MONTH, 2):加两个月
calendar.add(Calendar.DAY_OF_YEAR, 25):加25天
calendar.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY):设为当周周五 -
int getActualMaximum(int field)
返回给定时间分量所允许的最大值。参照日期为当前Calendar所表示的日期