【java基础】细解常用类

本文介绍java提供的一些常用类,如String、Math、Random、BigDecimal、Calendar等。

Object和Objects

Object类是所有类、数组、枚举类的父类。所以其方法是所有类都可以调用的。

  • 常用方法,比如equals()、toString()、Class<?> getClass()等
  • 控制线程的暂停和运行,比如wait()、notify()、notifyAll()
  • “自我克隆”,得到一个当前对象的副本,而且二者之间完全隔离。使用的是clone()方法。此方法是被protected修饰的,因此只能被子类重写或调用。
String

字符串就是一连串的字符(char)序列,java提供了String,StringBuffer,StringBuilder三个类来封装字符串,并提供了一系列方法来操作字符串对象。

(1)字符串中的每个字符占几个字节?

在之前,字符串采用char[]数组来保存字符,因此字符串的每个字符占2个字节,而Java9对字符串的实现进行了改进,采用byte[]数组+encoding-flag字段来保存字符,所以此时每个字符只占1个字节。

(2)String类

String是不可变类,一旦一个String对象被创建以后,其到死都是不可变的。String类底层是被final修饰的,所以不可变。像下面的代码,生成了3个字符串对象:“java”,“javastruts”,“javastrutsspring”。

String s1=“java”;
s1=s1+"struts";
s1=s1+"spring";

因为其底层是以数组形式存储的,所以字符串的序数是从0开始的。下面对其常用方法进行列举:

  • 获取字符串中指定位置的字符——charAt()
//结果为W
String s=new String("helloWorld.java");
sout(s.charAt(5));
  • 比较两个字符串的大小——compareTo(),如果相等,则返回0。如果不相等,则返回第一个不相等的字符差。如果较长字符串的前面部分恰巧是较短的字符串,则返回它们的长度差。
String s1=new String("abcdefghijklmn");
String s1=new String("abcdefghi");
String s1=new String("abcdefghiablmn");
//返回长度差5
sout(s1.compareTo(s2));
//第一个不相等的字符是j和a,其所在的位置为9
sout(s1.compareTo(s3));
  • 找到str子字符串在该字符串中第一次出现的位置——indexOf()
String s=“HelloWorld”;
String ss=“or”;
//o出现的次数,2
sout(s.indexof('o'));
//从第2位(l)开始后,o出现的位置,2
sout(s.indexof('o',2));
//子字符串在该字符串第一次出现的位置,6
sout(s.indexof(ss));
  • 将字符串转换成大写——toUpperCase()。转换成小写用toLowerCase()
String s=“HelloWorld”;
sout(s.toUpperCase());

(3)StringBuffer

StringBuffer对象是字符序列可变的字符串,当一个StringBuffer对象被创建后,可通过append()、insert()、reverse()、setCharAt()、setLength()等方法改变此字符串。一旦生成了最终想要的字符串,调用toString()方法将其转为一个String对象即可。

(4)StringBuilder

StringBuffer也代表可变字符串对象,只是其不是线程安全的,所以性能略高。那为什么线程安全,性能就会低呢?因为如果是线程安全的,那其变量就是被加锁了,也就只能是一个线程执行完了,另一个线程才能执行。所以性能略低。
如果想创建一个内容可变的字符串,优先考虑StringBuilder类。

StringBuilder sb=new StringBuilder();
//追加字符串
sb.append("java");
//插入
sb.insert(0,"hello");
//替换
sb.replace(5,6,",");

//删除
sb.delete(5,6);
//改变StringBuilder的长度,将只保留前面部分
sb.setLength(5);

//反转
sb.reverse();

//访问字符序列的长度
sout(sb.length());
//访问StringBuilder的容量
sout(sb.capacity());

Math
//计算绝对值
sout(Math.abs(-0.45));
//找出最大值
sout(Math.max(2.3,6,5));
Random

Random用于生成伪随机数。伪随机数之所以“伪”,是因为其是计算机使用算法模拟出来的,其结果是可预测的,并不是真正的随机产生。

Random rand=new Random();

//将随机字节放入数组中
byte[] buffer=new byte[16];
rand.nextBytes(buffer);
Arrays.toString(buffer);

//生成0.0~1.0之间的伪随机double数
rand.nextDouble();
//生成平均值是0.0,标准差是1.0的伪高斯数
rand.nextGaussian();
//生成一个处于int整数取值范围的伪随机整数
rand.nextInt();
//生成0~26之间的伪随机数
rand.nextInt(26);

Random使用一个48位的种子,如果这个类的两个实例是用同一个种子创建的,对它们以同样的顺序调用,则会产生相同的数字序列。为了避免这种情况,我们可以将当前时间作为Random的种子。

Random rand=new Random(System.currentTimeMillis());

在并发情况下,可使用ThreadLocalRandom来生成伪随机数,能保证线程安全。

ThreadLocalRandom rand=new ThreadLocalRandom.current();
BigDecimal

我们在说数据类型时提到过这个类,当时说浮点类型的float、double容易引起精度丢失,所以引入了更精确的BigDecimal。创建BigDecimal对象有2种方式:

new BigDecimal("0.1")
BigDecimal.valueOf(0.01);

不能定义成new BigDecimal(0.1),因为它的值并不是0.1,而是一个近似0.1的数,那在使用时就会有很多麻烦。下面演示BigDecimal类的基本使用:

//定义BigDecimal对象
BigDecimal f1=new BigDecimal("0.04");
BigDecimal f2=BigDecimal.valueOf(0.01);
//把两个数相加——add()。加减乘除方法:add()、subtract()、multiply()、divide();
sout(f1.add(f2));
Calendar

我们以前处理日期、时间时,可以使用Date类,但是其在偏移量和国际化等方面存在缺陷,所以现在一般使用Calendar类。Calendar和date都是表示日期的工具类,可以相互转换:

//Date转为Calendar。先获得Calendar实例,然后调用其SetTime()方法
Calendar c=Calendar.getInstance();
c.setTime(date);

Calendar的常用方法如下:

Calendar c=Calendar.getInstance();
//取出年——get(YEAR)。月(MONTH)、日(DATE)同理。
sout(c.get(YEAR));
//分别设置年 月 日 小时 分钟 秒。2019-6-8 10:51:36
c.set(2019,6,8,10,51,36);
//将Calendar的年往前推一年
c.add(YEAR,-1);

其中有几点需要注意:

  • Calendar.MONTH表示月份时,是从0开始的。所以数字“8”代表的是7月。
  • add()中,当被修改的字段超过它允许的范围时,会发生进位。比如6月28日加5天,不是6月32日,而是7月2日。
  • roll()不会发生进位,还以6月28日加5天为例,其结果是6月30日。
  • set()方法有延迟修改的特性。就像上面的代码,虽然调用了set方法对c进行赋值,但是其值不会立即修改。直到遇到了get()、getTime()、getTimeInMillis()、add()、roll()方法。
  • 如果使用set()方法改成超过指定时间字段的值,那系统会不会报错?比如我将月份设置为13。如果是处于lenient(容错)模式,则不会报错,结果是YEAR字段加1,MONTH字段为1(2月)。如果是处于non-lenient模式,则会报错。两者可通过setLenient()方法进行相互转换,系统默认为容错模式。
小结

不知读者对本文中类似这样的代码是否有疑问:

sout(s.charAt(5));

现解释一下,这个代表:

System.out.println(s.charAt(5));

那为什么写成sout呢?sout是MyEclipse中输出语句的快捷键,这样写是图方便。抖个机灵,嘻嘻~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡夫卡的熊kfk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值