String
String用来定义字符串
1. 定义的方式
/* * 1. 字符串的创建形式 */ String str = "abc"; String str2 = new String("abc"); byte[] arr = {97,98,99}; String str3 = new String(arr); char[] arr2 = {'a','b','c'}; String str4 = new String(arr2); System.out.println(str4);
2. 字符串的比较
-
== 一般不使用== 比较字符串对象
-
equals() String类重写equals方法
-
比较逻辑,比较两个字符串中的字符是否相等
-
public boolean equals(Object anObject) { //首先判断是不是和自己比较,如果是,直接返回true if (this == anObject) { return true; } //判断参数的数据类型是不是字符串,如果不是,直接返回false if (anObject instanceof String) { //如果是字符串,就进行强制类型转化 String anotherString = (String)anObject; //value表示存储当前字符串的字符数组 //获取字符串的长度,表示有多少个字符 int n = value.length; //判断两个字符串的长度是否相等,如果不相等,就直接返回false if (n == anotherString.value.length) { char v1[] = value; // 获取调用该方法字符串的字符数组 char v2[] = anotherString.value; //比较的字符串的字符数组 int i = 0; while (n-- != 0) { // 逐个比较字符串,只要有不等的,直接返回false if (v1[i] != v2[i]){ return false; } i++; } return true; //如果每个字符都相等,返回true } } return false; }
//s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; }
package com.qfedu; public class Demo02 { public static void main(String[] args) { String str = "abc"; String str2 = "abc"; String str3 = new String("abc"); String str4 = new String("abc"); boolean b1 = str.equals(str2); // true boolean b2 = str.equals(str3); // true boolean b3 = str3.equals(str4); // true System.out.println(b3); boolean b4 = str == str2; //true boolean b5 = str == str3; //false boolean b6 = str3 == str4; //false System.out.println("b4="+b4); System.out.println("b5="+b5); System.out.println("b6="+b6); } }
2.1 在内存中存储位置
2.2 String定义的字符串不可改变
String定义的字符串是不能被修改,修改的只是变量引用的地址。
3. 常用方法
package com.qfedu; import java.util.Arrays; public class Demo04 { public static void main(String[] args) { /* * String的常用方法 * * 1. charAt(0) * 2. length() * */ String str = "abcdefghia"; char c = str.charAt(0); System.out.println(c); //遍历出每一个字符 int length = str.length(); for(int i=0; i<length; i++) { System.out.println(str.charAt(i)); } //包含 boolean b1 = str.contains("aa"); System.out.println(b1); //获取首次出现第一个字符的下标 如果不包含返回-1 int index = str.indexOf("a"); System.out.println(index); //获取最后一次出现第一个字符的下标 如果不包含返回-1 int index2 = str.lastIndexOf("ba"); System.out.println(index2); char[] charArray = str.toCharArray(); String str2 = " a b c "; String trim = str2.trim(); System.out.println(trim); String upperCase = trim.toUpperCase(); //大写 System.out.println(upperCase); String lowerCase = upperCase.toLowerCase(); //小写 System.out.println(lowerCase); String str3 = "abcd"; boolean endsWith = str3.endsWith("dd"); //结尾 System.out.println(endsWith); boolean startsWith = str3.startsWith("a"); // 开头 String str4 = "aa,bb,cc,dd"; String[] split = str4.split(","); //{"aa","bb","cc","dd"} System.out.println(Arrays.toString(split)); String bookName = "天龙八部.txt"; String[] split2 = bookName.split("\\."); System.out.println(split2[split2.length-1]); String str5 = "123456"; String substring = str5.substring(1); // 截取字符串,只有一个参数 System.out.println(substring); String substring2 = str5.substring(1,4); // 包含前不包含后 System.out.println(substring2); bookName = "天龙.八部.txt"; String substring3 = bookName.substring(bookName.lastIndexOf(".")+1); System.out.println(substring3); } }
可变字符串
如果需要对字符串进行频繁且多次的操作,我们可以使用可变字符串
-
StringBuffer 线程安全的, 执行的效率
-
StringBuilder 线程不安全的,执行效率高
他们的方法名都是一样。
package com.qfedu; public class Demo05 { public static void main(String[] args) { /* * 我们定义可变字符串的目的,就是为了频繁的操作字符串 */ StringBuilder sf = new StringBuilder(); //拼接字符串 sf.append("我是一个兵,"); sf.append("来自老百姓"); //替换下面的写法 String s1 = "我是一个兵,"; s1 += "来自老百姓"; /* * StringBuilder 转化为字符串 * 使用 toString() 转化 */ String str = sf.toString(); System.out.println(str); } }
日期
Date
-
表示日期
package com.qfedu; import java.util.Date; public class Demo01 { public static void main(String[] args) { //1. 获取当前时间,表示时间 Date now = new Date(); System.out.println(now); /* * 2.作为日期的数据类型 * 员工类 生日 */ long time = now.getTime(); // 获取1970-01-01 00:00:00 到现在的毫秒数 System.out.println(time); } } class Emp { private String name; private Date birthday; public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } }
Calendar
-
操作日期
-
set(field, amount)
-
add(field, amount);
-
package com.qfedu; import java.util.Calendar; public class Demo02 { public static void main(String[] args) { /* * 操作日期,使用Calendar来操作 */ Calendar c = Calendar.getInstance(); //get(field, num) int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); // 0 1 2 3 4 5 6 7 8 9 10 11 int week = c.get(Calendar.WEEK_OF_YEAR); System.out.println(week); //set(field, amount) c.set(Calendar.DATE, 15); System.out.println(c.getTime()); // Calendar 转化为 Date //add(field, amount); c.add(Calendar.YEAR, -10); System.out.println(c.getTime()); // Calendar 转化为 Date /* * 获取 * 两年,三个月,10天,5个小时 20分后的时间 */ c = Calendar.getInstance(); c.add(Calendar.YEAR, 2); c.add(Calendar.MONTH, 3); c.add(Calendar.DATE, 10); c.add(Calendar.HOUR, 5); c.add(Calendar.MINUTE, 20); System.out.println(c.getTime()); // Calendar 转化为 Date c = Calendar.getInstance(); //获取本月的最后一天 c.add(Calendar.MONTH, 1); c.set(Calendar.DATE, 1); c.add(Calendar.DATE, -1); System.out.println(c.getTime()); // Calendar 转化为 Date /* * 获取 * 两年前 那个星期的星期一 */ c = Calendar.getInstance(); c.add(Calendar.YEAR, -2); c.set(Calendar.DAY_OF_WEEK, 2); } }