文章目录
- 1、String类
- String概述
- 创建对象的两种方式
- 字符串的内容比较
- String常用API
- String类开发验证码功能
- 手机号码屏蔽功能
- 2、Object类
- Object类的作用
- Object类的常用方法
- **Object的toString方法**
- Object的equals方法
- 3、Objects类
- 4、StringBuilder类
- 5、Math类
- 6、System类
- 7、BigDecimal作用
- 8、日期时间
- Date类
- SimpleDateFormat类
- Calendar类
- 9、JDK8开始新增日期API
- LocalDate、LocalTime、LocalDateTime
- Instant时间戳
- DateTimeFormatter类
- Period类
1、String类
String类定义的变量可以用于存储字符串,同时String类提供了很多操作字符串的功能
String概述
-
java.lang.String类代表字符串,String类定义的变量可以用于指向字符串对象,然后操作该字符串
-
Java程序中的所有字符串文字(例如“abc”)都为此类的对象
String name = "小吴"; String schoolName = "B站大学";
String类的特点详解
-
String其实常被称为不可变字符串类型,它的对象在创建后不能被更改
public class StringDemo01 { public static void main( String[] args ) { String name = "小吴"; name+="在"; name+="敲Bug"; System.out.println(name); } }
-
String是什么,可以做什么?
- 字符串类型,可以定义字符串变量指向字符串对象。
-
String是不可变字符串的原因?
- String变量每次的修改其实都是产生并指向了新的字符串对象。
- 原来的字符串对象是没有改变的,所以称不可变字符串。
创建对象的两种方式
-
方式一:直接使用“ ”定义。
(推荐方式)
String name = "小吴在敲Bug";
-
方式二:通过String类的构造器创建对象。
构造器 说明 public String() 创建一个空白字符串对象,不含有任何内容 public String(String original) 根据传入的字符串内容,来创建字符串对象 public String(char[ ] chs) 根据字符数组的内容,来创建字符串对象 public String(byte[ ] chs) 根据字节数组的内容,来创建字符串对象 package string; public class StringDemo02 { public static void main( String[] args ) { //方式一:直接使用双引号得到字符串对象 String name2 = "我恨Java"; System.out.println(name2); //方式二: //1、public String():创建一个空白字符串对象,不含有任何内容(几乎不用) String s1 = new String();//s1="" System.out.println(s1); //2、public String(String original):根据传入的字符串内容,来创建字符串对象(几乎不用) String s2 = new String("我爱学习"); System.out.println(s2); //3、public String(char[ ] chs):根据字符数组的内容,来穿件字符串对象 char[] chars = {'a','b','学','习'}; String s3 = new String(chars); System.out.println(s3); //4、public String(byte[] b):根据字节数组的内容,来创建字符串对象 byte[] bytes = {97,98,99,65,66,67}; String s4 = new String(bytes); System.out.println(s4); //会把字节数组中的每个元素转换为对应的字符数组 } }
-
“ ”和构造器给出的字符串有区别吗?
- 以“ ”方式给出的字符串对象,在字符串常量池中存储,而且想通内容只会在其中存储一份。
- 通过构造器new对象,每new一次都会产生一个新对象,放在堆内存中
(分开存储)
。
字符串的内容比较
- 推荐使用String类提供的“equals”比较:只关心内容一样即可
equalsIgnoreCase:
忽略大小写进行比较
如果是字符串比较应该实用什么方式进行比较,为什么?
- 使用S天天日你哥提供的equals方法。
- 只关心内容一样就放回true。
开发中什么时候使用==比较?
- 基本数据类型比较时实用。
String常用API
方法名 | 说明 |
---|---|
public int length() | 返回此字符串的长度 |
public char charAt(int index) | 获取某个索引位置出的字符 |
public char[ ] toCharArray() | 将当前字符串转换成字符数组返回 |
public String substring(int beginIndex, int endIndex) | 根据开始和结束索引进行截取,得到新的字符串 (包前不包后) |
public String substring(int beginIndex) | 从传入的索引处截取,截取到末尾,得到新的字符串 |
public String replace(CharSequence traget, CharSequence replacement) | 使用新值,将字符串中的旧值替换,得到新的字符串 |
public boolean contains(CharSequence s) | 判断字符串是否包含了指定的字符串 |
public boolean startsWith(String prefix) | 判断以什么开始 |
public String[] split(String regex) | 根据传入的规则切割字符串,得到字符串数组返回 |
Demo
public class StringAPIOttherDemo05 {
public static void main( String[] args ) {
//public int length ():返回此字符串的长度
String name = "我爱学习Java";
System.out.println(name.length());
//public char charAt ( int index):获取某个索引位置出的字符
char c = name.charAt(1);
System.out.println(c);
//public char[] toCharArray (): 将当前字符串转换成字符数组返回
char[] chars = name.toCharArray();
for (char aChar : chars) {
System.out.println(aChar);
}
//public String substring ( int beginIndex, int endIndex):根据开始和结束索引进行截取,得到新的字符串 (包前不包后)
String rs = name.substring(0, 4);
System.out.println(rs);
//public String substring ( int beginIndex)|从传入的索引处截取,截取到末尾,得到新的字符串
String rs2 = name.substring(4);
System.out.println(rs2);
//public String replace (CharSequence traget, CharSequence replacement):使用新值,将字符串中的旧值替换,得到新的字符串
String name2="小吴是最厉害的80后,小吴棒棒的,我好爱小吴";
String rs3 = name2.replace("小吴", "***");
System.out.println(rs3);
//public boolean contains(CharSequence s):判断字符串是否包含了指定的字符串
System.out.println(name2.contains("小吴"));
System.out.println(name2.contains("大吴"));
//public boolean startsWiths(String prefix):判断以什么开始
System.out.println(name2.startsWith("小吴"));
System.out.println(name2.startsWith("80后"));
//public String[] split (String regex):根据传入的规则切割字符串,得到字符串数组返回
String name3 = "Java,HTML,Css";
String[] names = name3.split(",");
for (String s : names) {
System.out.println(s);
}
}
}
String类开发验证码功能
需求:
- 随机产生一个5位的验证码,每位可能是数字、大写字母、小写字母。
分析:
- 定义一个String类型的变量存储a-zA-Z0-9之间的全部字符。
- 循环5次,随机一个范围内的索引,获取对应字符连接起来即可。
Demo
package string;
import java.util.Random;
public class StringExen1 {
public static void main( String[] args ) {
// 1.定义可能出现的字符信息
String datas = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
// 2.循环几次,每次生成一个随机的索引,提取对应的字符连接起来即可
String code = "";
Random r = new Random();
for (int i = 0; i < 5; i++) {
//随机一个索引
int index = r.nextInt(datas.length());
char c = datas.charAt(index);
code += c;
}
// 3.输出字符串变量即可
System.out.println(code);
}
}
手机号码屏蔽功能
需求:
- 以字符串的形式从键盘接收一个手机号,将中间四位号码屏蔽,最终效果
分析:
- 键盘录入一个字符串,用Scanner实现。
- 截取字符串前三位,截取字符串后四位。
- 将截取后的两个字符串,中间加上****进行拼接,输出即可
Demo
public class StringExec2 {
public static void main( String[] args ) {
// 1.键盘录入一个手机号码
Scanner sc = new Scanner(System.in);
System.out.printf( "请输入您的手机号码:");
String tel = sc.next();
// 2.截取号码的前三位,后四位
String before = tel.substring(0, 3);
String after = tel.substring(7); //从索引开始到末尾
String s = before + "****" + after;
System.out.println(s);
}
}
2、Object类
Object类的作用
- 一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类
- Object类的方法是一切子类都可以直接使用的,所以我们要学习Object类的方法
Object类的常用方法
方法名 | 说明 |
---|---|
public String toString() | 默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址 |
public Boolean equals(Object o) | 默认比较当前对象与另一个对象的地址是否相同,想通返回true,不同放回false |
Object的toString方法
问题引出:
- 开发中直接输出对象,默认输出对象的地址其实是毫无意义的。
- 开发中输出对象变量,更多的时候是希望看到对象的内容数据而不是对象的地址信息。
toString存在的意义:
- 父类toString()方法存储的意义就是为了被子类重写,以便返回对象的内容信息,而不是地址信息
让子类重写,以便返回子类对象的内容
@Override
public String toString( ) {
return "Student{" +
"name='" + name + '\'' +
", sex=" + sex +
", age=" + age +
'}';
}
Object的equals方法
问题思考:
- 直接比较两个对象的地址是否相同完全可以用“==”代替equals。
equals存在的意义
- 默认是与另一个对象比较地址是否一样
父类equals方法存在的意义就是为了被子类重写,以便子类自己来定制比较规则
@Override
public boolean equals( Object o ) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return sex == student.sex && age == student.age && name.equals(student.name);
}
3、Objects类
-
Objects类与Object还是继承关系,Objects类是从JDK1.7开始之后才有的
-
Objects的常见方法:
方法名 说明 public static boolean equals
(Object a, Object b)比较两个对象的,底层非空判断,从而可以避免空指针异常。再进行equals比较 public static boolean IsNull
(Object obj)判断变量是否为null,为null返回true,反之返回false -
源码分析
public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); }
-
对象进行内容比较的时候建议使用什么?为什么?
- 建议使用Objects提供的equals方法
- 比较的结果是一样的,但是更安全
4、StringBuilder类
- StringBuilder是一个可变的字符串类,我们可以把它看成是一个对象容器
作用:
提高字符串的操作效率,如拼接、修改等
StringBuilder构造器
名称 | 说明 |
---|---|
public StringBuilder() | 创建一个空白的可变的字符串对象,不包含任何内容 |
public StringBuilder(String str) | 创建一个指定字符串的可变字符串对象 |
StringBuilder常用方法
方法名称 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据并返回StringBuilder对象本身 |
public StringBuilder reverse() | 将对象的内容反转 |
public int length() | 返回对象内容长度 |
public String toString() | 通过toString()就可以实现把StringBuilder转换为String |
为什么拼接,反转字符串建议使用StringBuilder?
- String:内容是不可变的、拼接字符串性能差
- StringBuilder:内容是可变的、拼接字符串性能好、代码优雅
- 定义字符串使用String
- 拼接、修改等操作字符串使用StringBuilder
5、Math类
- 包含执行基本数字运算的方法,Math类没有提供公开的构造器
Math类的常用方法
方法名 | 说明 |
---|---|
public static int abs(int a) | 获取参数绝对值 |
public static double ceil(double a) | 向上取整 |
public static double floor(double a) | 向下取整 |
public static int round(float a) | 四舍五入 |
public static int max(int a,int b) | 获取两个int值中的较大值 |
public static double random() | 返回值为double的随机值,范围[0.0,1.0) |
6、System类
- System的功能是通用的,都是直接用类名调用即可,所以System不能被实例化
System类的常用方法
方法名 | 说明 |
---|---|
public static void exit(int status) | 终止当前运行的Java虚拟机,非零表示异常终止 |
public static long currentTimeMillis() | 返回当前系统的时间毫秒值形式 |
public static void arraycopy(数据源数组,起始索引,目的地数组,起始索引,拷贝个数) | 数组拷贝 |
7、BigDecimal作用
- 用于解决浮点型运算精度失真的问题
- 使用步骤
- 创建对象BigDecimal封装浮点型数据(最好的方式是调用方法)
public static BigDecimal valueOf(double val); //包装浮点数成为BigDecimal对象
- 创建对象BigDecimal封装浮点型数据(最好的方式是调用方法)
BigDeciaml常用API
方法名 | 说明 |
---|---|
public BigDeciaml add(BigDeciaml b) | 加法 |
public BigDeciaml subtract(BigDecimal b) | 减法 |
public BigDeciaml multiply(BigDeciaml b) | 乘法 |
public BigDeciaml divide(BigDeciaml b) | 除法 |
public BigDeciaml divide(另一个BigDeciaml对象,精确几位,舍入模式) | 除法 |
8、日期时间
Date类
- Date类的对象在Java中代表的是当前所在系统的此刻时间
Date的构造器
名称 | 说明 |
---|---|
public Date() | 创建一个Date对象,代表的是系统当前此刻日期时间 |
public Date(long time) | 把时间毫秒值转换成Date日期对象 |
Date的常用方法
名称 | 说明 |
---|---|
public long getTime() | 获取时间对象的毫秒值 |
public void setTime(long time) | 设置日期对象的时间为当前时间毫秒值对应的时间 |
SimpleDateFormat类
- 可以对Date对象时间毫秒值
格式化
成我们想要的时间形式 - 也可以把字符串的时间形式
解析
成日期对象
SimpleDateFormat的构造器
名称 | 说明 |
---|---|
public SimpleDateFormat() | 构造一个SimpleDateFormat,使用默认格式 |
public SimpleDateFormat(String pattern) | 构造一个SimpleDateFormat,使用指定的格式 |
SimpleDateFormat的常用方法
名称 | 说明 |
---|---|
public final String format(Date date) | 将日期格式化成日期/时间字符串 |
public final String format(Object time) | 将时间毫秒值式化成日期/时间字符串 |
public Date parse(String source) | 从给定字符串的开始解析文本以生成日期 |
Calendar类
-
Calendar代表了系统此刻日期对应的日历对象
-
Calendar是一个抽象类,不能直接创建对象
-
Calendar获取日历对象
public static Calendar getinstance(); //获取当前日历对象
Calendar的常用方法
名称 | 说明 |
---|---|
public int get(int field) | 取日期中的某个字段信息 |
public void set(int field,int value) | 遍历日历的某个字段信息 |
public void add(int field,int amount) | 为某个字段增加/减少指定的值 |
public final Date getTime() | 拿到此刻日期对象 |
public long getTimeInMillis() | 拿到此刻时间毫秒值 |
9、JDK8开始新增日期API
- 从Java8开始,Java.time包提供了新的日期和时间API,主要涉及类型有
- 新增的API严格区分了时刻、本地日期、本地时间,并且,对日期和时间和时间进行运算更加方便
- 其次,新API的类型几乎全部都是不变类型(类似于String类),可以放心使用不必担心被修改
LocalDate、LocalTime、LocalDateTime
- 他们分别表示日期、时间、日期时间对象、他们的类的实例是不可变的对象
- 他们三者构建对象和API都是通用的
构建对象的方式如下:
方法名 | 说明 | |
---|---|---|
public static now(): | 静态方法,根据当前时间创建对象 | LocalDate localDate = LocalDate.now(); LocalTime localTime = LocalTime.now(); LocalDateTime localDateTime = LocalDateTime.now(); |
public static Xxxx of(···); | 静态方法,指定日期/时间创建对象 | LocalDate localDate = LocalDate.of(2002,06,19); LocalTime localTime = LocalTime.of(06,19); LocalDateTime localDateTime = LocalDateTime.of(2002,06,19,13,23,24); |
Instant时间戳
- JDK8获取时间戳特别简单,且功能更丰富。Instant类由一个静态的工厂方法now()可以放回当前时间戳。
- 时间戳是包含日期和时间的,与java.util.Date很类似,事实上就是类似JDK8以前的Date
- Instant和Date这两个类可以进行转换
DateTimeFormatter类
- 在JDK8中,引入了一个全新的日期与时间格式器DateTimeFormatter
- 正反都能调用format方法
Period类
- 在Java8中,我们可以使用以下类累计算
日期间隔
差异:java.time.Period - 主要是Period类方法getYears(),getMonths()和getDays()来计算,只能精确到年月日
- 用于LocalDate之间的比较