Java速通7:字符串、时间

115 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

一、字符串

1.1 字符串简介

  1. 底层使用char[] 存储字符数据,从java9开始,底层使用byte[]存储字符数据。
  2. 所有字符串字面量(比如"abc")都是String类的实例。
    String str = "abc";
    
    // 相当于
    String str = new String("abc");
    
  3. String对象一旦创建完成,它的字符内容是不可以修改的。
  4. 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);

7-1.png

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

7-2.png

例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:

在进行大量字符串的改动操作时(如拼接、替换)

  1. 使用String会消耗内存,降低程序性能。
  2. 使用StringBuilder可节省内存,提高程序性能。
  3. StringBuilder常用方法:appendinsertdeletereplacereverse
注意:
  • StringBuilder并不是String的子类 或 父类

  • StringBuilderString 都实现了CharSequence接口

    StringBuilder sb = new StringBuilder();
    sb.append("123").append("456");  // 因为append()的返回值是this
    

    StringBuilder的默认容量是16, 扩容后的新容量是原来容量的 2倍+2

7-3.png

1.5.格式化输出:

  1. 可以使用System.out.printf()System.out.format() 实现格式化输出。
System.out.printf("my name is %s", name);
  1. 可使用String.format() 对字符串进行格式化。
String str = String.format("my name is %s", name);

1.6.字符串截取

7-4.png

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:日历

  1. java.util.Calendar 也是开发中常用到的日期处理类。
  2. 功能比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();