java基础知识整理16

本文深入解析Java中的核心类,如Object、String、StringBuilder、Math、Random等,介绍它们的主要特性和使用方法。同时探讨了日期处理类、常量池概念及BigDecimal类在处理精度问题上的应用。

Object类:
Object类是所有类,数组,枚举类的父类。也就是说,Java允许把所有任何类型的对象付给object类型的变量。定义类时默认继承Object类型。
Object提供了如下几个常用的方法:
protected void finalize()
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
Class<?>
getClass()
返回此 Object 的运行时类。
int hashCode()
返回该对象的哈希码值。
void notify()
唤醒在此对象监视器上等待的单个线程。
void notifyAll()
唤醒在此对象监视器上等待的所有线程。
String
toString()
返回该对象的字符串表示。

String toString() 返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
getClass().getName() + ‘@’ + Integer.toHexString(hashCode())
还提供了wait,notify,notifyAll等方法。
String,StringBuffer 和StringBuilder类:
String类是不可变的,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。
Stringbuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append,insert,reverse,setCharAt,setlength等可以改变这个字符串的序列。
StringBuffer是线程安全的StringBuilder则没有实现线程安全功能,所以性能高,如果需要创建一个内容可变的字符串对象,应该优先考虑使用StringBuilder类。
String()
初始化一个新创建的 String 对象,使其表示一个空字符序列。
String(byte[] bytes)
通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
String(byte[] bytes, Charset charset)
通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。

String(byte[] ascii, int hibyte)
已过时。 该方法无法将字节正确地转换为字符。从 JDK 1.1 开始,完成该转换的首选方法是使用带有 Charset、字符集名称,或使用平台默认字符集的 String 构造方法。

String(byte[] bytes, int offset, int length)
通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。
String(byte[] bytes, int offset, int length, Charset charset)
通过使用指定的 charset 解码指定的 byte 子数组,构造一个新的 String。

String(byte[] ascii, int hibyte, int offset, int count)
已过时。 该方法无法将字节正确地转换为字符。从 JDK 1.1 开始,完成该转换的首选方法是使用带有 Charset、字符集名称,或使用平台默认字符集的 String 构造方法。

String(byte[] bytes, int offset, int length, String charsetName)
通过使用指定的字符集解码指定的 byte 子数组,构造一个新的 String。
String(byte[] bytes, String charsetName)
通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。

String(char[] value)
分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。
String(char[] value, int offset, int count)
分配一个新的 String,它包含取自字符数组参数一个子数组的字符。
String(int[] codePoints, int offset, int count)
分配一个新的 String,它包含 Unicode 代码点数组参数一个子数组的字符。
String(String original)
初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
String(StringBuffer buffer)
分配一个新的字符串,它包含字符串缓冲区参数中当前包含的字符序列。
String(StringBuilder builder)
分配一个新的字符串,它包含字符串生成器参数中当前包含的字符序列。
String提供了大量的方法来操作对象。
public char charAt(int index)返回指定索引处的 char 值。索引范围为从 0 到 length() - 1。序列的第一个 char 值位于索引 0 处,第二个位于索引 1 处,依此类推,这类似于数组索引。
如果索引指定的 char 值是代理项,则返回代理项值。

compareTo
public int compareTo(String anotherString)按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。按字典顺序将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数。如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。如果这两个字符串相等,则结果为 0;compareTo 只在方法 equals(Object) 返回 true 时才返回 0。
如果这两个字符串不同,那么它们要么在某个索引处的字符不同(该索引对二者均为有效索引),要么长度不同,或者同时具备这两种情况。如果它们在一个或多个索引位置上的字符不同,假设 k 是这类索引的最小值;则在位置 k 上具有较小值的那个字符串(使用 < 运算符确定),其字典顺序在其他字符串之前。在这种情况下,compareTo 返回这两个字符串在位置 k 处两个char 值的差,即值:
this.charAt(k)-anotherString.charAt(k)
如果没有字符不同的索引位置,则较短字符串的字典顺序在较长字符串之前。在这种情况下,compareTo 返回这两个字符串长度的差,即值:
this.length()-anotherString.length()

public boolean contentEquals(StringBuffer sb)将此字符串与指定的 StringBuffer 比较。当且仅当此 String 与指定 StringBuffer 表示相同的字符序列时,结果才为 true。
String类是不可变的,String的实例一旦生成就不会再改变了。String会额外产生很多变量,使用StringBuffer和String Builder就可以避免这个问题。
常量池的概念:常量值指的是在编译期被确定,被保存在以编译的.class文件中的一些数据。它包括了关于类方法,接口中的常量,也包括了字符串常量。
用new String()创建的字符串不是常量,不能在编译期就确定,所以new String()创建的字符串不会放入常量池中,他们有自己的地址空间。
StringBuilder,StringBuffer有两个属性:Length和Capacity,其中length属性代表其包含字符串序列的长度,与String不同的是,StringBUilder,StringBuffer的Length是可以改变的,可通过length()和setlength(int len)方法访问和修改其字符序列的长度,capacity属性代表了String Builder的容量,Capacity通常比Length大,程序无需关心capacity属性。
StringBuilder与String之间最大的区别是:StringBuilder的字符序列是可变的。

Math类:
Math中所有的方法都是类方法,可以直接通过类名来调用,Math除了提供了大量的静态方法之外,还提供了两个静态属性:PI和E,分别等于Π和e。
Random类:
Random类专门用于生成一个伪随机数,他有两个构造器,一个构造器使用默认的种子,另一个构造器需要程序员传入一个long型的种子。
Random类不仅可以生成浮点类型的伪随机数,也可以生成整数类型的伪随机数,还可以指定生成随机数的范围。
Random使用一个48位的种子,如果这个类的两个实例是用同一个种子创建的,对他们以同样的顺序调用方法,则他们会产生相同的数字序列。
Random产生的数字并不是真正的随机的,而是一种伪随机。
为了避免两个Random对象产生相同的数字序列,通常推荐使用当前时间来作为Random对象的种子。
Random rand=new Random(System.currentTimeMillis());
BigDecimal类:
在这里插入图片描述
Java的double类型会发生精度丢失,为了能精确表示,计算浮点数,Java提供了BigDecimal类,可以把所有的基本类型数值转换成一个BigDecimal对象,也包括利用数字字符串,数字字符数组来创建BigDecimal对象。
通常建议优先使用基于String的构造器。
如果必须使用double浮点数作为BigDecimal构造器的参数时,不要直接将该double浮点数作为构造器参数创建BigDecimal对象,而是通过BigDecimal.valueOf(double value)静态方法来创建,BigDecimal对象。
创建Big Decimal对象时,不要直接使用double浮点数来创建一个BigDecimal对象,否则同样会发生精度丢失。
处理日期的类:
Date类:
public Date(long date)
分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。
参数:
date - 自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。
public Date()
分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
其余四个已经过时。
Calendar类:
Calendar是一个抽象类,它是所有日历类的模板,并提供了提供了一些所有日历通用方法,但它本身不能直接实例化,程序只能创建Calendar子类实例,java本身提供了一个GregorianCalendar类,一个代表GregorianCalendar的子类,他代表我们所说的公历。
Calendar不能使用构造器来创建Calendar对象。但他们提供了几个静态getInstance方法获取Calendar对象,这些方法根据TimeZone,Locale类获取特定Calendar,如果不指定TimeZone,Locale,则默认使用TimeZone,Locale,Calendar。
Calendar和Date类都是表示日期的工具类,他们之间可以自由转化。
在这里插入图片描述
Calendar提供了大量访问,修改时间的方法。
Calendar.MONTH字段需要注意:月份的起始值是0而不是1。
Calendar类还有如下几个注意点:
Add与roll的区别:
Add(int field,int amount)的功能非常强大,add主要用于改变Calendar的特定字段的值。如果需要增加某个字段的值,则让amount为正数,如果需要减少某字段的值,让amount为负数即可。有两条规则:
1. 当被修改的字段超出它允许的范围时,会发生进位,即上一级字段也会增大。
2. 如果下一级的字段也需要改变,那么该字段会修正到变化最小的值。
Roll的规则:当被修改的字段超出它允许的范围时,上一级字段不会增大。
下一集字段处理和add相似。
设置calendar的容错性:
Calendar提供了一个setLenient用于设置他的容错性,calendar默认支持较好的容错性,通过setLenient(false)可以关闭Calendar的容错性。
Calendar有两种解释日历字段的模式:lenient模式和non-lenient模式,当Calendar处于lenient模式时,每个字段可接受超出它允许范围的值。当Calendar处于non-lenient模式时,如果为某个时间字段设置超出它允许的取值范围,程序将会抛出异常。
Set延迟修改:
Set(f,value)方法将日历字段f更改为value,尽管日历字段f是立即更改的,但Calendar不会立即修改,直到下一调用get(),getTime(),getTimeInMillis(),add()或roll时才会重新计算日历的时间。
TimeZone类:
TimeZone是一个抽象类,不能调用其构造器来创建实例,但可以调用它的静态方法:getDefault或getTimeZone得到Time Zone实例。其中getDefault方法获得运行机器上的默认时区,默认时区可以通过修改操作系统的相关配置来进行调整;getTimeZone则根据时区ID来获取对应的时区。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值