zoukankan      html  css  js  c++  java
  • day12 常用类 3String类与其他结构之间的转换 及StringBuffer StringBuilder 及日期类

    /**
    * 涉及到String类与其他结构之间的转换
    */
    public class StringTest1 {


    /*
    String 与 byte[]之间的转换
    编码:String --> byte[]:调用String的getBytes()
    解码:byte[] --> String:调用String的构造器

    编码:字符串 -->字节 (看得懂 --->看不懂的二进制数据)
    解码:编码的逆过程,字节 --> 字符串 (看不懂的二进制数据 ---> 看得懂)

    说明:解码时,要求解码使用的字符集必须与编码时使用的字符集一致,否则会出现乱码。
    */
    @Test
    public void test3() throws UnsupportedEncodingException {
    String str1 = "abc123中国";
    byte[] bytes = str1.getBytes();//使用默认的字符集,进行编码。
    System.out.println(Arrays.toString(bytes));

    byte[] gbks = str1.getBytes("gbk");//使用gbk字符集进行编码。
    System.out.println(Arrays.toString(gbks));

    System.out.println("******************");

    String str2 = new String(bytes);//使用默认的字符集,进行解码。
    System.out.println(str2);

    String str3 = new String(gbks);
    System.out.println(str3);//出现乱码。原因:编码集和解码集不一致!


    String str4 = new String(gbks, "gbk");
    System.out.println(str4);//没有出现乱码。原因:编码集和解码集一致!


    }

    /*
    String 与 char[]之间的转换

    String --> char[]:调用String的toCharArray()
    char[] --> String:调用String的构造器
    */
    @Test
    public void test2(){
    String str1 = "abc123";        //题目: a21cb3

    char[] charArray = str1.toCharArray();
    for (int i = 0; i < charArray.length; i++) {
    System.out.println(charArray[i]);
    }

    char[] arr = new char[]{'h','e','l','l','o'};
    String str2 = new String(arr);         //String 是java.lang包中的。
    System.out.println(str2);
    }

    /*
    复习:
    String 与基本数据类型、包装类之间的转换。

    1.String --> 基本数据类型、包装类:调用包装类的静态方法:parseXxx(str)
    2.基本数据类型、包装类 --> String:调用String重载的valueOf(xxx)

    */
    @Test
    public void test1(){
    String str1 = "123";
    // int num = (int)str1;//错误的  只有子父类关系才能进行强转
    int num = Integer.parseInt(str1);    //调用包装类的静态方法

    String str2 = String.valueOf(num);//"123"
    String str3 = num + "";               //有变量参与的都是在堆里

    System.out.println(str1 == str3);      //false 一个在堆里一个在常量池里
    }

    }

    * 关于StringBuffer和StringBuilder的使用
    *
    * @author shkstart
    * @create 2019 下午 3:32
    */
    public class StringBufferBuilderTest {
    /*
    对比String、StringBuffer、StringBuilder三者的效率:
    从高到低排列:StringBuilder > StringBuffer > String
    */
    @Test
    public void test3(){
    //初始设置
    long startTime = 0L;
    long endTime = 0L;
    String text = "";
    StringBuffer buffer = new StringBuffer("");
    StringBuilder builder = new StringBuilder("");
    //开始对比
    startTime = System.currentTimeMillis();
    for (int i = 0; i < 20000; i++) {
    buffer.append(String.valueOf(i));
    }
    endTime = System.currentTimeMillis();
    System.out.println("StringBuffer的执行时间:" + (endTime - startTime));

    startTime = System.currentTimeMillis();
    for (int i = 0; i < 20000; i++) {
    builder.append(String.valueOf(i));
    }
    endTime = System.currentTimeMillis();
    System.out.println("StringBuilder的执行时间:" + (endTime - startTime));

    startTime = System.currentTimeMillis();
    for (int i = 0; i < 20000; i++) {
    text = text + i;
    }
    endTime = System.currentTimeMillis();
    System.out.println("String的执行时间:" + (endTime - startTime));

    }

    /*
    StringBuffer的常用方法:  也很重要!!! StringBuilder的方法和以下一样
    StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
    StringBuffer delete(int start,int end):删除指定位置的内容    //左闭右开,下同             删完后会返回一个新的StringBuffer??
    StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str
    StringBuffer insert(int offset, xxx):在指定位置插入xxx
    StringBuffer reverse() :把当前字符序列逆转
    public int indexOf(String str)
    public String substring(int start,int end):返回一个从start开始到end索引结束的左闭右开区间的子字符串
    public int length()
    public char charAt(int n )
    public void setCharAt(int n ,char ch)

    总结:
    增:append(xxx)
    删:delete(int start,int end)
    改:setCharAt(int n ,char ch) / replace(int start, int end, String str)
    查:charAt(int n )
    插:insert(int offset, xxx)
    长度:length();
    *遍历:for() + charAt() / toString()
    */
    @Test
    public void test2(){
    StringBuffer s1 = new StringBuffer("abc");
    s1.append(1);
    s1.append('1');
    System.out.println(s1);     //abc11
    // s1.delete(2,4);                           //左闭右开
    // s1.replace(2,4,"hello");
    // s1.insert(2,false);          //abfalsec11   ‘c’往后移动了,‘false’长度为5
    // s1.reverse();
    String s2 = s1.substring(1, 3);
    System.out.println(s1);
    System.out.println(s1.length());           //10
    System.out.println(s2);
    }


    /*
    String、StringBuffer、StringBuilder三者的异同?
    String:不可变的字符序列;底层使用char[]存储
    StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储
    StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储

    源码分析:
    String str = new String();//char[] value = new char[0];
    String str1 = new String("abc");       //char[] value = new char[]{'a','b','c'};

    StringBuffer sb1 = new StringBuffer();      //char[] value = new char[16];底层创建了一个长度是16的数组。
    System.out.println(sb1.length());//
    sb1.append('a');//value[0] = 'a';
    sb1.append('b');//value[1] = 'b';

    StringBuffer sb2 = new StringBuffer("abc");//char[] value = new char["abc".length() + 16];  长度3      数组长度为19

    //问题1. System.out.println(sb2.length());//      长度为0
    //问题2. 扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。
    默认情况下,扩容为原来容量的2倍 + 2,同时将原有数组中的元素复制到新的数组中。

    指导意义:开发中建议大家使用:StringBuffer(int capacity) 或 StringBuilder(int capacity)          避免扩容???


    */
    @Test
    public void test1(){
    StringBuffer sb1 = new StringBuffer("abc");
    sb1.setCharAt(0,'m');
    System.out.println(sb1);  //mbc ,把原来的abc改了

    StringBuffer sb2 = new StringBuffer();
    System.out.println(sb2.length());        //0,不是看数组长度而是看字符串长度!
    }

    }

    /**
    * JDK 8之前日期和时间的API测试
    */
    public class DateTimeTest {

    /*
    java.util.Date类
    |---java.sql.Date类

    1.两个构造器的使用
    >构造器一:Date():创建一个对应当前时间的Date对象
    >构造器二:创建指定毫秒数的Date对象
    2.两个方法的使用
    >toString():显示当前的年、月、日、时、分、秒
    >getTime():获取当前Date对象对应的毫秒数。(时间戳)

    3. java.sql.Date对应着数据库中的日期类型的变量
    >如何实例化
    >如何将java.util.Date对象转换为java.sql.Date对象
    */
    @Test
    public void test2(){
    //构造器一:Date():创建一个对应当前时间的Date对象
    Date date1 = new Date();
    System.out.println(date1.toString());   //Sat Feb 16 16:35:31 GMT+08:00 2019

    System.out.println(date1.getTime());    //1550306204104

    //构造器二:创建指定毫秒数的Date对象
    Date date2 = new Date(155030620410L);
    System.out.println(date2.toString());    //翻译成年月日形式

    //创建java.sql.Date对象
    java.sql.Date date3 = new java.sql.Date(35235325345L);
    System.out.println(date3);//1971-02-13

    //如何将java.util.Date对象转换为java.sql.Date对象
    //情况一:
    // Date date4 = new java.sql.Date(2343243242323L);
    // java.sql.Date date5 = (java.sql.Date) date4;
    //情况二:
    Date date6 = new Date();
    java.sql.Date date7 = new java.sql.Date(date6.getTime());


    }

    //1.System类中的currentTimeMillis()
    @Test
    public void test1(){
    long time = System.currentTimeMillis();
    //返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
    //称为时间戳                      用来生成订单号
    System.out.println(time);
    }
    }

  • 相关阅读:
    linux权限补充:rwt rwT rws rwS 特殊权限
    关于Linux操作系统下文件特殊权限的解释
    Java学习笔记——Java程序运行超时后退出或进行其他操作的实现
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 复数四则运算
  • 原文地址:https://www.cnblogs.com/wangyanbin2333/p/13366138.html
Copyright © 2011-2022 走看看