六.常用类,注解,反射和枚举类型

1、Object

Object类是所有类的父类,也就是说任何一个类在定义时如果没有明确地继承一个父类,那它就是Object类的子类                          

Object类提供无参构造方法 ,之所以提供这样的无参构造,是因为在子类对象实例化时都会默认调用父类中的无参构造方法,这样在定义类时即使没有明确定义父类为Object,读者也不会感觉代码的强制性要求。

Object类的常用方法 方法    说明

Object clone()    创建与该对象的类相同的新对象

boolean equals(Object)    比较两个对象是否相等。默认比较的是地址值。

void finalize()    当垃圾回收器确定不存在对该对象的更多引用时,对象的圾回收器调用该方法

Class getClass()    返回一个对象运行时的实例类(.class文件)

int hashCode()    返回该对象的散列码值

void notify()    激活等待在该对象的监视器上的一个线程

void notifyAll()    激活等待在该对象的监视器上的全部线程

String toString()    返回该对象的字符串表示,默认返回运行时类名+@+对象的hashCode的16进制数

void wait()    在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待

注意:

    如果两个对象的哈希码值不同,那这两个对象一定不等;

    如果两个对象的哈希码值相同,不能确保这两个对象一定相等。

    克隆对象对应的类需要实现Cloneable接口,否则会报错:java.lang.CloneNotSupportedException

如何获取类的字节码文件对象?

    类名.class 说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象

    Class.forName("类名字符串") (注:类名字符串是包名+类名) 说明:装入类,并做类的静态初始化,返回Class的对象

    实例对象.getClass() 说明:对类进行静态初始化、非静态初始化; 返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中) 所属的类的Class的对象

常覆写Object类的3个方法:toString(),equals(Object obj),hashCode()

为什么notify(), wait()等函数定义在Object中,而不是Thread中?

Object中的wait(), notify()等函数,和synchronized一样,会对“对象的同步锁”进行操作。

wait()会使“当前线程”等待,因为线程进入等待状态,所以线程应该释放它锁持有的“同步锁”,否则其它线程获取不到该“同步锁”而无法运行!

OK,线程调用wait()之后,会释放它锁持有的“同步锁”;而且,根据前面的介绍,我们知道:等待线程可以被notify()或notifyAll()唤醒。现在,请思考一个问题:notify()是依据什么唤醒等待线程的?或者说,wait()等待线程和notify()之间是通过什么关联起来的?答案是:依据“对象的同步锁”。

负责唤醒等待线程的那个线程(我们称为“唤醒线程”),它只有在获取“该对象的同步锁”(这里的同步锁必须和等待线程的同步锁是同一个),并且调用notify()或notifyAll()方法之后,才能唤醒等待线程。虽然,等待线程被唤醒;但是,它不能立刻执行,因为唤醒线程还持有“该对象的同步锁”。必须等到唤醒线程释放了“对象的同步锁”之后,等待线程才能获取到“对象的同步锁”进而继续运行。

总之,notify(), wait()依赖于“同步锁”,而“同步锁”是对象锁持有,并且每个对象有且仅有一个!这就是为什么notify(), wait()等函数定义在Object类,而不是Thread类中的原因。

2、String

表示的是字符串,字符串是常量(值定义了之后,不可修改)

字符串可以看出是多个字符的连接

1)构造方法

String():创建一个空的字符串

String(byte[] bys):通过字节数组创建字符串

String(char[] chs):通过字符数组创建字符串

String(byte[] bys,int offset,int length):通过字节数组一部分创建字符串

String(char[] chs,int offset,int length):通过字符数组一部分创建字符串

String(String original):通过字符串常量值创建字符串

2)成员方法

1》判断功能

equals(Object obj):比较两个字符串是否相等

equalsIngnoreCase(Object obj):忽略大小写比较两个字符串是否相等

contains(String str):是否包含指定字符串

startsWith(String str):是否以指定的字符串开头

endWith(String str):是否以指定的字符串结尾

isEmpty():是否为空

matches(String regex):判断字符串是否匹配给定的正则表达式。

2》获取功能

length():获取长度

charAt(int index): 获取指定索引位置处的字符

indexOf(int ch):获取指定字符第一次出现的索引值(从0开始)

indexOf(int ch,int fromIndex):获取从指定索引位置开始,获取指定字符第一次出现的索引值

indexOf(String s):获取指定字符串第一次出现的索引值

indexOf(String s,int fromIndex):获取从指定索引位置开始,获取指定字符串第一次出现的索引值

lastIndexOf(int ch):获取指定字符最后一次出现的索引值

substring(int start):从指定位置开始一直截取到末尾

substring(int start,int end):截取[start,end-1]范围

3》转换功能

byte[] getBytes():将字符串转成字节数组

char[] toCharArray():将字符串转成字符数组

static valueOf(char[] chs):将char[]转成字符串

static valueOf(int num):将int类型转成字符串

static valueOf(Object obj):将任意类型转成字符串

toLowerCase():转成小写

toUpcase():转成大写

concat(String str):字符连接

4》其他功能

replace(char old,char new):将old字符替换成new字符

replace(String old,String new):将old字符串替换成new字符串

trim():去除两边空格

int compareTo(String s):字典比较,如果前面值小于后面值返回负数,否则返回正数,先比较第一个元素,如果相等再比较第二个元素...返回元素之间的差值;如果比较字符串有包含关系,返回的值是它们长度的差值

int compareToIgnoreCase(String s):忽略大小写字典比较

String replaceAll(String regex, String replacement):使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。

String replaceFirst(String regex, String replacement):使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。

String[] split(String regex):  根据给定正则表达式的匹配拆分此字符串。

String[] split(String regex, int limit): 根据匹配给定的正则表达式来拆分此字符串。

    /*

     * 字符串做连接操作

     * 如果是两个变量进行连接,先开辟空间,再连接

     * 如果是两个常量进行连接,先连接,获取连接结构值。然后在常量池里面查找有没有这个结果值,如果有,直接给地址值;没有,开辟空间

     */

         

public class StringTest02 {

        public static void main(String[] args) {

            String s1 = "hello";

            String s2 = "world";

            String s3 = "helloworld";

            

            System.out.println(s3 == s1+s2);                  //false

            System.out.println(s3.equals(s1+s2));             //true

            

            System.out.println(s3 == "hello"+"world");        //true

            System.out.println(s3.equals("hello"+"world"));   //true

        }

    }

编码表

编码表:由现实世界的字符和对应的数值组成的一张表

常见的有:

1)ASCII码:最高为是符号为,其他是数值位

2)ISO-8859-1:拉丁码表

3)BG2312:中文编码表

4)GBK:GB2312的升级版,1个汉字对应2个字节

5)GB18030:GBK的升级版

6)BIG-5:中文繁体编码表,俗称"大5码"

7)Unicode:国际标注码。所有字符都有两个字节表示

    Java默认使用该编码表

8)UTF-8:万国码,一个汉字对应3个字节

tips:所有编码表都兼容ASCII码表

String中与字符集相关的方法

String(byte[] by,String charset):通过指定的字符集,将指定的字节数组转成字符串(解码)

byte[] getBytes(String charset):通过指定的字符集,将字符串转成字节数组(编码)

正则表达式

负责字符串的匹配处理(一般用于校验字符串格式)

规则

1)字符

    x:x字符,a表a字符

    \\:反斜线字符

    \n:换行符

    \r:回车符

2)字符类

    [abc]:表示a、b、c中的一个字符

    [^abc]:表示除了a、b、c之外的任意一个字符

    [a-zA-Z]:表示a~z或A~Z中的一个字符

    [0-9]:表示数字

3)预定义字符类

    .:表示任意字符

     \.:表示'.'字符

    \d:表示数字字符,[0-9]

    \w:表示单词字符,[a-zA-Z_0-9]

4)边界匹配器

    ^:表示行的开头

    $:表示行的结尾

    \b:表示单词的边界

5)数量词

    ?:表示0次或者1次

    *:表示0次或者多次

    +:表示1次或者多次

    {n}:表示n次

    {n,}:表示至少n次

    {n,m}:n~m次

3、StringBuilder类

线程不安全的可变字符序列

1)构造方法

    StringBuilder():以默认容量创建空的StringBuilder对象

    StringBuilder(int capacity):以指定容量创建空的StringBuilder对象

    StringBuilder(String str):以指定的字符串创建StringBuilder对象

2)成员方法

获取功能

int capacity():获取容量

int length():获取长度

添加功能

append(int value):追加。可以追加多种类型

insert(int offset,String s):在指定的位置插入指定数据

删除功能

deleteCharAt(int index):删除指定索引处的元素

delete(int start,int end):删除[start,start-1]范围内的元素

替换功能

replace(int start,int end,String s):将[start,end-1]范围内的元素替换成指定字符串

反转功能

reverse():元素反转

截取功能

String subString(int start):截取指定位置一直到末尾

String subString(int start,int end):截取[start,end-1]范围

String、StringBuilder和StringBuffer的区别?

String内容不可改变

StringBuilder和StringBuffer内容可变

StringBuilder是线程不安全的,不同步,效率高

StringBuffer是线程安全的,同步,效率低

4、Scanner

1)构造方法

      Scanner(InputStream is)

      构造一个文本扫描器,它生成的值是从指定的值输入流扫描的

      System.in 是一个标准的输入流,属于InputStream

2)成员方法

      boolean hasNext():是否有下一个数,有true,没有false

      String next():获取下个数

      int nextInt():获取下个int数据

      String nextLine():获取一行数据

5、Math类

成员方法

abs(int a):绝对值

ceil(double d):向上取整

floor(double d):向下取整

max(int a,int b):最大值

pow(double a,double b):a的b次幂

random():随机数[0.0,1.0]

round(float f):四舍五入

sqrt(double d):算术平方根

6、Random类

1)构造方法

Random():以当前时间毫秒值作为种子,创建Random对象

Random(long seed):以指定种子创建Random对象

2)成员方法

nextInt():生成1个int类型范围的随机数

nextInt(int n):产生1个[0,n-1]范围内的随机数

生成0~n之间的数

①(int)Math.random()*(n+1)

②Random r  = new Random();

r.nextInt(m)表示生成[0,m-1]之间的随机数,也就是说random.nextInt(m+1),将生成[0,m]之间的随机整数。

r.nextInt(n+1)

生成n~m之间的随机数

①n+(int)(Math.random()*(m+1-n));

②Random r = new Random();

r.nextInt(m+1-n)+n;

7、Date类

表示特定的瞬间,精确到毫秒值

1)构造方法

Date():以当前时间毫秒值创建Date对象

Date(long time):以指定的毫秒值创建Date对象

2)成员方法

long getTime():获取Date对象的毫秒值

setTime(long time):设置Data对象的毫秒值

8、DateFormat

它是一个抽象类,用来格式化或者解析日期

格式化:Date————》String

解析:String————》Date

getDateInstance(int style,Locale loc):获取日期格式器,该格式器具有给定的语言环境和给定的格式化风格

String format(Date date):格式化

Date parse(String time):解析

9、SimpleDateFormat

它是DateFormat的子类

1)构造方法

SimpleDateFormat():以默认模式创建对象

SimpleDateFormat(String pattern):以指定模式创建对象

常用模式

yyyy:年     MM:月    dd:日

HH:时    mm:分    ss:秒

2)常成员方法

String format(Date date):格式化

Date parse(String time):解析

10、Calendar类

日历类,用于获取或者操作日历字段(年月日)

该类是一个抽象类,不可以实例化

成员方法

static Calender getInstance():以默认时区和语言创建日历

int get(int field):获取指定字段的日历值

set(int field,int value):给指定的日历字段设置指定的值

set(int year,int month,int date):设置年月日

Date getTime():获取日历对象的日期

setTime(Date d):设置日历对象的日期

add(int field,int amount):对指定的日历字段添加指定的值

11、System类

没有构造方法

成员方法

gc():运行垃圾回收处理机制(系统会在某个不确定的时间调用该方法)

会调用finalize(),进行垃圾回收

exit(int status):退出JVM,0表示非异常退出

currentTimeMills():获取当前时间毫秒值

arrayCopy(Object[] srcArr,int srcPos,Object[] desArr,int destPos,int len):数组复制

12、BigInteger类

1)构造方法

BigInteger(String s):通过字符串创建BigInteger对象

2)成员方法

add(BigInteger bi):+

subtract(BigInteger bi):-

multiply(BigInteger bi):*

divide(BigInteger bi):/

13、BigDecimal类

用于解决浮点型运算精度损失的问题

1)构造方法

BigDecimal(String s):通过字符创建BigDecimal对象

2)成员方法

add(BigDecimal bi):+

subtract(BigDecimal bi):-

multiply(BigDecimal bi):*

divide(BigDecimal bi):/


注解:

Annotation注解,是一种代码级别的说明,与类,接口,枚举是在同一个层次,注解给计算机提供相应信息的(JVM)

作用:1.编译检查:通过代码里表示注解,让编译器能够实现基本的编译检查

          2.代码的分析:通过代码里标识注解,对代码进行分析,达到取代XML的目的

            3.编写文档:通过代码里标识注解,辅助生成帮助文档对应的内容

一:JDK 提供的注解

    1.@Deprecated  已过时,不建议使用,任然可用

    2.@Override 复写父类的方法,实现接口的方法

    3.@SuppressWarnins 抑制警告

    ...

二:自定义注解(定义类,接口,枚举)

    属性格式:修饰符 返回值类型 属性名() 【default】默认值

//自定义注解类

public @interface MyAnnol {

    //带有属性

    public String username() default "jack";

    public int age() default 25;

    public String password();

}

枚举:

特殊形式的Java类,每一个枚举值代表枚举类的一个实例对象

            主要解决常量配置问题

package com.company04;

public enum PayEnum {

    /**

     * 枚举项就是一个个对象,它是常量,在定义枚举项的时候调用构造方法

     */

    WEIXINPAY("weixin","weixinpayURL"),

    ALIPAY("ali","aliURL"),

    UNIONPAY("yinlian","yinlianURL");

    private String name; //支付名称

    private String payUrl;// 支付地址


    //定义构造方法私有

    PayEnum() {

    }

    PayEnum(String name, String payUrl) {

        this.name = name;

        this.payUrl = payUrl;

    }


    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getPayUrl() {

        return payUrl;

    }

    public void setPayUrl(String payUrl) {

        this.payUrl = payUrl;

    }

}

元注解:4个

@Target :用于描述注解的使用范围

@Retention:什么级别保存该注释信息 RUNTIME

注解的参数:参数类型+参数名();

反射:

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖这个类,使用的就是Class类中的方法,所以先要获取到每一个字节码文件所对应的Class类型对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值