15、java常用类

一、字符串相关的类

1、String类

1.1字符串特性

1)通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。

  2)字符串常量池中是不会存储相同内容的字符串的。

  3)String:代表不可变的字符序列。简称:不可变性。

         体现:

                1.当对字符串重新赋值时,需要重新指定内存区域 赋值,不能使用原有的value进行赋值。

                 2. 当对现有的字符串进行连接操作时,也需要重新指定内存区域 赋值,不能使用原有的value进行赋值。

                 3. 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域 赋值,不能使用原有的value进行赋值。

/*
    结论:
    1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
    2.只要其中有一个是变量,结果就在堆中。
    3.如果拼接的结果调用intern()方法,返回值就在常量池中
     */
    @Test
    public void test4(){
        String s1 = "javaEEhadoop";
        String s2 = "javaEE";
        String s3 = s2 + "hadoop";
        System.out.println(s1 == s3);//false

        final String s4 = "javaEE";//s4:常量
        String s5 = s4 + "hadoop";
        System.out.println(s1 == s5);//true

    }

    @Test
    public void test3(){
        String s1 = "javaEE";
        String s2 = "hadoop";

        String s3 = "javaEEhadoop";
        String s4 = "javaEE" + "hadoop";
        String s5 = s1 + "hadoop";
        String s6 = "javaEE" + s2;
        String s7 = s1 + s2;

        System.out.println(s3 == s4);//true
        System.out.println(s3 == s5);//false
        System.out.println(s3 == s6);//false
        System.out.println(s3 == s7);//false
        System.out.println(s5 == s6);//false
        System.out.println(s5 == s7);//false
        System.out.println(s6 == s7);//false

        String s8 = s6.intern();//返回值得到的s8使用的常量值中已经存在的“javaEEhadoop”
        System.out.println(s3 == s8);//true


    }
结论:
> 常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
> 只要其中有一个是变量,结果就在堆中
> 如果拼接的结果调用 intern() 方法,返回值就在常量池中

1.2、String常用方法

1.3、转换

1.3.1、String 与基本数据类型、包装类之间的转换

String --> 基本数据类型、包装类:调用包装类的静态方法:parseXxx(str)

基本数据类型、包装类 --> String:调用String重载的valueOf(xxx)

1.3.2、String与字符数组转换

字符数组 ->  字符串
        >String 类的构造器: String(char[]) String(char[] int offset int length) 分别用字符数组中的全部字符和部分字符创建字符串对象。
字符串 ->  字符数组
        >public char[] toCharArray() 将字符串中的全部字符存放在一个字符数组中的方法。
        >public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 提供了将指定索引范围内的字符串存放到数组中的方法。
字节数组 ->  字符串
        >String(byte[]) 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String
        >String(byte[] int offset int length) 用指定的字节数组的一部分,即从数组起始位置offset 开始取 length 个字节构造一个字符串对象。
字符串 ->   字节数组
        >public byte[] getBytes() 使用平台的默认字符集将此 String 编码为byte 序列,并将结果存储到一个新的 byte 数组中。
        >public byte[] getBytes(String charsetName) 使用指定的字符集将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。

2、StringBuffer类 

2.1特性

1)java.lang.StringBuffer 代表 可变的字符序列 JDK1.0 中声明,可以对字符串内容进行增删,此时不会产生新的对象。
2)很多方法与 String 相同。
3)作为参数传递时,方法内部可以改变值。
4)StringBuffer 类不同于 String ,其对象必须使用构造器生成。有三个构造器:
 
        >StringBuffer() :初始容量为 16 的字符串缓冲区
        >StringBuffer(int size) :构造指定容量的字符串缓冲区
        >StringBuffer(String str) :将内容初始化为指定字符串内容

 2.2、StringBuffer类的常用方法

StringBuffer append (xxx) :提供了很多的 append() 方法,用于进行字符串拼接
StringBuffer delete (int start,int end) :删除指定位置的内容
StringBuffer replace (int start, int end, String str) :把 [start,end) 位置替换为 str
StringBuffer insert (int offset, xxx) :在指定位置插入 xxx
StringBuffer reverse () :把当前字符序列逆转
>当 append insert 时,如果原来 value 数组长度不够,可扩容。
>如上这些方法支持方法链操作
public int indexOf (String str)
public String substring (int start,int end)
public int length ()
public char charAt (int n )
public void setCharAt (int n ,char ch)

 2.3、StringBuilder

>StringBuilder StringBuffer 非常类似,均代表可变的字符序列,而且 提供相关功能的方法也一样
>面试题:对比 String StringBuffer StringBuilder
        >String(JDK1.0) :不可变字符序列
        >StringBuffer(JDK1.0):可变字符序列、效率低、线程安全
        >StringBuilder(JDK 5.0):可变字符序列、效率高、 线程不安全
注意: 作为参数传递的话,方法内部 String 不会改变其值, StringBuffer StringBuilder
会改变其值。

二、jdk8之前的日期时间api

1. java.lang.System

System 类提供的 public static long currentTimeMillis() 用来返回当前时间与1970 1 1 0 0 0 秒之间以毫秒为单位的时间差。
        >此方法适于计算时间差。
计算世界时间的主要标准有:
        >UTC(Coordinated Universal Time)
        >GMT(Greenwich Mean Time)
        >CST(Central Standard Time)

2. java.util.Date

表示特定的瞬间,精确到毫秒
构造器:
        >Date() 使用无参构造器创建的对象可以获取本地当前时间。
        >Date(long date)
常用方法
        >getTime(): 返回自 1970 1 1 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
        >toString(): 把此 Date 对象转换为以下形式的 String dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat), zzz 是时间标准。
        >其它很多方法都过时了。
 

3. java.text.SimpleDateFormat

>Date 类的 API 不易于国际化,大部分被废弃了, java.text.SimpleDateFormat 类是一个不与语言环境有关的方式来格式化和解析日期的具体类。
>它允许进行 格式化:日期 ->  文本 解析:文本 ->  日期
> 格式化:
        >SimpleDateFormat() :默认的模式和语言环境创建对象
        >public SimpleDateFormat(String pattern): 该构造方法可以用 参数 pattern 指定的格式创建一个对象,该对象调用:
        >public String format(Date date) 方法格式化时间对象 date
解析:
        >public Date parse(String source) 从给定字符串的开始解析文本,以生成一个日期。

4. java.util.Calendar(日历)

>Calendar 是一个抽象基类,主用用于完成日期字段之间相互操作的功能。
>获取 Calendar 实例的方法
        >使用 Calendar.getInstance() 方法
        >调用它的子类 GregorianCalendar 的构造器。
> 一个 Calendar 的实例是系统时间的抽象表示,通过 get(int field) 方法来取得想要的时间信息。比如YEAR MONTH DAY_OF_WEEK HOUR_OF_DAY 、MINUTE、 SECOND
        >public void set(int field,int value)
        >public void add(int field,int amount)
        >public final Date getTime()
        >public final void setTime(Date date)
注意 :
        >获取月份时:一月是 0 ,二月是 1 ,以此类推, 12 月是 11
        >获取星期时:周日是 1 ,周二是 2 , 。。。。周六是 7

三、jdk8中新日期时间API

1、新日期时间API出现的背景

如果我们可以跟别人说:“我们在 1502643933071 见面,别晚了!”那么就再简单不过了。但是我们希望时间与昼夜和四季有关,于是事情就变复杂了。JDK 1.0 中包含了一个java.util.Date 类,但是它的大多数方法已经在 JDK 1.1 引入 Calendar 类之后被弃用了。而Calendar 并不比 Date 好多少。它们面临的问题是:
可变性:像日期和时间这样的类应该是不可变的。
偏移性: Date 中的年份是从 1900 开始的,而月份都从 0 开始。
格式化:格式化只对 Date 有用, Calendar 则不行。
此外,它们也不是线程安全的;不能处理闰秒等。
总结:对日期和时间的操作一直是 Java 程序员最痛苦的地方之一

2、新时间日期API

新的 java.time 中包含了所有关于 本地日期( LocalDate )、本地时间 (LocalTime )、本地日期时间( LocalDateTime )、时区( ZonedDateTime ) 和持续时间(Duration )的类 。历史悠久的 Date 类新增了 toInstant() 方法,用于把 Date 转换成新的表示形式
 
java.time 包含值对象的基础包
java.time.chrono 提供对不同的日历系统的访问
java.time.format 格式化和解析时间和日期
java.time.temporal 包括底层框架和扩展特性
java.time.zone 包含时区支持的类
说明:大多数开发者只会用到基础包和 format 包,也可能会用到 temporal 包。因此,尽管有68 个新的公开类型,大多数开发者,大概将只会用到其中的三分之一。

2.1、LocalDate、LocalTimeLocalDateTime

LocalDate LocalTime LocalDateTime 类是其中较重要的几个类,它们的实例是 不可变的对象 ,分别表示使用 ISO-8601 日历系统的日期、时间、日期和时间。它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。
        >LocalDate 代表 IOS 格式( yyyy-MM-dd )的日期 , 可以存储 生日、纪念日等日期。
        >LocalTime 表示一个时间,而不是日期。
        >LocalDateTime 是用来表示日期和时间的, 这是一个最常用的类之一。
注: ISO-8601 日历系统是国际标准化组织制定的现代公民的日期和时间的表示法,也就是公历。

 2.2、瞬时:Instant

>Instant :时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。
>在处理时间和日期的时候,我们通常会想到年 , , , , , 秒。然而,这只是时间的一个模型,是面向人类的。第二种通用模型是面向机器的,或者说是连续的。在此模型中,时间线中的一个点表示为一个很大的数,这有利于计算机处理。 UNIX 中,这个数从 1970 年开始,以秒为的单位;同样的,在 Java 中,也是从1970 年开始,但以毫秒为单位。
>java.time 包通过值类型 Instant 提供机器视图,不提供处理人类意义上的时间单位。 Instant 表示时间线上的一点,而不需要任何上下文信息,例如,时区。概念上讲, 它只是简单的表示自 1970 1 1 0 0 0 秒( UTC )开始的秒数。 因为 java.time 包是基于纳秒计算的,所以 Instant 的精度可以达到纳秒级。
>(1 ns = 10 -9 s) 1 = 1000 毫秒 =10^6 微秒 =10^9 纳秒

时间戳是指格林威治时间 1970 01 01 00 00 00 ( 北京时间 1970 01 01 08 00 00 ) 起至现在的总秒数。

2.3、格式化与解析日期或时间
java.time.format.DateTimeFormatter 类:该类提供了三种格式化方法:

>预定义的标准格式。如:
        ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
>本地化相关的格式。如: ofLocalizedDateTime(FormatStyle.LONG)
>自定义的格式。如: ofPattern(“yyyy-MM-dd hh:mm:ss”)

四、java比较器

Java 实现对象排序的方式有两种:
        >自然排序: java.lang.Comparable
        >定制排序:java.util.Comparator

1、自然排序:java.lang.Comparable

1) Comparable 接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序。
2) 实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即 通过 compareTo(Object obj) 方法的返回值来比较大小。 如果当前对象 this 大 于形参对象obj ,则返回正整数,如果当前对象 this 小于形参对象 obj ,则返回负整数,如果当前对象this 等于形参对象 obj ,则返回零。
3) 实现 Comparable 接口的对象列表(和数组)可以通过 Collections.sort 或Arrays.sort进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
4) 对于类 C 的每一个 e1 e2 来说,当且仅当 e1.compareTo(e2) == 0 与 e1.equals(e2) 具有相同的 boolean 值时,类 C 的自然排序才叫做与 equals一致。建议(虽然不是必需的) 最好使自然排序与 equals 一致

1.1、java.lang.Comparable

Comparable 的典型实现 ( 默认都是从小到大排列的 )
        >String :按照字符串中字符的 Unicode 值进行比较
        >Character :按照字符的 Unicode 值来进行比较
        >数值类型对应的包装类以及 BigInteger BigDecimal :按照它们对应的数值大小进行比较
        >Boolean true 对应的包装类实例大于 false 对应的包装类实例
        >Date Time 等:后面的日期时间比前面的日期时间大

2、定制排序:java.util.Comparator

1) 当元素的类型没有实现 java.lang.Comparable 接口而又不方便修改代码, 或者实现了 java.lang.Comparable 接口的排序规则不适合当前的操作,那 么可以考虑使用 Comparator 的对象来排序 ,强行对多个对象进行整体排序的比较。
2) 重写 compare(Object o1,Object o2) 方法,比较 o1 o2 的大小: 如果方法返 回正整数,则表示 o1 大于 o2 ;如果返回 0 ,表示相等;返回负整数,表示 o1 小于 o2
3) 可以将 Comparator 传递给 sort 方法(如 Collections.sort Arrays.sort ),从而允许在排序顺序上实现精确控制。
4) 还可以使用 Comparator 来控制某些数据结构(如有序 set 或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。

五、System类

>System 类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang 包。
> 由于该类的构造器是 private 的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static 的,所以也可以很方便的进行调用。
>成员变量
        >System 类内部包含 in out err 三个成员变量,分别代表标准输入流(键盘输入 ) ,标准输出流 ( 显示器 ) 和标准错误输出流 ( 显示器 )
> 成员方法
        >native long currentTimeMillis() 该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT 时间 ( 格林威治时间 )1970 1 1 0 0 0 秒所差的毫秒数。
        >void exit(int status) 该方法的作用是退出程序。其中status 的值为 0 代表正常退出,非零代表异常退出。 使用该方法可以在图形界面编程中实现程序的退出功能 等。
        >void gc() 该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况。
        >String getProperty(String key) 该方法的作用是获得系统中属性名为key 的属性对应的值。系统中常见的属性名以及属性的作用如下表所示:

六、Math类

java.lang.Math 提供了一系列静态方法用于科学计算。其方法的参数和返回 值类型一般为 double 型。
abs 绝对值
acos,asin,atan,cos,sin,tan 三角函数
sqrt 平方根
pow(double a,doble b) a b 次幂
log 自然对数
exp e 为底指数
max(double a,double b)
min(double a,double b)
random() 返回 0.0 1.0 的随机数
long round(double a) double 型数据 a 转换为 long 型(四舍五入)
toDegrees(double angrad) 弧度 —> 角度
toRadians(double angdeg) 角度 —> 弧度

七、BigInteger和BigDecimal

1、BigInteger

>Integer 类作为 int 的包装类,能存储的最大整型值为 2 31 -1 Long 类也是有限的,最大为2 63 -1 。如果要表示再大的整数,不管是基本数据类型还是他们的包装类都无能为力,更不用说进行运算了。
> java.math 包的 BigInteger 可以表示不可变的任意精度的整数 BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。另外,BigInteger 还提供以下运算:模算术、 GCD 计算、质数测试、素数生成、位操作以及一些其他操作。
>构造器
        >BigInteger (String val) :根据字符串构建 BigInteger 对象
 
>常用方法
        >public BigInteger abs () :返回此 BigInteger 的绝对值的 BigInteger
        >BigInteger add (BigInteger val) :返回其值为 (this + val) BigInteger
        >BigInteger subtract (BigInteger val) :返回其值为 (this - val) BigInteger
        >BigInteger multiply (BigInteger val) :返回其值为 (this * val) BigInteger
        >BigInteger divide (BigInteger val) :返回其值为 (this / val) BigInteger 。整数相除只保留整数部分。
        >BigInteger remainder (BigInteger val) :返回其值为 (this % val) BigInteger
        >BigInteger[] divideAndRemainder (BigInteger val) :返回包含 (this / val) 后跟(this % val) 的两个 BigInteger 的数组。
        >BigInteger pow (int exponent) :返回其值为 (this exponent ) BigInteger

2、BigDecimal

>一般的 Float 类和 Double 类可以用来做科学计算或工程计算,但在 商业计算中, 要求数字精度比较高,故用到 java.math.BigDecimal 类。
>BigDecimal 类支持不可变的、任意精度的有符号十进制定点数。
>构造器
        >public BigDecimal(double val)
        >public BigDecimal(String val)
>常用方法
        >public BigDecimal add (BigDecimal augend)
        >public BigDecimal subtract (BigDecimal subtrahend)
        >public BigDecimal multiply (BigDecimal multiplicand)
        >public BigDecimal divide (BigDecimal divisor, int scale, int roundingMode)

猜你喜欢

转载自blog.csdn.net/lanwangxia/article/details/121207959