开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
一、字符串
1.1 字符串简介
- 底层使用
char[]
存储字符数据,从java9
开始,底层使用byte[]
存储字符数据。 - 所有字符串字面量(比如"abc")都是
String
类的实例。String str = "abc"; // 相当于 String str = new String("abc");
String
对象一旦创建完成,它的字符内容是不可以修改的。String
对象的引用指向是可以修改的。(间接说明java只有值传递,没有引用传递)String s = "555"; s = "666"; // s指向了"666" test(s); // s的指向依然是"666" println(s); // 666 void test(String str){ // str指向666 str += "555"; // str 指向666555 }
1.2 字符串初始化
String s1 = "mj"
String s2 = new String("mj");
String s3 = new String(s1);
String s4 = new String(s2);
char[] cs = {'m', 'j'};
String s5 = new String(cs);
String s6 = new String(s5);
1.3.字符串常量池:String Constant Pool(简称SCP)
- 从java7开始属于堆空间的一部分(以前放在方法区)
- 当遇到字符串字面量时,会去查
SCP
(查到就返回,查不到就创建新的) A.intern()
- 如果
SCP
中存在与A内容相同的字符串对象C时,就返回C。 - 否则,将A加入到
SCP
中,并返回A。
- 如果
例1:
String s1 = "mj";
String s2 = "mj";
sout(s1 == s2); //true
例2:
String s1 = new String("abc");
String s2 = new String("abc");
String s3 = s1.intern();
String s4 = s2.intern();
String s5 = "abc";
println(System.identityHashCode(s1)); // 356573597
println(System.identityHashCode(s2)); // 1735600054
println(System.identityHashCode(s3)); // 21685669
println(System.identityHashCode(s4)); // 21685669
println(System.identityHashCode(s5)); // 21685669
1.4.StringBuilder:
在进行大量字符串的改动操作时(如拼接、替换)
- 使用
String
会消耗内存,降低程序性能。 - 使用
StringBuilder
可节省内存,提高程序性能。 StringBuilder
常用方法:append
、insert
、delete
、replace
、reverse
注意:
-
StringBuilder
并不是String
的子类 或 父类 -
StringBuilder
、String
都实现了CharSequence
接口StringBuilder sb = new StringBuilder(); sb.append("123").append("456"); // 因为append()的返回值是this
StringBuilder
的默认容量是16, 扩容后的新容量是原来容量的 2倍+2
1.5.格式化输出:
- 可以使用
System.out.printf()
或System.out.format()
实现格式化输出。
System.out.printf("my name is %s", name);
- 可使用
String.format()
对字符串进行格式化。
String str = String.format("my name is %s", name);
1.6.字符串截取
1.7.字符串常用方法
// 去除左右两边的空格
" 123 456 ".trim(); // "123 456"
// 大小写转换
"abc".toUpperCase(); // ABC
"ABC".toLowerCase(); // abc
// 是否包含某个字符串
"123456".contains("34"); // true
// 是否以某个字符串开头
"123456".startsWith("123"); // true
// 是否以某个字符串结尾
"123456".endsWith("456"); // true
// 将字符串分割为数组
"1_2_3_4_5".split("_");
// 比较字符串的大小
"abc".compareTo("abc"); // <0
// 忽略大小写 比较字符串的大小
"abc".compareToIgnoreCase("ABC"); // <0
// 查看两个字符串的内容是否相等
"s1".equals("s2");
// 忽略大小写 查看两个字符串的内容是否相等
"s1a".equalsIgnoreCase("s2A");
二、时间
2.1 Date对象
// d1 和 d2都代表当前时间。
Date d1 = new Date();
Date d2 = new Date(System.currentTimeMillis());
// 返回 (1970-01-01 00:00:00 + 123ms)后的时间
Date d1 = new Date(123);
2.2 常用方法
Date d1 = new Date(1000);
Date d2 = new Date(2000);
// 设置/获取 毫秒数
d2.setTime(1000);
d2.getTime();
// 比较时间
d2.after(d1); // true
d1.before(d2); // true
d1.compareTo(d2); // -1
2.3 SimpleDateFormat: 日期的格式化处理
// 创建对象
SimpleDateFormat fmt = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
// 利用日期对象生成字符串
String str = fmt.format(new Date());
println(str); // 2018年05月01日 20:01:33
// 解析字符串为日期对象
Date date = fmt.parse(str);
2.4 Calendar:日历
java.util.Calendar
也是开发中常用到的日期处理类。- 功能比
Date
丰富,Date
中很多过期的方法都迁移到了Calendar
// 表示当前时间
Calendar c= Calendar.getInstance();
// 获取时间
c.get(Calendar.YEAR); // 年
c.get(Calendar.MONTH); // 月(取值范围[0. 11])
c.get(Calendar.DAY_OF_MONTH); // 当月的第几天(范围[1, 31])
c.get(Calendar.DAY_OF_WEEK); // 本周的第几天(范围[1, 7],1是周日)
c.get(Calendar.DAY_OF_YEAR); // 本年的第几天(范围[1, 366])
c.get(Calendar.HOUR); // 时
c.get(Calendar.MINUTE); // 分
c.get(Calendar.SECOND); // 秒
c.get(Calendar.MILLISECOND); // 毫秒
// 修改时间
c.set(2019, 5, 1); // 2019-5-1
c.add(Calendar.DAY_OF_MONTH, 5); // 2019-5-6
c.add(Calendar.MONTH, 2); // 2019-7-6
// 设置/获取 Date对象
c.setTime(new Date());
c.getTime();
// 设置/获取 毫秒数
c.setTimeInMillis(System.currentTimeMillis());
c.getTimeInMillis();