二. java基础学习:包装类、字符、字符串

java的基本数据类型不是面向对象的,往往在实际的业务中使用不方便,为出现了一种叫 包装类的数据类型,就是对基本数据类型进行了封装,便于使用的类。每个基本数据类型都有一个对应的包装类。

包装类的操作中 把基本数据类型转为包装类,我们称之为 装箱;把包装类转换为基本数据类型的操作,我们称之为 拆箱

虽然包装类可以方便使用,但在计算方面,由于需要装箱拆箱等操作,往往会比基本类型慢很多。

为了方便计算,java提供了一个 Math类,该类封装了非常的数学计算方法(对数、平方根、指数、三角函数等)

每个包装类都定义了最大值、最小值变量,以及一些方便使用的方法。所有数字类型的包装类都有同一个父类 Numbers,该类兼容所有数字类型包装类,因为是父类。


包装类

包装类

byte 对应的包装类是:Byte
boolean 对应的包装类是:Boolean
short 对应的包装类是:Short
char 对应的包装类是:Character
int 对应的包装类是:Integer
long 对应的包装类是:Long
float 对应的包装类是:Float
double 对应的包装类是:Double

包装类的长度大小与基本类型一致,但默认值都是 null;包装类的运算实际上是会把值先转换成基本数据类型(拆箱),然后进行运算操作并拿到运算结果,再把结果转回包装类(装箱)。与基本数据类型的运算速度项目,正是多出了这种装箱拆箱的操作损耗。在大量的装箱拆箱的操作下,还是会损耗一定的性能,所以计算操作尽量使用基本数据类型进行,或者用基本数据类型配合使用Math类进行运算。

包装类型的值都是引用类型,都是值不可变的,Long a = 66L , a = 999L:这里对a=999L的赋值,并非是改变66L为999L,而是在堆中新建一个值为999L的值,然后把a指向66L堆的地址改成999L的堆地址。此时堆中就有两个值了 66L 和 999L,JVM中有一个GC线程,它会不定时的对堆栈进行扫描,对堆中没有被栈引用的对象回收清理调。

包装类的常用方法:

  • byte byteValue() 以byte类型返回该包装类的值。
  • short shortValue() 以short类型返回该Integer的值。
  • int intValue() 以int类型返回该Integer的值。
  • String toString() 返回一个该值的String对象。
  • boolean equals(Object obj) 比较此对象与指定对象的值是否相等。
  • int compareTo(对应数字类型的包装类) 以数字的方式比较指定的值,如果两个值相等则返回0,小于目标值返回负数-1,大于目标值返回1。
  • 包装类.valueOf(String s) 设置并返回一个数字字符串的包装类数字值。
  • 包装类.parse对应的基础类型(如 Integer.parseInt(String s)) 把数字字符转换为对应的基础类型。

对应包装类型的详细使用,请自行查阅资料,这里仅做学习记录。

强调:包装类大小与基本类型一致、值允许为null,并且默认值是null、封装了一些常用方法、装箱拆箱会造成一定的性能损耗

字符和字符串(char/Character,String)

字符和字符串(char/Character,String)

char/Character 字符类型

  • char类型是一个可存储一个任意类型字符的类型,其所表示的长度为 \u0000(0) 到 \uffff(65,535),16位Unicode字符。由于在实际使用中经常会遇到需要使用对象而非内置数据类型的情况,为了解决这个问题,java语言为内置数据类型char也提供了一个包装类Character类。

  • Character类和上面的包装一样,长度与对应的基本数据类型一致,但默认值是null,并且提供了一些方法来操作使用该类型(是否是字母、是否大写、是否小写、转大写、转小写等)。也一样存在装箱拆箱。它的详细的方法及使用,请查阅资料。

Character常用方法:

  • isLetter() 是否是一个字母
  • isDigit() 是否是一个数字字符
  • isWhitespace() 是否是一个空白字符
  • isLowerCase() 是否是小写字母
  • isUpperCase() 是否是大写字母
  • toUpperCase() 指定字母的大写形式
  • toLowerCase() 指定字母的小写形式
  • toString() 返回字符的字符串形式,字符串的长度为1

String 字符串类型

  • String字符串类型是java开发中使用非常频繁的一种数据类型,它也是一种引用数据类型,可以存储0到任意字符串长度的字符。

  • 其实String的底层代码,在大多数java版本中(包含java8),其存储字符串使用的是char[] 数组来完成的,但在高版本中(java9开始),String的存储已经优化为了 byte[]数组方式来存储了,byte的空间比char要更小,在性能上还是有了一定的提升。String赋值的时候都会指向内存堆的对象,对String值的修改,其实是新建了一个值对象,并且String变量指向了新值的地址。把同一个对象值赋给其他对象时,其实是把其他对象的变量地址也指向了该值的地址,而不是重新新建了一个值。

  • String字符串可以用+进行连接: String a = “你好,” + “fig”; String类提供了丰富的方法,如:valueOf()值转换为String、转大写、转小写、字符串分割、字符串截取等。详细的String类型使用,请自行查阅资料。如果有大量字符串循环拼接的场景,尽量使用StringBuilder类进行拼接操作,该类拼接字符只会产生一个对象,可以提高性能;而String的+拼接操作,每次拼接一下就会在堆中多生成一个临时对象,不仅耗费内存,而且还影响GC效率。值得注意的是,在java9版本开始,普通的String字符串+操作,并不需要改写成StringBuilder,因为编译时编译器会把多个连续的+操作编码为StringConcatFactory的操作。在运行期,StringConcatFactory会自动把字符串连接操作优化为数组复制或者StringBuilder操作。

String字符串拼接处理,java还提供了另一个类 StringJoiner(),这个类提供了两个常用的构造函数:

  • StringJoiner(“连接符”):使用该构造函数进行.append()拼接时,会在拼接中使用“连接符”隔开。 “字符串1 连接符 字符串二”-> “hello,szy”。
  • StringJoiner(“连接符”, “开头”, “结尾”):使用该构造函数进行.append()拼接时,会在拼接处加上连接符,而且还会为拼接后的字符串加上开头和结尾的字符串(“开头"字符串1"连接符"字符串2"结尾”)。
  • 而StringJoiner()的底层使用的就是StringBuilder,所以其性能与StringBuilder相处无几。

String常用方法:

  • String[] split(String regex) 字符串分割,根据表达式进行分割。
  • String[] split(String, int limit) 字符串分割+分割数量,根据表达式进行分割。
  • String toLowerCase() 返回字符串小写字母形式。
  • String toUpperCase() 返回字符串大写字母形式。
  • int length() 获取字符串的长度。
  • boolean endsWith(String suffix) 字符串是否以指定的字符串结束。
  • boolean startsWith(String prefix) 字符串是否以指定的字符串开头。
  • String substring(int beginIndex) 字符串截取(切片)。
  • String substring(int beginIndex, int endIndex) 字符串截取(切片)。
  • boolean matches(String regex) 字符串是否匹配给定的表达式。
  • boolean equals(Object anObject) 判断两个对象的值是否一致。
  • boolean contains(CharSequence s) 判断字符串中是否包含给定的内容。

String的方法中有一个.join()方法,该方法的底层使用的就是StringJoiner类,在不需要指定"开头"和"结尾"时,可以直接使用String.join()。


扩展

扩展

StringBuilder 类是一个String字符串辅助操作类, 主要用于字符串的拼接。当有多个或循环拼接业务时,使用该类操作,可以提高性能及节省内存空间。每次拼接只需要使用append()方法进行追加即可,只会生成一个对象。而不会像String+拼接,每拼接一个字符串就会创建出一个新的字符对象,并把旧的丢弃,数据量大时,严重影响性能。

Math 类是一个数学运算的工具类,其中封装了很多运算方法,如 对数、伪随机数、对数、三角函数、幂运算等。做数学运算时可以使用该类。

Bigdecimal 类是一个处理高精度计算的类,不管使用float、double还是其包装类Float、Double,都可能会出现精度丢失的情况。特别是对于货币、统计等不可丢失精度的业务数据,精度显得特别重要,该类可以计算16位的数值,并且可以指定精度、舍入舍出等。主要提供的方法有 加,减、乘、除、精度控制、转换为各种类型等。

Atomic 原子操作类,这里需要提及一下,用于并发场景下的计算操作、函数式方法操作等。使用CAS实现来保证操作的原子性(线程安全)。

以上仅做学习记录,不做详细讲解,以后会慢慢把他们补充到笔记中,如需了解详细,请查阅资料。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值