day12_常用类

今日内容

1.作业
2.StringBuffer和StringBuilder
3.包装类
4.数学类
5.日期类
6.随机数类
7.系统类

零、复习

object类有什么作用

  • 是所有类的父类(超类super class)
  • 提供了一些方法,供子类重写
  • ? 深层次的自己去理解,假设不要Object,整个jdk生态该怎么设计?

equals什么作用

  • 比较两个对象是否相等
  • 但是Object类的equals方法是使用==判断对象地址是否相等
  • 没意义,每个子类重写以判断对象内容(属性)

String声明的字符串能不能变

  • 不能改变

写出String方法名

  • 获得字符串长度 int length()
  • 判断字符串是否相等 boolean equlas(Object obj)
  • 将任何数据类型转成字符串 static String valueOf(参数)
  • 按照指定开始,结束下标截取字符串 String substring(int beginIndex,int endIndex)

一、作业

二、StringBuffer和StringBuilder[重点]

String类代表的字符串不能更改

字符串缓冲区允许字符串更改 —>StringBuffer和StringBuilder就是字符串缓冲区

StringBuffer字符串缓冲区,StringBuilder是它"升级版"

2.1 StringBuffer

  • 代表字符串
  • 可变字符串
  • 线程安全(线程同步)
  • 提供很多方法,允许改变字符串内容
    • append() 追加内容到末尾
    • insert() 插入内容到指定位置
    • delete* () 删除内容
    • setCharAt() 修改内容
    • 其他方法基本上与String一致
  • 还需要掌握: String <–> StringBuffer之间相互转换的方法
    public static void main(String[] args) {

        // 通过构造方法创建StringBuffer
        // 其实也是将String变为StringBuffer的
        StringBuffer sb = new StringBuffer("java");
        System.out.println(sb );

        // 改变字符串,append,追加
        // 提供了很多重载的方法,允许追加各种类型数据到字符中
        sb.append(666);
        System.out.println(sb );

        // 改变字符串,insert(),插入
        sb.insert(4,"-");
        System.out.println(sb );

        // 将StringBuffer变为String
        String s = sb.toString( );
        String s1 = String.valueOf(sb);

    }

2.2 StringBuilder

StringBuilder的API几乎完全和StringBuffer一致,设计该类的目的就是为了在单线程情况下替换StringBuffer,因为不保证线程安全的话,执行速度快

// 演示略

2.3 总结

String StringBuffer StringBuilder
字符改变 不能更改 可以 可以
线程是否安全 安全 安全 不安全
拼接效率 极低 较快 最快
出现版本 1.0 1.0 1.5

即以后如果只是表示字符串,用String

如果要频繁大量拼接字符串,建议使用StringBuilder

除非特别说明要保证线程安全,这样才使用StringBuffer

三、系统类[了解]

System 系统类,java.lang包下

  • 系统类提供的 正常输出 System.out.println()
  • 系统类提供的 错误输出 System.err.println()
  • System.currentTimeMillis() 获得当前系统时间毫秒值
    • 程序中时间的起始点是1970-01-01 00:00:00
  • System.arraycopy() 数组拷贝
  • System.exit(0) 0是正常退出(直接停止jvm)
   public static void main(String[] args) {
        // - 系统类提供的 正常输出 System.out.println()
        // - 系统类提供的 错误输出 System.err.println()
        System.err.println("Exception in thread \"mian\" NullPointerException" );

        long l = System.currentTimeMillis( );
        System.out.println(l );
    }

四、数学类[熟悉]

Math类提供了一些操作数学运算的方法

方法都是静态的,通过类名调用

    public static void main(String[] args) {
        double pi = Math.PI;// 圆周率π
        System.out.println(pi );

        // 绝对值
        System.out.println(Math.abs(3000 - 5000) );
        // 开几次幂
        System.out.println(Math.pow(2,3) );
        System.out.println(Math.pow(4,0.5) );
        // 四舍五入(取整)
        System.out.println(Math.round(5.5) );
        System.out.println(Math.round(-5.4) );
        // 随机数(0-1之间)
        System.out.println(Math.random() );
        // 向上取整(向上取最小整数)
        System.out.println(Math.ceil(13.2) );
        // 向下取整
        System.out.println(Math.floor(13.2) );
    }

五、包装类

包装类是对一系列包装成类的那些类的统称

主要是: 基本数据类型8个包装成8个引用类型中的类

int a = 1; // 基本类型数据只能代表一个数据,可以做简单数学运算

Integer a = 1;// 将其包装成类,那就是对象,其中就有属性和方法可以使用


包装类有什么好处? 自己想

经验告诉我们,包装类主要用在一个地方: 基本数据类型和String之间的转换

基本类型 包装类
byte Byte
short Short
int Integer
long Long
Float
double Double
boolean Boolean
char Character

ps: 虽然有8个基本数据类型,我们只学习2个(Integer,Character)

5.1 Integer

public static void main(String[] args) {
        // 没有无参构造
        // 基本类型当参数创建包装类
        Integer i1 = new Integer(1);
        // 字符串String当参数创建包装类
        Integer i2 = new Integer("1");

        System.out.println(i1 );
        System.out.println(i2 );

        // 包装类获得基本类型
        int i3 = i1.intValue( );

        // 其他类型变成包装类
        Integer i4 = Integer.valueOf(1);
        Integer i5 = Integer.valueOf("1");

        // [[非常重要]]的方法
        // int parseInt(String s)
        int i6 = Integer.parseInt("1");
    }

5.2 自动装箱&拆箱

装箱: 将基本类型包装成类的过程

拆箱: 将包装类中的基本类型取出


自动拆箱装箱就是,不需要再调用方法完成这个功能,自动可以进行

        // 自动装箱(基本类型直接赋值给包装类)
        Integer i = 1;
        
        // 拆箱(直接取值)
        int a = i;

day12_常用类_第1张图片

5.3 Character[了解]

“12” --> 12

“12” --> char无法转型


Character包装类作用不是为了和String转换的,主要目的是提供了一些方法可以操作字符

  • 判断是否是大小写 isLowerCase isUpperCase
  • 判断是否是字母 isLetter
  • 判断是否是数字 idDigit
  • 转换大小写 toLowerCase toUpperCase

5.5 总结

包装类最重要的类是Integer,Integer最重要方法

  • 自动装箱
  • 自动拆箱
  • Integer.parseInt()

六、日期

6.1 Date[重要]

将日期数据封装成对象来表示

Date类表示某一瞬间,该类有很多方法表示日期时间或者指定日期时间


ps1: Date类中有很多方法都过时了,不建议用,而是建议使用Calendar使用

ps2: JDK8新特性,日期有新的API

public class Demo5_Date {
    public static void main(String[] args) {

        // 默认创建的是当前时间
        Date date = new Date( );
        System.out.println(date );

        // 可以指定年月日创建时间(了解,已经过时)
        // 月份从0开始 0-11
        // 年份-1900
        Date date2 = new Date(100, 0, 1);
        System.out.println(date2 );

        // 没过时的方法
        // 获得从1970-01-01 00:00:00 距date的毫秒值
        long time = date.getTime( );
        System.out.println(time );
        // 练习: 计算你出生了多少天?

        // 设置毫秒值(改时间)
        date.setTime(1*1000*60*60*24*365L);
        System.out.println(date );

        //=============== Date的应用 ============
        Student student = new Student( );
        student.setAge(18);
        student.setName("ELK");
        student.setBirthday(new Date(105,1,1 ));

        System.out.println(student );
    }
}

总结: 大部分方法都过时了,所以只需要记住

  • 空参构造,创建当前时间
  • setTime() 指定毫秒值
  • getTime() 获得毫秒值

另外记住应用: 一般都是用来描述时间类型数据的,类似

day12_常用类_第2张图片

6.2 SimpleDateFormat[重要]

SimpleDateFormat该类主要用来

  • 格式化日期: 将日期对象变为日期字符串
    • 将日期对象按照指定模板变成字符串,目的就是方便阅读/查看
    • 方法名: String format(Date d)
  • 解析日期: 将日期字符串变为日期对象
    • 将日期字符串按照模板变成日期对象,目的方便调用日期api
    • 方法名: Date parse(String s)

日期模板(模式)怎么写?

  • y 年,M月,d 天 H(h)时 m分 s 秒
  • 常见模板
    • yyyy/MM/dd 2020/01/01
    • yyyy年MM月dd日 HH:mm:ss 2020年01月01日 15:26:03

这个模版是用在构造方法内,即通过模板创建对象

再通过对象调用方法完成格式化/解析时已经是有固定的格式

  //    throws ParseException 这个就是抛出异常
  public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");

        // 格式化(日期 --> 字符串)
        String str = sdf.format(new Date( ));
        System.out.println(str );

        // 解析(字符串 --> 日期)
        // [[特别注意: 只能按照模板解析]]
        String s = "1990年01月01日 12:01:03";
        Date date = sdf.parse(s);// ps: 记得抛出异常
        System.out.println(date );
    }

6.3 Calendar[了解]

Calendar日历类,主要是两个方法

  • set(日历字段,值) 根据指定字段设置值
  • get(日历字段) 得到指定日历字段的值

日历字段是Calendar类提供的静态属性,YEAR MONTH DAY_OF_MONTH HOURS MINUTE SECONDS


另外,Calendar是抽象类

    public static void main(String[] args) {
        // 因为是抽象类,不能直接new
        // 但是提供静态方法,调用可以获得对象
        // 默认当前时间
        Calendar rightNow = Calendar.getInstance();
        System.out.println(rightNow );

        int year = rightNow.get(Calendar.YEAR);
        int month = rightNow.get(Calendar.MONTH);
        int day = rightNow.get(Calendar.DAY_OF_MONTH);
        int hour = rightNow.get(Calendar.HOUR_OF_DAY);
        int minute = rightNow.get(Calendar.MINUTE);
        int second = rightNow.get(Calendar.SECOND);
        int week = rightNow.get(Calendar.DAY_OF_WEEK);// 周
        // 周是周日是1 ~ 周六是7

        System.out.println(year );
        System.out.println(month );// 月份从0开始
        System.out.println(day );
        System.out.println(hour );
        System.out.println(minute );
        System.out.println(second );
        System.out.println(week );

        System.out.println("---------------" );
        rightNow.set(Calendar.YEAR,2000);// 按照字段设置值
        System.out.println(rightNow.get(Calendar.YEAR) );

        rightNow.set(1990,1,1);// 直接设置年月日
        System.out.println(rightNow.get(Calendar.YEAR) );
        System.out.println(rightNow.get(Calendar.MONTH) );
        System.out.println(rightNow.get(Calendar.DAY_OF_MONTH) );

    }

七、随机数

Random类,该类的方法可以产生随机数

  • nextInt(int n) 随机产生0~n之间(但不包含n的数)
    public static void main(String[] args) {
        // 创建对象
        Random random = new Random( );

        // 调用方法
        int nextInt = random.nextInt(10 );
        System.out.println(nextInt );

        System.out.println("---------" );
        // 摇骰子
        System.out.println(random.nextInt( 6 )+1 );
        // 产生6位数验证码
        // 思路是: 每次产生1位数,拼接
        Random r1 = new Random( );
        StringBuilder sb = new StringBuilder( );

        for (int i = 0; i < 6; i++) {
            int n = r1.nextInt(10);
            sb.append(n);
        }
        System.out.println("验证码:"+sb );
    }

你可能感兴趣的:(#,Java2313,python,java,开发语言)