一、String类
1.特点
String代表不可变的字符序列,底层用char[]存放。
String是final的。
2.内存解析
3.常用方法
int length()
char charAt(int index):返回指定位置的字符
boolean equals(Object obj):比较字符串的内容是否相等
int compareTo(String anotherString):对字符串内容按字典顺序进行大小比较,当前对象比参数大返回正整数,反之返回负整数,相等返回0。
int indexOf(String s):返回S在字符串中首次出现的位置,没有返回-1
int indexOf(String s, int startpoint):返回s从字符串的startpoint的位置开始首次出现的位置。
int lastIndexOf(String s):返回s在字符串中最后一次出现的位置
boolean startsWith(String prefix):测试此字符串从指定索引开始的子字符串是否以指定前缀开始。
boolean endsWith(String prefix):测试此字符串是否以指定的后缀结束。
boolean regionMatches(int firstStart,String other,int otherStart,int len):测试两个字符串区域是否相等。
String substring(int startpoint):返回一个新的字符串,它是此字符串的一个子字符串。
String substring(int start, int end)
String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar
替换此字符串中出现的所有 oldChar
得到的。
String replaceAll(String old , String new):使用给定的new替换此字符串所有匹配给定的正则表达式的子字符串。
String trim():返回字符串的副本,忽略前导空白和尾部空白,中间的空格不变。
String concat(String str):将指定字符串连接到此字符串的结尾。
String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
题目1
//模拟一个trim方法,去除字符串两端的空格
public static String myTrim(String str){
int start = 0;
int end = str.length() - 1;
while(start < end && str.charAt(start) == " "){
start++;
}
while(start < end && str.charAt(end) == " "){
end--;
}
return str.subString(start,end + 1);
}
题目2
public class Test{
public static void main(String[] args){
String str = "abcdefg";
String str1 = reverseString(str,2,4);
System.out.println(str1);//输出abedcfg
String str2 = reverseString2(str,2,4);
System.out.println(str2);//输出abedcfg
}
//将一个字符串进行反转,将字符串中指定部分进行反转,比如将“abcdefg”反转为“abfedcg”
public static String reverseString(String str, int start, int end){
char[] c = str.toCharArray();//字符串--->字符数组
return reverseArray(c,start,end);
}
public static String reverseArray(char[] c, int start, int end){
for(int i = start,j = end;i < j; i++,j--){
char temp = c[i];
c[i] = c[j];
c[j] = temp;
}
return new String(c);//字符数组--->字符串
}
//字符串的反转方法二,可使用StringBuffer继续优化
public static String reverseString2(String str, int start, int end){
String str1 = str.substring(0,start);
for(int i = end;i >= start;i--){
char c = str.charAt(i);
str1 += c;
}
str1 = str1.concat(str.substring(end+1));
return str1;
}
}
题目3
public class Test{
public static void main(String[] args){
String str1 = "abdasdvabdfab";
String str2 = "ab";
System.out.println(getTime(str1,str2));//输出3
}
//返回一个字符串在另一个字符串中出现的次数,即str2在str1中出现次数
public static int getTime(String str1, String str2){
int count = 0;
int index;
while((index = str1.indexOf(str2)) != -1){
count++;
str1 = str1.substring(index+str2.length());
}
return count;
}
}
题目4
import java.util.ArrayList;
import java.util.List;
public class Test{
public static void main(String[] args){
String str1 = "freghelloyujkuy";
String str2 = "freghsdwhellodf";
System.out.println(getMaxSubstring(str1,str2));//输出[fregh,hello]
}
//返回两个字符串中最大相同子串
public static List<String> getMaxSubstring(String str1, String str2){
List<String> list = new ArrayList<>();
String longStr,shortStr;
if(str1.length() < str2.length()){
longStr = str2;
shortStr = str1;
}else{
longStr = str1;
shortStr = str2;
}
int len = shortStr.length();
for(int i = 0; i < len; i++){//i相当于短字符串截去字符的个数
for(int x = 0 , y = len-i;y <= len;x++,y++){//把截取到的子串区间逐步往后挪
String str = str2.substring(x,y);
if(longStr.indexOf(str) != -1){
list.add(str);
}
}
if(list.size() != 0){
return list;
}
}
return null;
}
}
题目5
import java.util.Arrays;
public class Test{
public static void main(String[] args){
String str = "gbsdxizame";
System.out.println(sort(str));//输出abdegimsxz
}
//对字符串中的字符按自然顺序排序
public static String sort(String str){
char[] c = str.toCharArray();
Arrays.sort(c);
return new String(c);
}
}
4.字符串与基本数据类型、字节数组、字符数组之间的转换
字符串与基本数据类型、包装类的相互转换:
//调用相应包装类的parseXxx(String str)方法
int i = Integer.parseInt(str1);
//调用String类的重载的valueOf()方法
String str2 = String.valueOf(i);
字符串与字节数组的相互转换:
String str1 = "abc123";
//调用String类的getBytes()方法
byte[] b = str1.getBytes();
//调用String类的构造器
String str2 = new String(b);
字符串与字符数组的相互转换:
String str1 = "abc123中国人";
//调用String类的toCharArray()方法
char[] c = str1.toCharArray();
//调用String类的构造器
String str2 = new String(c);
二、StringBuffer类
1.概述
java.lang.StringBuffer代表可变的字符序列,可以在原有的基础上对字符串内容进行增删。
2.和String的区别
String对象对应的字符序列的容量和存放内容的长度是一致的,因此两个String对象相加会创建另外一个字符序列去存放新的String,因为容量不够。
而StringBuffer对象对应的字符序列有一个初始的容量,所以可以往容量未满的StringBuffer对象添加内容,所以说StringBuffer是可变的字符序列。
3.常用方法
StringBuffer append(Xxx x):将 Xxx 参数的字符串表示形式追加到此序列
StringBuffer insert(int index, Xxx x):将Xxx 参数的字符串表示形式在index位置插入到此序列中。
StringBuffer reverse():将此字符序列用其反转形式取代。
StringBuffer delete(int startIndex, int endIndex):移除此序列的子字符串中的字符。
void setCharAt(int index, char ch):将给定索引处的字符设置为 ch
。
StringBuffer replace(int start, int end, String str):使用给定 String
中的字符替换此序列的子字符串中的字符。
int indexOf(String str):返回第一次出现的指定子字符串在该字符串中的索引。
char charAt(int index):返回此序列中指定索引处的 char
值。
String substring(int start , int end):返回一个新的 String
,它包含此序列当前所包含的字符子序列。
三、StringBuilder类
1.概述
可变的字符序列,是jdk5.0新加入的,线程不安全,效率要高于StringBuffer
2.效率对比
StringBuilder > StringBuffer > String
四、与时间有关的类
1.java.lang.System类
System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
此方法适用于计算时间差。
2.java.util.Date类
表示特定的瞬间,精确到毫秒,不易于国际化
常用方法:
Date()、Date(long date):构造方法,获取本地当前时间。
getTime():返回自1970年1月1日0时0分0秒 GMT 以来此Date对象表示的毫秒数。
toString():把Date对象转换成String形式
代码:
Date d1 = new Date();
System.out.println(d1.toString());//Fri Mar 22 17:17:06 CST 2019
System.out.println(d1.getTime());//1553246226047
Date d2 = new Date(d1.getTime());
System.out.println(d2);//Fri Mar 22 17:17:06 CST 2019
3.java.text.SimpleDateFormat类
是一个不与语言环境有关的方式来格式化和解析日期的具体类,易于国际化。
格式化:(日期 - - -> 文本)调用String format(Date date)方法格式化时间对象date
解析:(文本 - - -> 日期)调用Date parse(String source)方法从给定字符串的开始解析文本,以生成一个日期。
代码:
//不带参格式化
SimpleDateFormat sdf = new SimpleDateFormat();
String date1 = sdf.format(new Date());
System.out.println(date1);//19-3-22 下午5:48
//带参格式化
SimpleDateFormat sdf1 = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
String date2 = sdf1.format(new Date());
System.out.println(date2);//星期五, 22 三月 2019 17:48:59 +0800
//解析
Date d1 = sdf.parse(date1);//注意格式要匹配,比如这里的参数不能是date2
System.out.println(d1);//Fri Mar 22 17:48:00 CST 2019
Date d2 = sdf1.parse(date2);//这里的参数不能是date1
System.out.println(d2);//Fri Mar 22 17:48:59 CST 2019
例题:”三天打渔,两天晒网“,问从1990-01-01开始以上循环,XXXX-XX-XX这一天是在打渔还是在晒网?
import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;
public class Test{
public static void main(String[] args) throws Exception{
String date1 = "1990-01-01";
String date2 = "1990-01-04";
int dates = getDays(date1,date2);
if(dates % 5 == 0||dates % 5 == 4){
System.out.println("这一天在晒网");
}else{
System.out.println("这一天在打渔");
}
}
//返回从XXXX-XX-XX到1990-01-01的天数
public static int getDays(String date1, String date2) throws ParseException{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d1 = sdf.parse(date1);
Date d2 = sdf.parse(date2);
long milliTime = d2.getTime()-d1.getTime();
return (int)milliTime/1000/3600/24 + 1;
}
}
4.java.util.Calendar类
Calendar是一个抽象基类,主要用于完成日期字段之间互相操作的功能
get()/add()/set()/Date getTime()/setTime(Date d)示例:
public static void main(String[] args) throws Exception{
Calendar c = Calendar.getInstance();//实例化方法:getInstance()
int day = c.get(Calendar.DAY_OF_MONTH);//获取当前时间是本月的第几天
System.out.println(day);//22
c.add(Calendar.DAY_OF_MONTH, -2);//给对象c的DAY_OF_MONTH加-2天
day = c.get(Calendar.DAY_OF_MONTH);
System.out.println(day);//20
c.set(Calendar.DAY_OF_MONTH,26);
Date d = c.getTime();//返回一个Date对象,时间为c的时间。
System.out.println(d);//Tue Mar 26 19:12:35 CST 2019
}
五、Math类(详见API)
六、BigInteger类
数字范围比Integer类的数字范围大得多,可以支持任意精度的整数。
七、BigDecimal类
用于天文、商业计算等要求数字精度比较高的地方,支持任意精度的定点数。