zoukankan      html  css  js  c++  java
  • java 之Scanner Random Math Date calendar stringbuder 拆装箱 object arryacost

    Scanner 输入

    Scanner sc = new Scanner(System.in);
    int i = sc.nextInt();
     
    import java.util.Scanner; 
    public class Demo01_Scanner { 
        public static void main(String[] args) {
             Scanner sc = new Scanner(System.in); 
             System.out.println("请录入一个整数:");
             int i = sc.nextInt(); /
            System.out.println("i:"+i); 
        }
     }            

    匿名对象

    new Scanner(System.in).nextInt(); 
    new Scanner(System.in).nextInt();

     

     

    作为返回值

    class Test2 { 
    public static void main(String[] args) {
    Scanner sc = getScanner(); 
    }
    
    
    public static Scanner getScanner(){ 
    return new Scanner(System.in);
     }
    
     }

    --------------------------------------------------------------------------------------------------------------------

    Random

     

    没收 Python中的  shuffle

    -----------------------------------------------------------------------

    Math类

    Math.abs(‐5):绝对值
     
    ceil(double a) :返回大于等于参数的最小的整数。
    Math.ceil(3.3); //d1的值为 4.0
     
    long round(double a)
    Math.round(5.5); //d1的值为6.0

     

    ----------------------------------------------------------------------------------------------

     Date类

    - `public Date()`:分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
    - `public Date(long date)`:分配Date对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即1970年1月1日00:00:00 GMT)以来的指定毫秒数。

    > tips: 由于我们处于东八区,所以我们的基准时间为1970年1月1日8时0分0秒。

    简单来说:使用无参构造,可以自动设置当前系统时间的毫秒时刻;指定long类型的构造参数,可以自定义毫秒时刻。例如:

     
    System.out.println(System.currentTimeMillis());//获取当前系统时间到1970 年 1 月 1 日 00:00:00经历了多少毫秒



    public
    class Demo02Date { public static void main(String[] args) { demo03(); } /* long getTime() 把日期转换为毫秒值(相当于System.currentTimeMillis()方法) 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。 */ private static void demo03() { Date date = new Date(); long time = date.getTime(); System.out.println(time);//3742777636267 } /* Date类的带参数构造方法 Date(long date) :传递毫秒值,把毫秒值转换为Date日期 */ private static void demo02() { Date date = new Date(0L); System.out.println(date);// Thu Jan 01 08:00:00 CST 1970 date = new Date(3742767540068L); System.out.println(date);// Sun Aug 08 09:39:00 CST 2088 } /* Date类的空参数构造方法 Date() 获取当前系统的日期和时间 */ private static void demo01() { Date date = new Date(); System.out.println(date);//Sun Aug 08 12:23:03 CST 2088 } }

     

     

    > tips:在使用println方法时,会自动调用Date类中的toString方法。Date类对Object类中的toString方法进行了覆盖重写,所以结果为指定格式的字符串。

    ## 2.2 DateFormat类     SimpleDateFormat

     

     private static void demo02() throws ParseException {
            //1.创建SimpleDateFormat对象,构造方法中传递指定的模式
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
            //2.调用SimpleDateFormat对象中的方法parse,把符合构造方法中模式的字符串,解析为Date日期
            //Date parse(String source)  把符合模式的字符串,解析为Date日期
            Date date = sdf.parse("2088年08月08日 15时51分54秒");
            System.out.println(date);
        }
    
        /*
            使用DateFormat类中的方法format,把日期格式化为文本
            使用步骤:
                1.创建SimpleDateFormat对象,构造方法中传递指定的模式
                2.调用SimpleDateFormat对象中的方法format,按照构造方法中指定的模式,把Date日期格式化为符合模式的字符串(文本)
         */
        private static void demo01() {
            //1.创建SimpleDateFormat对象,构造方法中传递指定的模式
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
            //2.调用SimpleDateFormat对象中的方法format,按照构造方法中指定的模式,把Date日期格式化为符合模式的字符串(文本)
            //String format(Date date)  按照指定的模式,把Date日期,格式化为符合模式的字符串
            Date date = new Date();
            String d = sdf.format(date);
            System.out.println(date);//Sun Aug 08 15:51:54 CST 2088
            System.out.println(d);//2088年08月08日 15时51分54秒
        }

     

     

    * **格式化**:按照指定的格式,从Date对象转换为String对象。
    * **解析**:按照指定的格式,从String对象转换为Date对象。

    常用的格式规则为:

    | 标识字母(区分大小写) | 含义 |
    | ----------- | ---- |
    | y | 年 |
    | M | 月 |
    | d | 日 |
    | H | 时 |
    | m | 分 |
    | s | 秒 |

    > 备注:更详细的格式规则,可以参考SimpleDateFormat类的API文档0。

    创建SimpleDateFormat对象的代码如:

     

    DateFormat类的常用方法有:.parse-->(转毫秒)    .format-->(转字符串)

     

     

    2.4 Calendar类

    日历我们都见过

    Calendar为抽象类,由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,返回子类对象,如下:

    Calendar静态方法

    * `public static Calendar getInstance()`:使用默认时区和语言环境获得一个日历

    例如:

    ```java
    import java.util.Calendar;

    public class Demo06CalendarInit {
    public static void main(String[] args) {
    Calendar cal = Calendar.getInstance();
    }
    }
    ```

    ### 常用方法

    根据Calendar类的API文档,常用方法有:

    - `public int get(int field)`:返回给定日历字段的值。
    - `public void set(int field, int value)`:将给定的日历字段设置为给定值。
    - `public abstract void add(int field, int amount)`:根据日历的规则,为给定的日历字段添加或减去指定的时间量。
    - `public Date getTime()`:返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。

    Calendar类中提供很多成员常量,代表给定的日历字段:

    | 字段值 | 含义 |
    | ------------ | -------------------- |
    | YEAR | 年 |
    | MONTH | 月(从0开始,可以+1使用) |
    | DAY_OF_MONTH | 月中的天(几号) |
    | HOUR | 时(12小时制) |
    | HOUR_OF_DAY | 时(24小时制) |
    | MINUTE | 分 |
    | SECOND | 秒 |
    | DAY_OF_WEEK | 周中的天(周几,周日为1,可以-1使用) |

    #### get/set方法

    get方法用来获取指定字段的值,set方法用来设置指定字段的值,代码使用演示:

    ```java
    import java.util.Calendar;

    public class CalendarUtil {
    public static void main(String[] args) {
    // 创建Calendar对象
    Calendar cal = Calendar.getInstance();
    // 设置年
    int year = cal.get(Calendar.YEAR);
    // 设置月
    int month = cal.get(Calendar.MONTH) + 1;
    // 设置日
    int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
    System.out.print(year + "年" + month + "月" + dayOfMonth + "日");
    }
    }
    ```

    ```java
    import java.util.Calendar;

    public class Demo07CalendarMethod {
    public static void main(String[] args) {
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, 2020);
    System.out.print(year + "年" + month + "月" + dayOfMonth + "日"); // 2020年1月17日
    }
    }
    ```

    #### add方法

    add方法可以对指定日历字段的值进行加减操作,如果第二个参数为正数则加上偏移量,如果为负数则减去偏移量。代码如:

    ```java
    import java.util.Calendar;

    public class Demo08CalendarMethod {
    public static void main(String[] args) {
    Calendar cal = Calendar.getInstance();
    System.out.print(year + "年" + month + "月" + dayOfMonth + "日"); // 2018年1月17日
    // 使用add方法
    cal.add(Calendar.DAY_OF_MONTH, 2); // 加2天
    cal.add(Calendar.YEAR, -3); // 减3年
    System.out.print(year + "年" + month + "月" + dayOfMonth + "日"); // 2015年1月18日;
    }
    }
    ```

    #### getTime方法

    Calendar中的getTime方法并不是获取毫秒时刻,而是拿到对应的Date对象。

    ```java
    import java.util.Calendar;
    import java.util.Date;

    public class Demo09CalendarMethod {
    public static void main(String[] args) {
    Calendar cal = Calendar.getInstance();
    Date date = cal.getTime();
    System.out.println(date); // Tue Jan 16 16:03:09 CST 2018
    }
    }
    ```

    > 小贴士:
    >
    > ​ 西方星期的开始为周日,中国为周一。
    >
    > ​ 在Calendar类中,月份的表示是以0-11代表1-12月。
    >
    > ​ 日期是有大小关系的,时间靠后,时间越大。

    private static void demo04() {
            //使用getInstance方法获取Calendar对象
            Calendar c = Calendar.getInstance();
    
            Date date = c.getTime();
            System.out.println(date);
    -------------------------------------------------------
    Wed Jan 20 16:34:11 CST 2021

     

    private static void demo01() {
            //使用getInstance方法获取Calendar对象
            Calendar c = Calendar.getInstance();
            int year = c.get(Calendar.YEAR);
            System.out.println(year);
    
            int month = c.get(Calendar.MONTH);
            System.out.println(month);//西方的月份0-11 东方:1-12
    
            //int date = c.get(Calendar.DAY_OF_MONTH);
            int date = c.get(Calendar.DATE);
            System.out.println(date);
        }
    private static void demo02() {
            //使用getInstance方法获取Calendar对象
            Calendar c = Calendar.getInstance();
    
            //设置年为9999
            c.set(Calendar.YEAR,9999);
            //设置月为9月
            c.set(Calendar.MONTH,9);
            //设置日9日
            c.set(Calendar.DATE,9);
    
            //同时设置年月日,可以使用set的重载方法
            c.set(8888,8,8);
    
            int year = c.get(Calendar.YEAR);
            System.out.println(year);
    
            int month = c.get(Calendar.MONTH);
            System.out.println(month);//西方的月份0-11 东方:1-12
    
            int date = c.get(Calendar.DATE);
            System.out.println(date);
        }
     private static void demo03() {
            //使用getInstance方法获取Calendar对象
            Calendar c = Calendar.getInstance();
    
            //把年增加2年
            c.add(Calendar.YEAR,2);
            //把月份减少3个月
            c.add(Calendar.MONTH,-3);
    
    
            int year = c.get(Calendar.YEAR);
            System.out.println(year);
    
            int month = c.get(Calendar.MONTH);
            System.out.println(month);//西方的月份0-11 东方:1-12
    
            //int date = c.get(Calendar.DAY_OF_MONTH);
            int date = c.get(Calendar.DATE);
            System.out.println(date);
        }

     

     

     System类

    - `public static long currentTimeMillis()`:返回以毫秒为单位的当前时间。
    - `public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)`:将数组中指定的数据拷贝到另一个数组中。

    currentTimeMillis方法

    实际上,currentTimeMillis方法就是 获取当前系统时间与1970年01月01日00:00点之间的毫秒差值

     

    //获取当前时间毫秒值
    System.out.println(System.currentTimeMillis()); 

    ### 练习

    验证for循环打印数字1-9999所需要使用的时间(毫秒)

    ~~~java
    public class SystemTest1 {
    public static void main(String[] args) {
    long start = System.currentTimeMillis();
    for (int i = 0; i < 10000; i++) {
    System.out.println(i);
    }
    long end = System.currentTimeMillis();   date.gettime()
    System.out.println("共耗时毫秒:" + (end - start));
    }
    }
    ~~~

    arraycopy方法

    * `public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)`:将数组中指定的数据拷贝到另一个数组中。

    数组的拷贝动作是系统级的,性能很高。System.arraycopy方法具有5个参数,含义分别为:

    | 参数序号 | 参数名称 | 参数类型 | 参数含义 |
    | ---- | ------- | ------ | ---------- |
    | 1 | src | Object | 源数组 |
    | 2 | srcPos | int | 源数组索引起始位置 |
    | 3 | dest | Object | 目标数组 |
    | 4 | destPos | int | 目标数组索引起始位置 |
    | 5 | length | int | 复制元素个数 |

    private static void demo02() {
            //定义源数组
            int[] src = {1,2,3,4,5};
            //定义目标数组
            int[] dest = {6,7,8,9,10};
            System.out.println("复制前:"+ Arrays.toString(dest));
            //使用System类中的arraycopy把源数组的前3个元素复制到目标数组的前3个位置上
            System.arraycopy(src,0,dest,0,3);
            System.out.println("复制后:"+ Arrays.toString(dest));
        }

     

     

     

     

     

     

    StringBuilder类

     字符串拼接问题

    由于String类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象。例如:

    ~~~java
    public class StringDemo {
    public static void main(String[] args) {
    String s = "Hello";
    s += "World";
    System.out.println(s);
    }
    }
    ~~~

    在API中对String类有这样的描述:字符串是常量,它们的值在创建后不能被更改。

    根据这句话分析我们的代码,其实总共产生了三个字符串,即`"Hello"`、`"World"`和`"HelloWorld"`。引用变量s首先指向`Hello`对象,最终指向拼接出来的新字符串对象,即`HelloWord` 。

    ![](imgString拼接问题.bmp)

    由此可知,如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。为了解决这一问题,可以使用`java.lang.StringBuilder`类。

    StringBuilder概述

    StringBuilder是个字符串的缓冲区,即它是一个容器,容器中可以装很多字符串。并且能够对其中的字符串进行各种操作。

    它的内部拥有一个数组用来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容。StringBuilder会自动维护数组的扩容。原理如下图所示:(默认16字符空间,超过自动扩充)

    ![06-StringBuilder的原理](img6-StringBuilder的原理.png)

    构造方法

    根据StringBuilder的API文档,常用构造方法有2个:

    - `public StringBuilder()`:构造一个空的StringBuilder容器。
    - `public StringBuilder(String str)`:构造一个StringBuilder容器,并将字符串添加进去。

    public static void main(String[] args) {
            //空参数构造方法
            StringBuilder bu1 = new StringBuilder();
            System.out.println("bu1:"+bu1);//bu1:""
    
            //带字符串的构造方法
            StringBuilder bu2 = new StringBuilder("abc");
            System.out.println("bu2:"+bu2);//bu2:abc
        }
    ------------------------
    bu1:
    bu2:abc
        public static void main(String[] args) {
            //创建StringBuilder对象
            StringBuilder bu = new StringBuilder();
            System.out.println("abc".toUpperCase().toLowerCase().toUpperCase().toLowerCase());
            bu.append("abc").append(1).append(true).append(8.8).append('中');
            System.out.println(bu);//abc1true8.8中
    --------------------------------------------------
    abc
    abc1true8.8中
        public static void main(String[] args) {
            //String->StringBuilder
            String str = "hello";
            System.out.println("str:"+str);
            StringBuilder bu = new StringBuilder(str);
            //往StringBuilder中添加数据
            bu.append("world");
            System.out.println("bu:"+bu);
    
            //StringBuilder->String
            String s = bu.toString();
            System.out.println("s:"+s);
        }

     

    ## 4.4 常用方法

    StringBuilder常用的方法有2个:

    - `public StringBuilder append(...)`。
    - `public String toString()`:

     

    StringBuilder builder = new StringBuilder();
    public StringBuilder append(任意类型)
    builder.append("hello");
    builder.append("world");
    builder.append(true);
    builder.append(100);

    ### toString方法

    通过toString方法,StringBuilder对象将会转换为不可变的String对象。如:

    StringBuilder("Hello").append("World").append("Java");
    // 调用方法
    String str = sb.toString();
    System.out.println(str); // HelloWorldJava
    }

    # 第五章 包装类(数字类型和char )

    ## 5.1 概述  .parse  字符串转数字

    Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而很多情况,会创建对象使用,因为对象可以做更多的功能,如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类,如下:

    | 基本类型 | 对应的包装类(位于java.lang包中) |
    | ------- | --------------------- |
    | byte | Byte |
    | short | Short |
    | int | **Integer** |
    | long | Long |
    | float | Float |
    | double | Double |
    | char | **Character** |
    | boolean | Boolean |

    ## 5.2 装箱与拆箱

    基本类型与对应的包装类对象之间,来回转换的过程称为”装箱“与”拆箱“:

    * **装箱**:从基本类型转换为对应的包装类对象。

    * **拆箱**:从包装类对象转换为对应的基本类型。

    用Integer与 int为例:(看懂代码即可)

    基本数值---->包装对象

    ~~~java
    Integer i = new Integer(4);//使用构造函数函数
    Integer iii = Integer.valueOf(4);//使用包装类中的valueOf方法
    ~~~

    包装对象---->基本数值

    ~~~java
    int num = i.intValue();
    ~~~
    ## 5.3自动装箱与自动拆箱

    由于我们经常要做基本类型与包装类之间的转换,从Java 5(JDK 1.5)开始,基本类型与包装类的装箱、拆箱动作可以自动完成。例如:

    ```java
    Integer i = 4;//自动装箱。相当于Integer i = Integer.valueOf(4);
    i = i + 5;//等号右边:将i对象转成基本数值(自动拆箱) i.intValue() + 5;
    //加法运算完成后,再次装箱,把基本数值转成对象。
    ```

    ## 5.3 基本类型与字符串之间的转换

    ### 基本类型转换为String

    基本类型转换String总共有三种方式,查看课后资料可以得知,这里只讲最简单的一种方式:

    ~~~
    基本类型直接与””相连接即可;如:34+""
    ~~~

    String转换成对应的基本类型

    除了Character类之外,其他所有包装类都具有parseXxx静态方法可以将字符串参数转换为对应的基本类型:

    - `public static byte parseByte(String s)`:将字符串参数转换为对应的byte基本类型。
    - `public static short parseShort(String s)`:将字符串参数转换为对应的short基本类型。
    - `public static int parseInt(String s)`:将字符串参数转换为对应的int基本类型。
    - `public static long parseLong(String s)`:将字符串参数转换为对应的long基本类型。
    - `public static float parseFloat(String s)`:将字符串参数转换为对应的float基本类型。
    - `public static double parseDouble(String s)`:将字符串参数转换为对应的double基本类型。
    - `public static boolean parseBoolean(String s)`:将字符串参数转换为对应的boolean基本类型。

    代码使用(仅以Integer类的静态方法parseXxx为例)如:

    ```java
    public class Demo18WrapperParse {
    public static void main(String[] args) {
    int num = Integer.parseInt("100");
    }
    }
    ```

    > 注意:如果字符串参数的内容无法正确转换为对应的基本类型,则会抛出`java.lang.NumberFormatException`异常。
    >

     装箱和拆箱

    import java.util.ArrayList;
    
    /*
        自动装箱与自动拆箱:基本类型的数据和包装类之间可以自动的相互转换
        JDK1.5之后出现的新特性
     */
    public class Demo02Ineger {
        public static void main(String[] args) {
            /*
                自动装箱:直接把int类型的整数赋值包装类
                Integer in = 1; 就相当于 Integer in = new Integer(1);
             */
            Integer in = 1;
    
            /*
                自动拆箱:in是包装类,无法直接参与运算,可以自动转换为基本数据类型,在进行计算
                in+2;就相当于 in.intVale() + 2 = 3
                in = in.intVale() + 2 = 3 又是一个自动装箱
             */
            in = in+2;
    
            ArrayList<Integer> list = new ArrayList<>();
            /*
                ArrayList集合无法直接存储整数,可以存储Integer包装类
             */
            list.add(1); //-->自动装箱 list.add(new Integer(1));
    
            int a = list.get(0); //-->自动拆箱  list.get(0).intValue();
        }
    }

    tostring()

     

    public class Demo03StringBuilder {
        public static void main(String[] args) {
            //String->StringBuilder
            String str = "hello";
            System.out.println("str:"+str);
            StringBuilder bu = new StringBuilder(str);
            //往StringBuilder中添加数据
            bu.append("world");
            bu.append(22);
            System.out.println("bu:"+bu);
    
            //StringBuilder->String
            String s = bu.toString();
            System.out.println("s:"+s);
        }
    }

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    Android AHandle AMessage
    android java 与C 通过 JNI双向通信
    android 系统给应用的jar
    UE4 unreliable 同步问题
    UE4 difference between servertravel and openlevel(多人游戏的关卡切换)
    UE4 Run On owing Client解析(RPC测试)
    UE4 TSubclassOf VS Native Pointer
    UE4 内容示例网络同步Learn
    UE4 多人FPS VR游戏制作笔记
    UE4 分层材质 Layerd Materials
  • 原文地址:https://www.cnblogs.com/qj696/p/14295831.html
Copyright © 2011-2022 走看看