javaday09

目录

Day09---API1

1       Object1

1.1      概念. 1

1.2      常用方法. 1

1.2.1    toString()1

1.2.2    equals(Object obj)1

1.2.3     hashCode()1

1.3      测试. 1

2       String1

2.1      特点. 1

2.1.1     是一个封装char[]数组的对象. 1

2.1.2     字符串不可变. 1

2.2      创建String对象. 1

2.3      常见方法. 1

2.4      测试. 1

3       StringBuilder/StringBuffer1

3.1      特点. 1

3.2      常见方法. 1

3.3      练习:测试字符串连接效率. 1

4       包装类. 1

4.1      与基本类型的对应关系. 1

4.2      Number1

4.2.1     子类:. 1

4.2.2     常用的方法:. 1

4.3      Integer1

4.3.1     创建对象. 1

4.3.2     常见方法. 1

4.4      Double1

4.4.1     创建对象. 1

4.4.2     方法. 1

5       日期类Date1

5.1      概述. 1

5.2      创建对象. 1

5.3      常用方法. 1

5.4      练习1:测试日期类的常用方法. 1

6       日期工具SimpleDateFormat1

6.1      概述. 1

6.2      创建对象. 1

6.3      常见方法. 1

6.4      练习1 :计算存活天数. 1

7       BigDecimal/BigInteger1

7.1      概述. 1

7.2      创建对象. 1

7.3      常用方法. 1

7.4      练习1:测试常用方法. 1

8       内部类. 1

8.1      内部类. 1

8.2      匿名内部类. 1

9       拓展. 1

9.1      ==和equals的区别. 1

9.2      StringBuilder和StringBuffer的区别. 1

9.3      自动装箱和自动拆箱. 1

9.4      简单了解内部类的分类. 1

 

Day09---API

API:Application Programming Interface应用编程接口,一切可以调用的东西都是API。

java.lang包,这个包会自动导入。

java.lang.Object

java.lang.String

java.lang.StringBuilder/StringBuffer

正则表达式

包装类等

 

1   Object

1.1  概念

所有类的顶级父类

存在于java.lang包中,这个包不需要我们手动导包

1.2  常用方法

1.2.1     toString() 

默认返回   类名@地址  的格式,来展示对象的地址值,如:a00000.Student@a0834e7。

如果想看属性值我们可以重写这个方法,重写后返回的就是把属性值拼接成一个字符串。

如:Student [name=苏大强, age=20, id=10001]

1.2.2     equals(Object obj) 

当前对象和参数对象比较大小,默认是比较内存地址,如果要比较对象的属性,可以重写该方法。

1.2.3 hashCode()

返回该对象的哈希码值。

1.3  测试

创建day09工程

创建cn.tedu.objectdemo包

创建Test1_Object.java

package cn.tedu.objectdemo;

 

//测试Object

//1、toString():默认的Object里提供的功能是,打印对象的地址值。如果要看对象的属性值,需要发生方法重写

public class Test1_Object {

    public static void main(String[] args) {

       //创建Person对象测试

       Person p = new Person("jack",18);

       //1、查看属性的值,不想打印对象时,默认调用Object的toString(),要重写toString()

       //默认:cn.tedu.objectdemo.Person@659e0bfd

       //重写后:Person [name=jack, age=18]

       System.out.println(p.toString());

      

      

       //2、hashCode():对象在内存中的哈希码值/编号

       System.out.println(p.hashCode());//1704856573

      

       //TODO 3、equals(Object obj) :指示其他某个对象是否与此对象“相等”。

       //默认使用了Object提供的比较方式==比较,会比较两个对象的地址值

       System.out.println( p.equals( new Person() ) );//false

      

    }

}

//创建Person类

class Person extends Object{

    //构造方法

    public Person() {}

    public Person(String name, int age) {

       super();

       this.name = name;

       this.age = age;

    }

   

    private String name;

    private int age;

   

    //set()/get()

    public String getName() {

       return name;

    }

    public void setName(String name) {

       this.name = name;

    }

    public int getAge() {

       return age;

    }

    public void setAge(int age) {

       this.age = age;

    }

    //重写toString()用来查看属性值,否则就是用了Object默认的打印地址值

    @Override

    public String toString() {

       return "Person [name=" + name + ", age=" + age + "]";

    }

}

 

 

2   String

2.1  特点

2.1.1     是一个封装char[]数组的对象

2.1.2     字符串不可变

 

2.2  创建String对象

如果是第一次使用字符串,java会在字符串常量池创建一个对象。

再次使用相同的内容时,会直接访问常量池中存在的对象。

方式1:

String(char[] value)

          分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。

String()

          初始化一个新创建的 String 对象,使其表示一个空字符序列。         

方式2:String name= ”abc”;

2.3  常见方法

length()

charAt()

lastIndexOf()

substring()

equals()

startsWith()

endsWith()

split()

trim() 去除字符串两端的空格

2.4  测试

package cn.tedu.stringdemo;

 

import java.util.Arrays;

import java.util.Scanner;

 

//测试String类

public class Test2_String {

    public static void main(String[] args) {

       //1、创建String对象

       char[] a = new char[] {'h','e','l','l','o'};

       String str = new String(a);//存在堆内存中

      

       //存在堆内存中的常量池中,如果常量池中存过,直接用-提高效率

       String str2 = "hello";

      

       //2、调用功能

       //TODO 测试String类的其他方法

       System.out.println(str.charAt(4));//返回指定索引处的 char 值

       System.out.println(str.endsWith("lo"));//测试此字符串是否以指定的后缀结束。

 

//默认Object里的equals()用来比对象的地址,String已经重写了equals(),用来把字符串存着的值进行比较

       System.out.println(str.equals("hello"));//true

      

       byte[]  bs = str.getBytes();//string转byte[]

       System.out.println(Arrays.toString(bs));

      

       System.out.println(str.hashCode());//哈希码值

       str="abcdabe";

       System.out.println(str.indexOf("a"));//a第一次出现的索引值

       System.out.println(str.lastIndexOf("a"));//a最后一次出现的索引值

       System.out.println(str.length());

       System.out.println(str.startsWith("abc"));

       System.out.println(str.toLowerCase());

       System.out.println(str.toUpperCase());

       System.out.println(str.substring(3));

       //substring(m,n)--m是开始的索引,n是结束的索引,含头不含尾--[m,n)

       System.out.println(str.substring(3,5));//da

      

       str="    a  bc    ";

       System.out.println(str.trim());//a  bc

       System.out.println(String.valueOf(1000)+1);//10001

      

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

      

       //接收键盘输入的一串数字,提取出来求和

       String num = new Scanner(System.in).nextLine();

       //遍历得到字符串的每个元素

       int count  = 0;//定义变量记录整数的和

       for(int i = 0 ; i < num.length() ; i++) {

           char  c = num.charAt(i);

           //把字符变成整数,是指把'1'变成数字49,拿着数字求和

           Integer sum = Integer.valueOf(c);

           //把数字求和

           count = count+sum;

       }

       System.out.println(count);

      

    }

   

}

 

3   StringBuilder/StringBuffer

3.1  特点

1、  封装了char[]数组

2、  是可变的字符序列

3、  提供了一组可以对字符内容修改的方法

4、  常用append()来代替字符串做字符串连接

5、  内部字符数组默认初始容量是16:super(str.length() + 16);

6、  如果大于16会尝试将扩容,新数组大小原来的变成2倍+2,容量如果还不够,直接扩充到需要的容量大小。int newCapacity = value.length * 2 + 2;

3.2  常见方法

append()

3.3  练习:测试字符串连接效率

package cn.tedu.stringdemo;

 

//测试字符串拼接效率

public class Test3_String2 {

    public static void main(String[] args) {

//     method();// 用+拼接字符串

       method2();// 用工具类优化拼接效率

    }

 

    // 用工具类优化拼接效率

    private static void method2() {

       String str = "abcdefghijklmnopqrstuvwxyz";

 

       // 拼接指定字符串10000次

//     String result = "";// 记录拼接结果

       StringBuffer sb = new StringBuffer();

      

       long start = System.currentTimeMillis();// 获取当前的毫秒值

       for (int i = 0; i < 10000; i++) {

//         result = result + str;// +拼接

           sb.append(str);

       }

       long end = System.currentTimeMillis();// 获取当前的毫秒值

       System.out.println(end - start);// 给程序计时,2ms

    }

 

    // 用+拼接字符串

    private static void method() {

       String str = "abcdefghijklmnopqrstuvwxyz";

 

       // 拼接指定字符串10000次

       String result = "";// 记录拼接结果

 

       long start = System.currentTimeMillis();// 获取当前的毫秒值

       for (int i = 0; i < 10000; i++) {

           result = result + str;// +拼接

       }

       long end = System.currentTimeMillis();// 获取当前的毫秒值

       System.out.println(end - start);// 给程序计时,2305ms

    }

 

}

4   包装类

把基本类型进行包装,提供更加完善的功能。

4.1  与基本类型的对应关系

 

4.2  Number

数字包装类的抽象父类。

提供了各种获取值的方式。

4.2.1     子类:

 

4.2.2     常用的方法:

 

4.3  Integer

4.3.1     创建对象

1、new Integer(5);

2、Integer.valueOf(5);

在Integer类中,包含256个Integer缓存对象,范围是 -128到127。使用valueOf()时,如果指定范围内的值,访问缓存对象,而不新建;如果指定范围外的值,直接新建对象。

4.3.2     常见方法

static int parseInt(String s)

          将字符串参数作为有符号的十进制整数进行解析。

static Integer valueOf(String s)

          返回保存指定的 String 的值的 Integer 对象。          

4.4  Double

4.4.1     创建对象

1、new Double(3.14)

2、Double.valueOf(3.14)//和 new 没有区别

4.4.2     方法

static double parseDouble(String s)

          返回一个新的 double 值,该值被初始化为用指定 String 表示的值,这与 Double 类的 valueOf 方法一样。

static Double valueOf(double d)

          返回表示指定的 double 值的 Double 实例。

 

5   日期类Date

5.1  概述

存在于java.util.Date包。

用来封装一个毫秒值表示一个精确的时间点。

从1970-1-1  0点开始的毫秒值。

5.2  创建对象

new Date():封装的是系统当前时间的毫秒值

new Date(900000000000L):封装指定的时间点

5.3  常用方法

getTime():取内部毫秒值

setTime():存取内部毫秒值

getMonth():获取当前月份

getHours():获取当前小时

compareTo(Date):当前对象与参数对象比较。当前对象大返回正数,小返回负数,相同0。

5.4  练习1:测试日期类的常用方法

package cn.tedu.date;

 

import java.util.Date;

 

//测试Date类

public class Test5_Date {

 

       public static void main(String[] args) {

              //1、创建日期对象java.util.Date

              Date d = new Date();

             

              //2、调用常用方法

              System.out.println(d.getDate());//每个月的第几天

              System.out.println(d.getDay());//星期几

              System.out.println(d.getHours());//现在是几点

              System.out.println(d.getMinutes());//现在是哪一分钟

              System.out.println(d.getMonth());//11,因为底层代码用0-11表示一年的12个月

              System.out.println(d.getSeconds());//哪一秒

              System.out.println(d.getTime());//返回自 1970 年 1 月 1 日 00:00:00到现在的毫秒数

              System.out.println(d.getYear());//从1900 年到现在是多少年了

             

             

       }

 

}

6   日期工具SimpleDateFormat

6.1  概述

日期格式化工具,可以把Date对象格式化成字符串,也可以日期字符串解析成Date对象。

6.2  创建对象

new SimpleDateFormat(“格式”)

格式:yyyy-MM-dd HH:mm:ss

MM/dd/yyyy..

6.3  常见方法

format(Date):把Date格式化成字符串

parse(String):把String解析成Date

6.4  练习1 :计算存活天数

接收用户输入的出生日期

计算存活天数

package cn.tedu.date;

 

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Scanner;

 

//计算存活日期

public class Test6_Date2 {

    public static void main(String[] args) {

       //1、接收用户输入的出生日期

       String birth = new Scanner(System.in).nextLine();

      

       //2、把字符串类型的日期  转换成 Date类型

       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

      

       try {

           //java.util.Date

           Date date = sdf.parse(birth);

          

           //列出出生那天的毫秒值

           long birthday = date.getTime();

          

           //现在的毫秒值

           long now = System.currentTimeMillis();

          

           System.out.println((now-birthday)/1000/60/60/24);

          

       } catch (ParseException e) {

           System.out.println("您输入的格式不正确!");

       }

    }

   

}

7   BigDecimal/BigInteger

7.1  概述

BigDecimal:常用来解决精确的浮点数运算。

BigInteger:常用来解决超大的整数运算。

7.2  创建对象

BigDecimal.valueOf(2);

BigDecimal(double val)

          将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。

7.3  常用方法

add(BigDecimal bd): 做加法运算

subtract(BigDecimal bd) : 做减法运算

multiply(BigDecimal bd) : 做乘法运算

divide(BigDecimal bd) : 做除法运算

divide(BigDecimal bd,保留位数,舍入方式):除不尽时使用

setScale(保留位数,舍入方式):同上

pow(int n):求数据的几次幂

7.4  练习1:测试常用方法

接收用户输入的两个数字,做运算。

package cn.tedu.bigdecimal;

 

import java.math.BigDecimal;

import java.util.Scanner;

 

//浮点数运算不精确的解决方案

public class Test7_BigDecimal {

       public static void main(String[] args) {

              //1、接收用户输入的两个小数

              double a = new Scanner(System.in).nextDouble();

              double b = new Scanner(System.in).nextDouble();

             

              //2、做运算

              System.out.println(a+b);//不精确

              System.out.println(a-b);//不精确

              System.out.println(a*b);//不精确

              System.out.println(a/b);//不精确

             

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

             

              //尽量不要用double参数的构造方法,推荐用String参数的

              BigDecimal bda = new BigDecimal(a+"");

              BigDecimal bdb = new BigDecimal(b+"");

             

              BigDecimal bdx = null;//记录运算结果

             

              bdx = bda.add(bdb);//add加法运算

              System.out.println(bdx);

             

              bdx = bda.subtract(bdb);//subtract减法运算

              System.out.println(bdx);

             

              bdx = bda.multiply(bdb);//multiply乘法运算

              System.out.println(bdx);

             

              //当除不尽时,divide会报异常

//           bdx = bda.divide(bdb);//divide除法运算

              //divide(m,n,o)-m是要运算的对象,n是要保留几位小数,o是保留方式

              bdx = bda.divide(bdb,3,BigDecimal.ROUND_HALF_UP);//divide除法运算

              System.out.println(bdx);

             

       }

      

      

}

 

 

 

 

8   内部类!

8.1  内部类

在 Java 中,允许在一个类(或方法、语句块)的内部定义另一个类,称为内部类(Inner Class),有时也称为嵌套类(Nested Class)。内部类和外层封装它的类之间存在逻辑上的所属关系,一般只用在定义它的类或语句块之内,实现一些没有通用意义的功能逻辑,在外部引用它时必须给出完整的名称。内部类主要用于设计具有互相协作关系的类集合。

通过将一个类定义在另一个类的内部,也可以有效的隐藏该类的可见性,实现极好的封装特性。但不易理解,实际开发使用不多。

8.2  匿名内部类

没有名字的类,没法new,那就在定义时就new出来一个类

类似于:new Student().show();

9   拓展

9.1  ==和equals的区别

1、 当使用==比较时,如果相比较的两个变量是引用类型,那么比较的是两者的物理地

值(内存地址),如果相比较的两个变量都是数值类型,那么比较的是具体数值是否相等。

2、 当使用equals()方法进行比较时,比较的结果实际上取决于equals()方法的具体实现

众所周知,任何类都继承自Object类,因此所有的类均具有Object类的特性,比如String、integer等,他们在自己的类中重写了equals()方法,此时他们进行的是数值的比较,而在Object类的默认实现中,equals()方法的底层是通过==来实现的。

9.2  StringBuilder和StringBuffer的区别

1、 在线程安全上,

--StringBuffer是旧版本就提供的,线程安全的。@since   JDK1.0

--StringBuilder是jdk1.5后产生,线程不安全的。@since       1.5

2、 在执行效率上,StringBuilder > StringBuffer > String

3、 源码体现:本质上都是在调用父类抽象类AbstractStringBuilder来干活,只不过Buffer把代码加了同步关键字,使得程序可以保证线程安全问题。

abstract class AbstractStringBuilder implements Appendable, CharSequence {

 

 

 

9.3  自动装箱和自动拆箱

自动装箱:把基本类型包装成一包装类的对象

Integer a = 5;//a是引用类型,引用了包装对象的地址。

编译器会完成对象的自动装箱:Integer a = Integer.valueOf(5);

 

自动拆箱:从包装对象汇总,自动去除基本类型值

  int i = a;//a现在是包装类型,没法给变量赋值,需要把5取出来。

编译器会完成自动拆箱:int i = a.intValue();

9.4  简单了解内部类的分类

如:静态内部类和非静态内部类

 

posted @ 2020-05-25 16:08  白驼山庄庄主  阅读(106)  评论(0编辑  收藏  举报