03-Java核心类库_常用类库

目录

一,常用类库

1,泛型

1.1 概述

1.2 使用

1.3 实例

1.4 限制泛型类型

1.5 泛型中的通配符

2,java.util.Objects

2.1 Object与Objects

2.2 Objects中的equals 

2.3 Objects中的requireNonNull

3,java.lang.Math

4,java.util.Arrays

4.1 二分查找binarySearch

4.2 比较两个数组compare

4.3 复制数组copyOf、copyOfRange

4.4  判断数组是否相等equals

4.5 填充数组fill

4.6 数组排序sort、parallelSort

4.7 数组转换为字符串形式toString

5,java.math.BigDecimal

5.1 问题引入

5.2 常用方法及使用

6,java.util.Date

6.1 概念

6.2 应用

7,java.text.DateFormat

7.1 概念

7.2 应用

8,java.util.Calendar

8.1  对象创建过程源码解析

8.2 如何获取年月日时分秒:get(不能通过getDay之类的方法直接得到)

8.3 如何获得今天是一年中的第几天:get

8.4 如何设置日历来方便计算:set

8.5 通过加减修改年月日等参数:add

8.6 将Calendar对象转换为Date对象:getTime

8.7 获得字段的最大值:getActualMaxmum

9,String

9.1 为什么字符串类型无法更改长度

9.3 String对象可共享

9.4 字符串常量池

9.5 被双引号包含的都是字符串对象

9.6 其他常用的字符串构造方法(最常用的还是直接赋值)

9.7 常用的字符串方法

9.8 字符串拼接中的问题


一,常用类库

1,泛型

1.1 概述

1,泛型,即“参数化类型”。就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定 义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

2,注意

在编译之后程序会采取去泛型化的措施。 

  • 也就是说Java中的泛型,只在编译阶段有效。 
  • 在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加 类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段

3,作用

  • 1、 提高代码复用率 
  • 2、 泛型中的类型在使用时指定,不需要强制类型转换(类型安全,编译器会检查类型)

1.2 使用

1,泛型类

public class ClassName<T>{ 
    private T data; 
    public T getData() { 
        return data; 
    }
    public void setData(T data) { 
        this.data = data; 
    } 
}

2,泛型接口

public interface IntercaceName<T>{ 
    T getData(); 
}

实现接口时,可以选择指定泛型类型,也可以选择不指定, 如下: 
指定类型:

public class Interface1 implements IntercaceName<String> { 
    private String text; 
    @Override 
    public String getData() { 
        return text; 
    } 
} 

 不指定类型: 

public class Interface1<T> implements IntercaceName<T> { 
    private T data; 
    @Override 
    public T getData() { 
        return data; 
    } 
}

3, 泛型方法

方法的类型是泛型,返回值也是泛型 

private static <T> T 方法名(T a, T b) {}

另一个例子 

 

1.3 实例

1,假设在定义时不确定类型,但使用时可以确定: 

2,测试方法

1.4 限制泛型类型

在使用泛型时, 可以指定泛型的限定区域 , 

- 例如: 必须是某某类的子类或 某某接口的实现类,格式: 

<T extends 类或接口1 & 接口2>

    

1.5 泛型中的通配符

 类型通配符是使用?代替方法具体的类型实参。 

  • 1 <? extends Parent> 指定了泛型类型的上届 
  • 2 <? super Child> 指定了泛型类型的下届 
  • 3 <?> 指定了没有限制的泛型类型

上界限定(限定父类)

下界确定

2,java.util.Objects

2.1 Object与Objects

1,Object

2,Objects

2.2 Objects中的equals 

1,使用对象的equals方法 

2,使用Objects中的equals方法

3,源码

2.3 Objects中的requireNonNull

判断对象是否为空,若为空则抛出异常 。常用于要求对象不能为空的场景:

3,java.lang.Math

4,java.util.Arrays

4.1 二分查找binarySearch

1,相关API 

2,应用

4.2 比较两个数组compare

4.3 复制数组copyOf、copyOfRange

1,相关API 


2,应用 

4.4  判断数组是否相等equals

4.5 填充数组fill

4.6 数组排序sort、parallelSort

1,相关API 


2,应用

4.7 数组转换为字符串形式toString

1,相关部分API

2,应用

3,源码

5,java.math.BigDecimal

5.1 问题引入

1,输出两个小数之和

通过在控制台运行0.1+0.2。 会发现float和double的运算误差

由于float类型和doub1 e类型在运算时可能会有误差,为了实现精确运算则需要借助java.math. BigDecima 类加以描述

5.2 常用方法及使用

1,需要通过BigDecimal创建对象,相要参与运算的小数的字符串形式作为参数。 

2,常用方法

3,转换为特定类型

6,java.util.Date

6.1 概念

在JDK 1.1之前, Date类还有两个附加功能。 它允许将日期解释为年,月,日,小时,分钟和秒值。 它还允许格式化和解析日期字符串。 不幸的是,这些功能的API不适合国际化。 从JDK 1.1开始, Calendar类应该用于在日期和时间字段之间进行转换,而DateFormat类应该用于格式化和解析日期字符串。 不推荐使用Date中的相应方法。  

目前常用的方法:

1,当前时间

2,指定时间

3,获取时间戳

6.2 应用

1,打印当前时间 

2,打印提前一小时的时间

7,java.text.DateFormat

7.1 概念

用于格式化和解析字符串。DateFormat是一个抽象类,经常使用他的直接子类SimpleDateFormat

7.2 应用

1, 格式定义。将时间转换为指定格式

2,使用方法format转换为想要的格式

3,使用方法parse 将指定格式的时间字符串转换为date对象

4,计算时间差

8,java.util.Calendar

可以解决国际化的问题。Calendar为抽象类,需要通过getInstance获得对象;

8.1  对象创建过程源码解析

1,创建calendar对象,进入Calendar类,找到getInstance方法

2,再次进入createCalendar方法

3,可以看到标准化操作,不同地区的创建方法

8.2 如何获取年月日时分秒:get(不能通过getDay之类的方法直接得到)

1,找到Calendar类中的fields数组,存放年月日时分秒相关的信息 

2,这些常量表示相应字段在数组中的下标

3,实际使用运行效果

4,调用过程:get-》internalGet

8.3 如何获得今天是一年中的第几天:get

1,使用get方法,并传入相应参数 

2,运行效果

8.4 如何设置日历来方便计算:set

1,使用set方法

8.5 通过加减修改年月日等参数:add

1,增加年份add 

2,增加月份

注意国外月份0-11表示1-12.此外国外的星期日表示一周的开始

8.6 将Calendar对象转换为Date对象:getTime

 

8.7 获得字段的最大值:getActualMaxmum

9,String

String类表示字符串。 Java程序中的所有字符串文字(例如"abc" )都实现为此类的实例。 

  • 字符串是不变的; 它们的值在创建后无法更改。
  • 字符串缓冲区支持可变字符串。
  • 因为String对象是不可变的,所以可以共享它们。(如果两字符串内容完全相同,则采用同一块内存地址)

之前的操作中,可以发现,使用String可以表示出一个字符串,但是使用此类的时候也会发现有一点的问题。

从String命名风格可以发现,String 是一一个类, 但是此类在使用的时候却发现可以不用构造方法而直接赋值,那么这样操作有那些特点呢?

9.1 为什么字符串类型无法更改长度

数组的长度无法更改

9.3 String对象可共享

 如果两字符串内容完全相同,则采用同一块内存地址(前提是不通过new实现,只要使用了new就一定会开辟两个不同的内存空间)

9.4 字符串常量池

1,方法区

方法区(Method Area),又称永久代(Permanent Generation)(永久存储在内存中,就像静态代码块不会执行两次一样), 又称非堆区( Non-Heap space)方法区,又称永久代(Permanent Generation) ,常称为PermGen,位于非堆空间,又称非堆区(Non-Heap space)。

方法区是被所有线程共享。

  • 所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义。
  • 简单说,所有定义的方法的信息都保存在该区域,此区属于共享区间。
  • 这些区域存储的是:静态变量 +常量+类信息(构造方法/接口定义) +运行时常量池。

但是,实例变量 存在堆内存中,和方法区无关。

以上,只是逻辑上的定义。在HotSpot中,方法区仅仅只是逻辑上的独立,实际上还是包含在Java堆中,也是就说,方式区在物理上属于Java堆区中的一部分,而永久区(Permanent Generation) 就是方法区的实现。

2、堆(heap)

一个JW实例只存在一一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内
存中,保存所有引用类型的真实信息,以方便执行器执行。

堆在逻辑上分为三部分(Perm) :

  • 新生代(Young Generation, 常称为YoungGen)
  • 老年代(01d Generation, 常称为oldGen、TenuringGen)
  • 永久代(Permanent Generation, 常称为PermGen)

2.1、新生区(New/Young Generation)

新创建的对象都在新生代,在15次GC回收中被回收,就是新生代

  • 新生代(Young Generation) ,常称为YoungGen,位于堆空间;
  • 新生区又分为Eden区和Survior (幸存区)。

Eden :新创建的对象

Survior 0、1:经过垃圾回收,但是垃圾回收次数小于15次的对象

2.2、养老代(01d Generation)

  • 老年代(old Generation) ,常称为oldGen,位于堆空间;
  • old :垃圾回收次数超过15次,依然存活的对象

2.3、永久区(Permanent Generat ion)

字符串都存在于永久代,所以两个内容相同的字符串引用会指向同一地址(除了new出来的String,因为new一定会开辟新的内存空间)

永久代(Permanent Generation) , 常称为PermGen, 位于非堆空间。

永久区是一个常驻内存区域,用于存放JDK自身所携带的Class , Interface的元数据,也就是说它存储的是运行环境必须的类信息,被装载进此区域的数据是不会被垃圾回收器回收掉的,关闭JVM才会释放此区域所占用的内存。

2.3.1、方法区的实现的演变:

  • Jdk1.7之前: hotspot虚拟机对方法区的实现为永久代;
  • Jdk1. 8及之后: hotspot移除了永久代用元空间(Metaspace),

2.3.2、运行时常量池存和字符串常量池的变化

JDK1.7之前:

  • 运行时常量池(包含字符串常量池)存放在方法区,此时hotspot虚拟机对方法区的实现为永久代。

JDK1.7 :

  • 字符串常量池被从方法区拿到了堆中; 
  • 运行时常量池剩下的东西还在方法区,也就是hotspot中的永久代。

JDK1.8 :

  • hotspot移除了永久代,用元空间(Metaspace)取而代之。这时候,
  • 字符串常量池还在堆,
  • 运行时常量池还在方法区,只不过方法区的实现从永久代变成元空间(Metaspace)。

9.5 被双引号包含的都是字符串对象

只要是被双引号包住的都是字符串对象,如果没有赋予名称的话,属于匿名对象

9.6 其他常用的字符串构造方法(最常用的还是直接赋值)

9.7 常用的字符串方法

9.8 字符串拼接中的问题

1,先声明三个字符串对象 text1,text2,text3

2,将三个字符串对象连接后新地址存放在text1中

3,造成的结果

4,实际应用场景中的副作用

爬虫时,把爬取到的字符串全都拼接起来,很快就会发现内存不够用,因为有很多垃圾在里面(拼接一次产生一次垃圾)。所以拼接字符串,能少做尽量少做,尤其是通过+号拼接;

5,如何拼接大量的字符串?

找到String实现的父类接口CharSequence。可以看到其的两个子类:StringBuffer,StringBuilder。

6,拼接方法

首先通过无参方式创建空的StringBuffer/StringBuilder;

其次通过append方式,进行添加,容量不够就根据动态扩容算法进行扩容。重点是不会在缓冲区存储,通过+号连接,因为是在常量缓冲池中存储,所以不会被回收;

7,将结果转换为String

8,虽然麻烦但是节省内存,所以对字符串操作时,推荐使用此方法


章节汇总在这里(づ ̄3 ̄)づ╭❤~@&再见萤火虫&【03-Java核心类库】


对学习Java感兴趣的同学欢迎加入QQ学习交流群:1126298731

有问题欢迎提问,大家一起在学习Java的路上打怪升级!(o゜▽゜)o☆[BINGO!]

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值