1、String类:
1)String/StringBuffer/StringBuilder三个类,都是表示字符串的类。
2)String:不可变字符串,底层是使用 final 修饰的 char[]实现的,长度也不能改变。
3)StringBuffer 的所有方法都使用了 synchronized 修饰,所以是线程安全的,StringBulider 是非线程安全的。
4)在速度上 StringBuilder > StringBuffer > String。所以要处理较大数据量的字符串时要使用StringBuffer/StringBuilder 同时如果是多线程的话还要考虑线程安全问题。
关于不可变字符串:以下图是我在动力节点官网搜集的,对于初学者来说可以这样理解:
常用操作:这些方法是比较常用但是不容易记得。(其实在Java中大多数方法都是能够根据方法名来判断出他的作用的),这里只列举了少量的方法,如果想要了解更多也可以参考查阅一下文档:
方法类型 | 方法名 | 描述 |
---|---|---|
static String | format("%04d-%02d-%02d", year,month, day) | 返回格式控制的字符串。 |
String | replace(char old, char new) | 返回一个新的字符串,它是通过用 new 替换此字符串 中出现的所有 old 得到的。 |
String [] | split(String regex, int limit) : | 根据匹配给定的正则表达式来拆分此字符串。 |
bolean | startsWith(String prefix): | 测试此字符串是否以指定的前缀开始。 |
CharSequence | subSequence(int beginIndex, int endIndex) : | 返回一个新的字符序列,它是此序列的一个子序列。 |
String | substring(int beginIndex) | 返回一个新的字符串,它是此字符串的一个子字符串。 |
boolean | contains(CharSequence s) | 当且仅当此字符串包含指定的 char 值序列时,返回 true 有时候我们可以用它来简单的判断一个序列是否是另一个字符串的子串。 |
上面方法中提到了一个 CharSequence
public interface CharSequence: 是 char 值的一个可读序列。此接口对许多不同种类的 char 序列提供统一的只读访问。如果想要深入了解,也可以去查看文档,这一点初学者并没有必要。
2、包装类:Java为每个基本数据类型都提供了一个对应的包装类
基本类型 | 包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
/*
static int bitCount(int i)
返回指定 int 值的二进制补码表示形式的 1 位的数量。
byte byteValue()
以 byte 类型返回该 Integer 的值。
int compareTo(Integer anotherInteger)
在数字上比较两个 Integer 对象。
static Integer decode(String nm)
将 String 解码为 Integer。
double doubleValue()
以 double 类型返回该 Integer 的值。
boolean equals(Object obj)
比较此对象与指定对象。
float floatValue()
以 float 类型返回该 Integer 的值。
`````
*/
public class IntegerTest {
public static void main(String[] args) {
//下面几个字段都是静态常量。
System.out.println(Integer.MAX_VALUE);//2147483647,即整型表示的有符号最大值
System.out.println(Integer.MIN_VALUE);//-2147483648,即整型表示的有符合最小值
//创建一个Integer对象。
Integer integer = 100;//当然,也可象这样构造一个Integer对象:Integer integer = new Integer(100);
System.out.println(integer.intValue());//100
}
}
为什么要提供包装类:
众所周知,Java是一个面向对象的高级程序设计语言,面向对象有很多的特点和属性,但是它并不是百分百的面向对象,比如这八种基本数据类型。所以Java为这些基本数据类型提供了各自的包装类,这样以来这些基本数据类型也拥有了面 向对象的一些特点和共性。
比如 int 的包装类型 Integer 类,该类继承了 Number,当然也包括Object类。实现了Comparable 接口,字段有:
MAX_VALUE : 表示 int 类型能够表示的最大值。
MIN_VALUE : 表示 int 类型能够表示的最小值。
SIZE : 用来以二进制补码形式表示 int 值的比特位数。
TYPE : 表示基本类型 int 的 Class 实例。
还有好多方法。在这里就不一一举例了。其他基本类型可以对照着了解。
我们把一个基本类型转换为一个包装类型,这称其为装箱,反过来则称为拆箱。在Java中, 装箱与拆箱可以自动进行,所以大多数情况下不需要我们手动创建包装类的对象。
3、Java日期与时间类型:在时间这一方面,无论从哪一个学科来讲,如果想要深入研究,追求相当精确,那将是非常困难的。大到天体宇宙,小到时分秒···。在java中有这么几个关于时间的类。官方 jdk 文档中对这些关于时间的类、接口等的描述以及解释都是非常之多的,我们也不用去深究。
1)java.util.Date类:Date类表示自从标准基准时间(称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。
2)java.text.SimpleDateFormat 类: 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、 解析(文本 -> 日期)和规范化。 SimpleDateFormat 使得可以选择任何用户定义的日期-时间格式的模式。但是,仍然建议通过DateFormat 中的 getTimeInstance、getDateInstance 或 getDateTimeInstance 来创建日期-时间格式器。
public class Test01 {
public static void main(String[] args) throws ParseException {
//创建一个Date对象,该对象表示当前时间。输出格式:Fri Dec 10 15:20:46 CST 2021
Date date = new Date();
System.out.println(date);//Sun Jan 09 13:57:24 CST 2022
// 将日期对象 date 转成给定格式的字符串:“yyyy年MM月dd日 HH:mm:ss SSS”。
// 这里的yyyy、MM、dd等符号是 SimpleDateFormat类里面设定好的,并且只能识别这样的符号。还有其他符号可以查看
// SimpleDateFormat 类的api文档。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss SSS");
System.out.println(sdf.format(date)); // 2022年01月09日 13:57:24 053
//将给定字符串转成Date对象。
String text = "2035-10-10 00:15:12";
//注意: 格式串一定要完全匹配日期字符串
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
date = sdf.parse(text);
System.out.println( date );// Wed Oct 10 00:15:12 CST 2035
//获取当前日历。该对象是以当前时间设置的一个日历
Calendar calendar1 = Calendar.getInstance();
// 使用set()来设置一个日历。
calendar1.set(2200,6,6);
int year = calendar1.get(Calendar.YEAR);
int month = calendar1.get(Calendar.MONTH);
int day = calendar1.get(Calendar.DAY_OF_MONTH);
System.out.println( year+"-"+month+"-"+day); // 2200-6-6
}
}
3)java.util.Calendar类:类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时 间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。 该类还为实现包范围外的具体日历系统提供了其他字段和方法。这些字段和方法被定义为 protected。与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。Calendar的getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化:
Calendar rightNow = Calendar.getInstance();
Calendar 对象能够生成为特定语言和日历风格实现日期-时间格式化所需的所有日历字段值,例如,日语-格里高里历,日语-传统日历。
Calendar 定义了某些日历字段返回值的范围,以及这些值的含义。例如,对于所有日历,日历系统第一个月的值是 MONTH == JANUARY。
对我们包括我这些初学者来讲,会使用Calendar类来创建一个日历,然后对年、月、日、星期这些信息进行操作就够了。
/*
在Calendar中有以下属性:
YEAR 指示年。 MONTH 指示月份。
DAY_OF_MONTH 指示一个月中的某天。
DAY_OF_WEEK 指示一个星期中的某天。
DAY_OF_YEAR 指示当前年中的天数。
DAY_OF_WEEK_IN_MONTH 指示当前月中的第几个星期。
HOUR指示当天中的某小时 MINUTE 指示当前小时中的某分钟
SECOND 指示当前分钟中的某秒
注意:
月份是0~11;在西方人们认为星期日是一个星期的起始,所以1~7分别表示星期天到星期六。
常用方法有get(),set();我们可以借助蓝桥杯往年的一道题目来理解一下:
世界末日问题:曾有*称1999年12月31日是世界末日。当然该谣言已经不攻自破。还有人称
今后的某个世纪末的12月31日,如果是星期一则会…有趣的是,任何一个世纪末的年份的12月31日都
不可能是星期一!!于是,“谣言制造商”又修改为星期日… 1999年的12月31日是星期五,请问:未来
哪一个离我们最近的一个世纪末年(即xx99年)的12月31日正好是星期天(即星期日)?
*/
public class Test02 {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
for (int year = 1999; year < 10000; year+=100) {
calendar.set(year,11,31);//前面说过,月份是从0开始的,所以将 month 设置为11
if (calendar.get(Calendar.DAY_OF_WEEK)==1){
System.out.println(year); //year = 2299
break;
}
}
}
}
4、java.lang.Math类:定义了一些与数学函数相关的方法。
1)java.text.DecimalFormat类:
2)BigInteger/BigDecimal类:在进行科学计算/财务计算时, 对精度要求比较高,就使用这两个类;
3)java.util.Random类:用于产生随机数
public class Test03 {
public static void main(String[] args) {
//1) Math.random() 产生[0,1)之间 随机小数
for(int i = 0 ; i<10 ; i++){
System.out.println( Math.random() );
}
//2)
System.out.println( Math.sqrt(100)); //平方根
System.out.println( Math.cbrt(100)); //立方根
System.out.println( Math.pow(3, 4)); //3的4次方
//3)
System.out.println( Math.ceil( 5.6 )); //返回大于等于指定数的最小整数 6.0
System.out.println( Math.floor( 5.6 )); //返回小于等于指定数的最大整数 5.0
//4) 两个常量
System.out.println( Math.PI);
System.out.println( Math.E);
}
}