Java基础15

titledatecategoriestagsid
Java基础-day15
2020-03-12
JavaSE
Java
Gqq

将基本数据类型值作为对象处理

基本数据类型值不是一个对象 , 但是可以使用 Java API中的包装类来包装成一个对象 。

出于对性能的考虑 , 在 Java 中基本数据类型不作为对象使用, 因为处理对象需要额外 的系统开销

Java.lang包里为基本数据类型提供了BooleanCharacterDoubleFloatByteShortIntegerLong等包装类。 大多数基本类型的包装类的名称与对应的基本數据类型名称一样 , 第一个字母要大写 。Integer Character 例外

t

  • 每一个数值包装类都有常量 MAX _ VALUE MIN _ VALUE

    • 对于Byte 、 Short 、 Integer 、 Long而言 , MIN _ VALUE 表示对应的基本类型 byte 、 short 、 int 、 long 的最小值

    • Float Double 类而言 , MIN _ VALUE 表示 float 型和 double 型的最小正值 。

  • 数值包装类有一个有用的静态方法 valueOf(String s ) 。 该方法创建一个新对象 , 并将 它初始化为指定字符串表示的值。

  • 每个数值包装类都有两个重载的方法 , 将数值字符串转换为正确的以 10 ( 十进制 ) 或指定值为基数 ( 例如 , 2 为二进制 , 8 为八进制 , 16 为十六进制 ) 的数值

Integer.parseInt("11", 2) returns 3;
Integer.parseInt("12", 8) returns 10;
Integer.parseInt("13", 10) returns 13;
Integer.parseInt("1A", 16) returns 26;

Integer.parseInt("12", 2) ; // error! 12不是二进制数
// 使用format方法将一个十进制数转换为十六进制数
String.format("%x", 26) returns 1A;

基本类型和包装类类型之间的自动转换

根据上下文环境 , 基本数据类型值可以使用包装类自动转换成一个对象 , 反过来的自动转换也可以

基本类型值转换为包装类对象的过程称为装箱(boxing) , 相反的转换过程称为开箱(unboxing)

过程:

  • Java 允许基本类型和包装类类型之间进行自动转换 。 如果一个基本类型值出现在需要对象的环境中 , 编译器会将基本类型值进行自动装箱 ; 如果一个对象出现在需要基本类型值的环境, 编译器会将对象进行自动开箱
Integer[] intArray = {1, 2, 3};
System.out.println(intArray[0] + intArray[1] + intArray[2]);
  • 第一行中,基本类型值1、2、3被自动装箱成对象new Integer[1]new Integer[2]new Integer[3]
  • 第二行中,对象intArray[0]intArray[1]intArray[2]被自动转换为int值,然后进行相加

BigIntegerBigDecimal

这两种类可以用于表示任意大小精度整数或者十进制数

java.math包中

long类型的最大整数值仅仅为long.MAX_VALUE(即9223372036854775807)

使用new BigInteger(String)new BigDecimal(String)来创建BigIntegerBigDecimal的实例,有以下方法进行运算:

  • 算术运算
    • add
    • subtract
    • multiply
    • divide
    • remainder
  • 比较
    • compareTo
BigInteger a = new BigInteger("9223372036854775807");
BigInteger b = new BigInteger("2");
BigInteger c = a.multiply(b);

BigDecimal 对象的精度没有限制 。 如果结果不能终止 , 那么 divide 方法会抛出 ArithmeticException 异常。 可以使用重载的 divide ( BigDecimal d, int scale, int roundingMode) 方法来指定尺度和舍入方式来避免这个异常, scale是小数点后最小的整数位数

BigDecimal a = new BigDecimal(1.0);
BigDecimal b = new BigDecimal(3.0);
BigDecimal c = a.divide(b, 20, BigDecimal.ROUND_UP);
System.out.println(c);

Result:0.33333333333333333334

实例

一个整数的阶乘可能会很大。该代码可以返回任意整数阶乘的方法

import java.math.*;
public class LargeF{
    public static void main(String[] args){
        System.out.println("50! is \n" + F(50));
    }
    
    public static BigInteger F(long n){
        BigInteger result = BigInteger.ONE;  // 相当于初始化为 1 
        for(int i = 1; i <= n; i++){
            result = result.multiply(new BigInteger(i + ""));
        }
    }
}

String类

String对象是不可改变的,字符串一旦创建,内容不能改变

构造字符串

可以使用字符串直接量或者字符数组创建一个字符串对象

创建一个字符串:String newString = new String(stringLiteral);

  • 直接量方法
String message = new String("Gqq's page");
  • 字符数组方法
char[] charArray = {'G', 'q', 'q', '\'', 's',  ' ', 'p', 'a', 'g', 'e'};
String message = new String(charArray);

不可变字符串和限定字符串

String s = "Java";
s = "HTML";			// 这里并不能改变原始字符串内容,只是引用对象变了

Snipaste_2020-03-13_11-56-43

限定字符串:因为字符串在程序设计中不可变,但同时频繁使用,所以Java虚拟机为了提高效率并节约内存,对具有相同字符序列的字符串直接量使用同一个实例,这种实例称为限定的字符串

Snipaste_2020-03-13_11-59-08

尽管s1和s2内容相同,但它们是不同的字符串对象

字符串的替换和分隔

+ replace(oldChar: char, newChar: char): String      // 将字符串中所有匹配的字符替换成新的宇符,然后返冋新的字符串 
+ replaceFirst(oldChar: char, newChar: char): String // 将字符串中第一个匹配的子字符串替换成新的子字符串,然后返回新的字符串
+ replaceAll(oldChar: char, newChar: char): String	 // 将字符串中所有匹配的子字符串替换成新的子字符串,然后返回新的字符串
+ split(delimiter: String): String[]    			 // 返回一个字符串数组 , 其中包含被分隔符分隔的子宇符串集

字符串一旦创建其内容就不能改变,上述方法返回一个源自原始字符串的新字符串(并没有改变原始字符串)

split 方法可以从一个指定分隔符的字符串中提取标识

String[] tokens = "Java#HTML#PERL".split("#");
for(int i = 0; i < tokens.length; i++){
    System.out.print(tokens[i] + " ");
}

Result : Java HTML PERL

依照模式匹配、替换、分隔

正则表达式(regular expression)(regex):是一个字符串, 用于描述匹配一个字符串集的模式。 可以通过指定某个模式来匹配 、 替换或分隔一个字符串

虽然equals方法亦可以来判断两个字符串是否相同,但是利用matches方法功能更加强大

"Java is fun".matches("Java.*");  		// return true 
"Java is powerful".matches("Java.*");	// return true

举几个例子:

"440-02-4534".matches("\\d{3}-\\d{2}-\\d{4}")

\\d表示单个数字位,\\\d{3}表示三个数字位,所以返回true

String s = "a+b#c".replaceAll("[$+#]", "NNN");

[$+#]表示能够匹配$、+、#的模式,所以返回aNNNbNNNNNNc

String[] tokens = "Java,C?C#,C++".split("[.,:;?]");
for(int i = 0; i < tokens.length; i++){
    System.out.println(tokens[i]);
}

返回Java、C、C#、C++

字符串和数字之间的转换

字符串不是数组,但是它们可以相互转换。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值