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);
    }
    }

  • 相关阅读:
    python小白-day9 数据库操作与Paramiko模块
    python小白-day8 线程、进程、协程
    python小白-day8 socketserver模块
    python小白-day7 socket初识
    python小白-day7 面向对象高级部分
    python小白-day6 xml处理模块
    python小白-day6 ConfigParser模块
    2020软件定义网络实验二
    软件工程实践第一次个人作业
    2020软件定义网络实验一
  • 原文地址:https://www.cnblogs.com/wangyanbin2333/p/13366138.html
Copyright © 2011-2022 走看看