Java String和日期

零、复习昨日

二、String

String代表字符串、类、 Java程序中的 所有字符串文字(例如"abc" )都实现为此类的实例。
换句话说,程序中任何字符串字面值,都是String的对象。
字符串是常量; 它们的值在创建后无法更改。
但是字符串缓冲区(StringBuffer)支持改变字符串内容!

String类提取了用于比较字符串、搜索字符串、提取字符串等的方法。

2.1 构造方法

提供了很多种构造方法,以供使用各种方式创建字符对象.

String()
String(byte[] bytes)
String(char[] chars)
String(String original)
public class TestString {
    public static void main(String[] args) {

        String name = "abc";// new String("abc")

        // 不是abc之变化了,而是name引用变化了,只想了新的字符串
        System.out.println(name);// new String("abcd")

        // String() 创建空字符串对象
        String s1 = new String();
        String s2 = " ";

        // String(byte[] bytes)
        byte[] bytes = {65,66,67};
        String s3 = new String(bytes);
        System.out.println(s3);

        // String(char[] chars)
        char[] chars = {'我','爱','祖','国'};
        String s4 = new String(chars);
        System.out.println(s4);

        // String(String original)
        String abc = new String("abc");
    }
}

2.2 方法【重点】

2.2.1 查找类的方法

1、char charAt(int index)
返回指定索引处的 char 值。
2、int indexOf(int ch)
返回指定字符在此字符串中第一次出现处的索引。
3、int lastIndexOf(int ch)
返回指定字符在此字符串中最后一次出现处的索引
  public static void testFind() {
        // char charAt(int index)
        // 返回指定索引处的 char 值。(根据下标找字符)
        System.out.println("java".charAt(0) );

        // int indexOf(int ch)
        // 返回指定字符在此字符串中第一次出现处的索引。(根据字符找下标)
        System.out.println("java".indexOf('a') );
        System.out.println("java".indexOf("av") );
        // 有个场景是用来判断是否包含某个字符或字符串


        // int lastIndexOf(int ch)
        // 返回指定字符在此字符串中最后一次出现处的索引。
        System.out.println("java".lastIndexOf("a") );
    }

    // 练习: 设计方法,给定字符串,倒着遍历输出字符串内容
    public static void printChar(String str){
        for (int i = str.length() - 1; i >= 0 ; i--) {
            System.out.println(str.charAt(i) );
        }
    }

2.2.2 判断类的方法

1、boolean contains(CharSequence s)
当且仅当此字符串包含指定的 char 值序列时,返回 true
2、boolean endsWith(String suffix)
测试此字符串是否以指定的后缀结束。
3、boolean startsWith(String prefix, int toffset)
测试此字符串从指定索引开始的子字符串是否以指定前缀开始。
4、boolean equals(Object anObject)
将此字符串与指定的对象比较。
5、boolean equalsIgnoreCase(String anotherString)
将此 String 与另一个 String 比较,不考虑大小写。
6、boolean isEmpty()
当且仅当 length() 为 0 时返回 true。
    public static void testJudgment(){
        // boolean contains(CharSequence s)
        // 当且仅当此字符串包含指定的 char 值序列时,返回 true
        System.out.println("java".contains("av") );

        // boolean endsWith(String suffix)
        // 测试此字符串是否以指定的后缀结束。
        System.out.println("Hello.java".endsWith("java") );
        System.out.println("Hello.jpg".endsWith("jpg") );

        // boolean startsWith(String prefix)
        // 测试此字符串是否以指定前缀结束。
        System.out.println("2301day16_01.mp4".startsWith("2301") );

        // boolean equals(Object anObject)
        // 将此字符串与指定的对象比较。
        System.out.println("java".equals("jAVa") );
        
        // boolean equalsIgnoreCase(String anotherString)
        // 将此 String 与另一个 String 比较,不考虑大小写。
        System.out.println("java".equalsIgnoreCase("JAVA") );

        // boolean isEmpty()
        // 当且仅当 length() 为 0 时返回 true。
        System.out.println("".isEmpty() );
        /**
         * null 是空对象,啥也不是
         * ""   是String对象,只不过这个字符串内容是空
         */
    }

2.2.3 转换类

1、byte[] getBytes()
使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
2、char[] toCharArray()
将此字符串转换为一个新的字符数组。
3、String toLowerCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为小写
4、String toUpperCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
5、static String valueOf(boolean b)
返回 boolean 参数的字符串表示形式。
    public static void testTransfer() {
        // byte[] getBytes()
        // 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
        byte[] bytes = "abc".getBytes( );
        System.out.println(Arrays.toString(bytes));


        // char[] toCharArray()
        // 将此字符串转换为一个新的字符数组。
        char[] chars = "abc".toCharArray( );
        System.out.println(Arrays.toString(chars) );

        // String toLowerCase()
        // 使用默认语言环境的规则将此 String 中的所有字符都转换为小写
        System.out.println("JAVA".toLowerCase() );
        // String toUpperCase()
        // 使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
        System.out.println("java".toUpperCase() );

        // static String valueOf(boolean b)
        // 返回 boolean 参数的字符串表示形式。
        String s = String.valueOf(1);
    }

2.2.4 字符截取和字符替换

字符截取
1、String substring(int beginIndex)
返回一个新的字符串,它是此字符串的一个子字符串。
2、String substring(int beginIndex, int endIndex)
返回一个新字符串,它是此字符串的一个子字符串。

==方式有 endIndex 的后下标,都是 不包含 endIndex ,需要 endIndex - 1.==

字符替换
1、String replace(char oldChar, char newChar)
返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的
2、String replaceAll(String regex, String replacement) 将给定替换的给定 regular expression匹配的此字符串的每个子字符串替换
    public static void test(){
        // String substring(int beginIndex)
        // 返回一个新的字符串,它是此字符串的一个子字符串。
        System.out.println("javabigdata".substring(4) );

        // String substring(int beginIndex, int endIndex)
        // 返回一个新字符串,它是此字符串的一个子字符串。
        // [startIndex,endIndex)
        System.out.println("javabigdata".substring(4,7) );
        System.out.println("410111200001011234".substring(6,14) );


        // String replace(char oldChar, char newChar)
        // 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的
        System.out.println("boss is stupid".replace("stupid","NB") );
        System.out.println("boss is SB".replace("SB","**") );

        System.out.println("SB boss is SB".replace("SB","**") );
        // String replaceAll(String regex, String replacement)
        // 参数1是正则表达式,\d是指0-9的数字,
        // 匹配字符串中所有的数字,替换成*
        System.out.println("1a2b3c4d".replaceAll("\\d","*" ));
    }

2.2.5 其他方法

1、String concat(String str)
将指定字符串连接到此字符串的结尾。
2、int length()
返回此字符串的长度。
3、String[] split(String regex)
根据给定正则表达式的匹配拆分此字符串。
4、String trim()
返回字符串的副本,忽略前导空白和尾部空白。
  public static void test2() {
        // String concat(String str)
        // 将指定字符串连接到此字符串的结尾。
        System.out.println("java".concat("bigdata") );

        // int length()
        // 返回此字符串的长度。
        System.out.println("java".length() );

        // String[] split(String regex)
        // 根据给定正则表达式的匹配拆分此字符串。
        String[] split = "某某的帅照.jpg".split("\\.");
        System.out.println(Arrays.toString(split) );
        // sdfas234.swrds2343.343fddsdf.jpg
        // 思考: 如何截取后缀
        // 拆分设备代号
        System.out.println(Arrays.toString("ABS-11-1n3-SS".split("-")) );

        // String trim()
        // 返回字符串的副本,忽略前导空白和尾部空白。
        System.out.println("    j a v a     ".trim() );
    }

三、StringBuffer & StringBuilder

3.1 StringBuffer

一个 线程安全的,字符的 可变序列
该类提供了一些方法可以改变字符串的长度和内容
构造方法
StringBuffer() 构造一个没有字符的字符串缓冲区,并构造了16个字符的初始容量。
StringBuffer(CharSequence seq) 构建一个包含指定的 CharSequence相同字符的字符串缓冲区。
StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区,并构造指定的初始容量。
StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。

ps:场景将来通过构造方法用于和String之间来回转换

方法
1、StringBuffer append(boolean b) 追加的 boolean参数序列的字符串表示形式
ps: 有很多append的重载方法,用于追加大多数类型
2、StringBuffer delete(int start, int end) 删除的字符在字符串序列分析。
3、StringBuffer deleteCharAt(int index) 删除 char在指定的位置在这个序列。
4、StringBuffer insert(int offset, boolean b) 插入的 boolean参数的字符串表示形式进入这个序列。 ps: 参数2支持大部分类型
5、StringBuffer replace(int start, int end, String str) 在一个字符串中替换指定的 String字符这个序列的特征。
6、StringBuffer reverse() 使这个字符序列被序列的反转所取代。
7、void setCharAt(int index, char ch) 指定索引处的字符设置为 ch。

总结:其实以上方法就是对字符串的增(C)、删(R)、改(U)、查(D)(CRUD)

 public static void main(String[] args) {

//        StringBuffer append(boolean b) 追加的 boolean参数序列的字符串表示形式
//        ps: 有很多append的重载方法,用于追加大多数类型
        StringBuffer sb1 = new StringBuffer("java");
        StringBuffer sb2 = sb1.append("bugdata");
        System.out.println(sb1 + " " + sb2);

//        StringBuffer delete(int start, int end)  删除的字符在字符串序列分析。
        StringBuffer sb3 = sb1.delete(4, 7);
        System.out.println(sb1 + " " + sb3);

//        StringBuffer deleteCharAt(int index)    删除 char在指定的位置在这个序列。
        sb1.deleteCharAt(3);
        System.out.println(sb1);

//        StringBuffer insert(int offset, boolean b) 插入的 boolean参数的字符串表示形式进入这个序列。 ps: 参数2支持大部分类型
        StringBuffer xyz = new StringBuffer("xyz");
        xyz.insert(2,111);
        System.out.println(xyz);

//        StringBuffer replace(int start, int end, String str) 在一个字符串中替换指定的 String字符这个序列的特征。
        StringBuffer phone = new StringBuffer("17686586534");
        phone.replace(3,7,"****");
        System.out.println(phone);

//        StringBuffer reverse()    使这个字符序列被序列的反转所取代。
        StringBuffer phone2 = new StringBuffer("17686586598");
        phone2.reverse();
        System.out.println(phone2);

//        void setCharAt(int index, char ch)  指定索引处的字符设置为 ch。
        StringBuffer iloveyou = new StringBuffer("iloveyou");
        iloveyou.setCharAt(1,'L');
        System.out.println(iloveyou);
    }

3.2 StringBuilder

StringBuilder 是可变字符序列,但是不保证线程安全。建议在单线程情况下使用,如果没有线程安全的要求,建议优先使用StringBuilder,因为操作字符串那个快!!!
常用的方法与StringBuffer中的效果完全一致,所以自己练习。

String

StringBuffer

StringBuilder

字符串是否可变

不可变

可变

可变

线程安全

安全

线程安全

不保证线程安全

字符串效率

非常慢

版本不同

1.0

1.0

1.5

public static void main(String[] args) {
        // 1000w次 250毫秒
         //StringBuffer stringBuffer = new StringBuffer( );
        // 1000w次  100毫秒
        //StringBuilder stringBuilder = new StringBuilder( );
        String str = "";
        long begin = System.currentTimeMillis( );
        for (int i = 0;i < 10000000;i++) {
            // stringBuffer.append("a");
            str+="a";
        }
        long end = System.currentTimeMillis( );
        System.out.println(end - begin );
    }

四、日期

4.1 Date

java.util.Date(特别注意不是java.sql.包下的),代表一个日期,可以精确到毫秒
ps:计算机中计算时间的原点是1970-1-1 0:0:0
构造方法:
Date() 以当前时间创建日对象
Date(int year,int month,int date) 以指定年月日创建日对象(已过时)
Date(long ) 以指定毫秒创建日期对象
public class TestDate {
    public static void main(String[] args) {
        // 当前时间
        Date date = new Date();
        System.out.println(date);

        // 指定年月日(过时)
        Date date1 = new Date(100,1,20);
        System.out.println(date1);

        // 指定毫秒值创建时间
        Date date2 = new Date(1*24*60*60*1000);
        System.out.println(date2);
    }
方法
有关于 获得年月日时分秒getXxx以及 设置年月日时分秒setXxx,但是大部分已经过时了。只有setTime() 和get Time()没有过时...
    public static void main(String[] args) {
        // 当前时间
        Date date = new Date( );
        System.out.println(date );

        // 获得 年月日(过时了)
        int year = date.getYear( );
        int month = date.getMonth( );
        int day = date.getDate( );
        System.out.println((year+1900)+"-"+(month+1)+"-"+day );

        // 设置年月日(过时了)
        date.setYear(100);
        System.out.println(date );

        // 没过时
        Date now = new Date( );
        long time = now.getTime( );
        System.out.println(time );
        // 获得当前时间到1970-01-01 0:0:0的毫秒值

        now.setTime(2 * 24 * 60 * 60 *1000);
        System.out.println(now );
    }

重点记住没有过时的方法

4.2 SimpleDateFormat

SimpleDateFormat类主要用来格式化(日期-->文本)和解析(文本-->日期)

要想完成日期格式化和解析,先得了解日期模板

Y 或者 y  年
M        月
d        日
H        24小时制
h        12小时制
m        分
s        秒
S        毫秒
E       周
常见的日期模板
yyyy-MM-dd  2000-01-01
yy-M-d      00-1-1
yyyy/MM/dd  2000/01/01
yyyy年MM月dd日 2000年01月01日
  • 下面的例子显示的日期和时间模式在美国现场解释。给定的日期和时间2001-07-04 12:08:56当地时间在美国太平洋时间时区。

   public static void main(String[] args) throws ParseException {
        // 指定模板(一旦指定模板,后续解析和格式化只能按照这个模板进行)
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE");

        // 格式化(日期→文本)
        Date date = new Date( );
        System.out.println(date );

        String format = sdf.format(date);
        System.out.println(format );

        // 解析(文本→日期)
        String str = "2020-01-01";
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
        Date thatDate = sdf2.parse(str);
        System.out.println(thatDate );
    }

4.3 Calendar

Calendar日历类,抽象类,不能直接使用,默认值是公历
Calendar rightNow = Calendar.getInstance();
该类提供了很多静态常量属性(字段)用来代表某一时间,可以放在set() get()内使用

五、总结

关于String,重要的是方法,最好是能全部背住! 就算是忘了,也得会根据API查到用法!!

关于StringBuilder和StringBuffer总结的表格,要会背!面试会问

Date比Calendar重要,没过时的几个方法一定找出来单独记!

SimpleDateFormat 了解日期模板,解析parse(字符串-->日期)和格式化format(日期--> 字符串)

Calendar类了解

单词

concat:拼接;
handle:处理;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值