一、String
字符串在底层是以字符数组char[]存储的,是不可变的字符序列,字符串一旦创建就不能改变,例如:
String str1 = ”abc”;//①
String str2 = str1;//②
str1 = ”deg”;//③
此时str2的值还是abc,执行②的时候,str1将地址值传递给str2,此时,str1和str2都指向”abc”;当执行③时,并不是改变了原来的”abc”,而是另外创建了”deg”,而使str1指向新建的”deg”,由于str2的地址值并没有改变,所以str2的值还是”abc”。
String str1 = "abc" + "def";这种写法和String str2 = "abcdef";是一样的,此时str1 == str2;
因此要尽可能的防止字符串的胡乱拼接,这会创建出很多的String对象,会导致系统性能下降,尤其是在庞大的循环语句中。
字符串与其他类型数据的转换:
1、字符串与基本数据类型、包装类之间转换:
①字符串 —>基本数据类型、包装类:调用相应的包装类的parseXxx(String str);
②基本数据类型、包装类—>字符串:调用字符串重载的valueOf()方法
2、字符串与字节数组间的转换
①字符串—>字节数组:调用字符串的getBytes();
②字节数组—>字符串:调用字符串的构造器
3、字符串与字符数组间的转换
①字符串—>字符数组:调用字符串的toCharArray();
②字符数组—>字符串:调用字符串的构造器
4、String与StringBuffer的转换
①String —>StringBuffer:使用StringBuffer的构造器:new StringBuffer(String str);
②StringBuffer—>String:使用StringBuffer的toString()方法
TIP
:字符串类型也可以转为boolean类型:Boolean.parseBoolean(str);
5、StringBuffer和StringBuilder
StringBuffer类:可变的字符序列,可以增删单个字符或字符串来改变长度,StringBuffer可看作是一个容器,当调用StringBuffer的空参构造器new StringBuffer()的时候实际上他的空间长度是16,但并不是说它的length()值是16,length()值与它存放的内容有关,StringBuffer在创建的时候也可以指定长度new StringBuffer(长度值);StringBuffer在底层的存储还是字符数组,集合ArrayList(动态数组)在底层是以Object[]数组的形式存储,空参构造时的长度是10。
StringBuffer的append()方法可以连用:sb.append(“aba”).append(“234”);
StringBuilder类:可变的字符序列(jdk5.0新加入的,效率更高,线程不安全)
常用的方法:
append(...);//添加
delete(int startIndex, int endIndex);//删除
setCharAt(int n ,char ch);//修改
charAt(int index);//查询
insert(int index, String str);//插入
reverse();//反转
length();//长度
注意
:StringBuffer在执行reverse()方法的时候会把自身反转
compareTo(String str)方法的原理:
取出当前字符串序列和形参字符串序列的长度,再取出较小的长度,从第一个位置开始比较每个位置上的字符,直到字符不同的时候,作差返回一个int值,如果比较完较小长度的每个字符之后发现每个位置上的字符都相等,则再比较两个字符串的长度,返回长度的差值。该方法主要用于字符串排序。
一些字符串相关的自定义工具方法:
①自定义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);
}
②实现字符数组中任意区段的反转,并以字符串的形式返回的方法:
public static String reverseArray(char[] c, int start, int end) {
for (int i = start, j = end; i < j; i++, j--) {
c[i] = (char) (c[i] ^ c[j]);
c[j] = (char) (c[i] ^ c[j]);
c[i] = (char) (c[i] ^ c[j]);
}
return new String(c);
}
③获取一个字符串在另一个字符串中出现的次数:
public static int getTime(String str1, String str2) {
int count = 0;
int len;
while ((len = str1.indexOf(str2)) != -1) {
count++;
str1 = str1.substring(len + str2.length());
}
return count;
}
④求两个字符串的最大子串的程序:可能有多个长度相同的子串,因此返回值为List<String>
public static List<String> getMaxSubString(String str1, String str2) {
String maxStr = (str1.length() > str2.length()) ? str1 : str2;
String minStr = (str1.length() < str2.length()) ? str1 : str2;
int len = minStr.length();
List<String> list = new ArrayList<>();
for (int i = 0; i < len; i++) {
for (int x = 0, y = len - i; y <= len; x++, y++) {
String str = minStr.substring(x, y);
if (maxStr.contains(str)) {
list.add(str);
}
}
if (list.size() != 0) {
return list;
}
}
return null;
}
二、时间、日期类
1、System.currentTimeMillis():返回当前时间的时间戳,此值是从1970年1月1日0点0分00秒开始到当前时间的毫秒数,是long型的正数,此方法常用来计算时间差
2、java.util.Date
Date d = new Date();//返回当前时间的Date:Mon May 12 15:17:01 CST 2014
Date d1 = new Date(15231512541241L);//返回形参处时间戳对应的日期
3、java.text.SimpleDateFormat
格式化:日期—>文本,使用SimpleDateFormat的format()方法
解析:文本—>日期,使用SimpleDateFormat的parse()方法
//格式化1:默认格式
SimpleDateFormat sdf = new SimpleDateFormat();
String date = sdf.format(new Date());
System.out.println(date);//14-5-12 下午3:24
//格式化2:指定格式
SimpleDateFormat sdf1 = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
date = sdf1.format(new Date());
System.out.println(date);//星期一, 12 五月 2014 15:29:16 +0800(东八区)
//解析:
Date date1 = sdf.parse("14-5-12 下午3:24");
System.out.println(date1);
date1 = sdf1.parse("星期一, 12 五月 2014 15:29:16 +0800");
//date1 = sdf1.parse("14-5-12 下午3:24");
System.out.println(date1);
4、Calendar(日历)
获取实例:Calendar c = Calendar.getInstance();
常用api:get()/set()/add()/date getTime()/setTime()
三、Math
Random类的Random.nextInt(max);表示随机返回一个[0, max)之间的整数,注意不包括max,要想返回从1开始的整数则需再+1,Math.random()返回的是[0,1)之间的小数
Math.random();//获取一个随机小数
四、Runtime
Runtime类中的方法可以启动一些系统中的资源,比如用浏览器打开一个网站、启动资源管理器等
Runtime rt1 = Runtime.getRuntime();
Runtime rt2 = Runtime.getRuntime();
System.out.println(rt1);
System.out.println(rt2);// rt1 == rt2
try {
// r1.exec("explorer");//启动资源管理器
r1.exec("explorer http://baidu.com");// 启动浏览器并打开网址
} catch (Exception e) {
}