需要会的内容
- avaAPI文档的使用
- String 类
- Date日期类以及格式化类
- String字符串的特性
- StringBuffer的使用
- String和StringBuffer的常用方法
一、String类
基本数据类型 :不属于Object类型的继承体系之下
引用数据类型 :属于对象类型 Object类型的继承体系之下。
String 字符串是引用数据类型 Object类型
1、什么是string
字符串、引用类型、字符串对象
2.String的特性
字符串不可变
每一个字符串都是String类的实例对象//
正是因为字符串是不可变的,所以字符串是共享的。
字符串的效果上相当于一个char[] 数组,但是它的底层原理是byte[] 字节数组。
String str=“值”------使用方法跟基本数据类型一样,先看常量里面是否有这个值如果有就直接指向, 如果没有就开辟空间存储
String str=new String(); 最少开辟两个内存空间,有可能是三个,堆区都会开辟空间 还有栈区 ,常量池中得看以前有没有。
特性:String字符串是不可变,每一次得=赋值都是地址得重新开辟
3、创建字符串
3.1、 直接 String str=“abc”;
注意字符串是需要双引号的 字符串对象 。虽然没有new
3.2、通过构造方法
String str = new String(“abc”);
4、字符串的常用方法
String()
初始化新创建的String对象,使其表示空字符序列。
String(String orignal)
初始化新创建的string对象,使其表示参与相同的字符序列,, 就是新创建的字符串是参数字符串的福本
charAt(int index)
返回指定char指引的值。
concat(String str)
将指定的字符串连接到字符串的末尾。
Contains(CharSequence s)
当且当此字符串包含指定的char值序列时才返回true。
endsWith(String suffix)
测试字符串是否以指定的对象进行比较。
equalsIgnore(String anotherString)
将此String与其他string比较, 忽略案例注意事项
getBytes()
使用平台的默认字符集将此String编码为字节序列,将结果存储到新的字节数组中
等等等
实例
//返回指定索引的字符串 关键字charAt
String str1="abcd bce df bcgh";
char c=str1.charAt(2);//c
System.out.println(c);
//将指定的字符串str2追加到str1结尾 关键字 concat
String str1="abcd bce df bcgh";
String str2="123";
String ab=str1.concat(str2);
System.out.println(ab);//abcd bce df bcgh123
//返回字符串中是否包含指定的char字符串 关键字contains
String str1="abcd bce df bcgh";
boolean a=str1.contains("1");
System.out.println(a);//false
//判断字符串是以指定字符串结尾 endsWith
String str1="abcd bce df bcgh";
String str2="123";
boolean a=str1.endsWith("h");
System.out.println(a);//true
//join 拼接字符串 将指定字符串拍拼接到一起 关键字join
String str1="abcd bce df bcgh";
String str2="123";
String str3=".....";
String b=String.join("*",str1,str2,str3);
System.out.println(b);//abcd bce df bcgh*123*.....
//用新字符串将所有的老字符串替换 关键字 replace
String str1="abcd bce df bcgh";
String a=str1.replace("df","34");
System.out.println(a);//abcd bce 34 bcgh
5.字符串中的比较方法
小结:栈存引用(基本数据类型),只要new了 就在堆中。常量保存在常量池中。
String str1 = “abc”; 先去常量池中找”abc“ 是否存在,如果存在直接引用,不存在,就创建。
String str2 = “abc”;先去常量池中找”abc“ 是否存在,如果存在直接引用,不存在,就创建。
== :用法
1. 如果是基本数据类型:== 比较值。
2. 如果是引用数据类型:== 比较引用的地址。
equals(): 注意
如果想比较(String)引用数据类型的值,可以通过两个方法比较
//字符串比较方法equals() 方法 比较字符串是否一样的
String str1=" a bcgh";
boolean a=str1.equals("bcgh");
System.out.println(a);//false
boolean b="abc".equals(str1);
System.out.println(b);//false 荐写法 将字符串写到前边 可以防止空指针异常
boolean c=" A bcgh".equalsIgnoreCase(str1);
System.out.println(c);//true 忽略大小写比较 注意
equalsIgnoreCase() 忽略大小写比较 注意
6、字符串的一些获取方法
方法名 | 含义 |
---|---|
public int length(){} | 获取字符串中字符的个数,拿到字符串长度 |
public String concat(String str){} | 将当前字符串与参数字符串拼接,得到一个新的字符串 |
public char charAt(int index){} | 返回指定索引位置的单个字符(索引从0开始) |
public int indexOf(String str){} | 查找参数字符串在本字符串中首次出现的索引位置,如果没有则返回-1 |
public String substring(int index){} | 截取从参数位置一直到字符串末尾。返回新的字符串 |
public String substring(int begin ,int end){} | 截取从开始索引到结束索引之间的字符串。返回新的字符串,前闭后开 |
public boolean endsWith(String str){} | 判断字符串是否以指定的字符串结尾 |
public boolean startsWith(String str){} | 判断字符串是否以指定的字符串开头 |
public String trim(){} | 清楚左右两端的空格,并返回清除空格后的字符串 |
replace(oldStr,newStr){} | 将所有出现的老字符串替换成新的字符串,并返回结果字符串。 |
public String[] split(String regex){} | 按照参数的规则将字符串拆分成若干部分,返回一个数组。 |
注意:在java中字符串就是常量。就算对一个字符串进行操作,原来的字符串还是不会改变,只不过又生成了新的字符串。
我们做的对字符串的任何操作,都不会改变原有字符串,但是会创建新的字符串对象。
String str1 = "abc";
str1 = "123";
System.out.println(str1);
//此时输出str1值发生了改变,跟上边说的字符串不可变相违背。其实并没有,因为str1中保存的是地址
//值,第一句代码,str1指向 常量"abc",当第二句代码执行后,str1指向了新的常量”123“。所以说
//改变字符串的值,其实就是改变了引用的地址值。
**问题:**当拼接字符串操作时,因为字符串是不可变的,所以当我们拼接字符串时,每拼一次就会在常量池中生成一个新的字符串,开辟一块新的内存空间,如果拼接一亿次,就会开辟很多内存空间,严重浪费(浪费时间,浪费内存空间)。如何解决?
字符串的拼接问题和解决方案
7、StringBuffer和StringBuilder
string字符串不可变,每一次赋值都是新开辟一个内存 比较浪费内存 而这两个方法可以设置可变字符串可以直接改变字符串
StringBuffer
StringBuilder
```java
public static void main(String[] args) {
long start =System.currentTimeMillis();//返回当前时间的毫米数
String str="0";
for(int i=1;i<=100000;i++){
str+=i;
}
// System.out.println(str);
long end=System.currentTimeMillis();
System.out.println(end-start);
System.out.println("=========================");
long start1=System.currentTimeMillis();
StringBuffer buffer=new StringBuffer("0");
for(int i=1;i<=100000;i++){
buffer.append(i);
}
//System.out.println(buffer);
long end1=System.currentTimeMillis();
System.out.println(end1-start1);
long start2=System.currentTimeMillis();
StringBuilder builder=new StringBuilder();
for(int i=1;i<=10000;i++){
buffer.append(i);
}
long end2=System.currentTimeMillis();
System.out.println(end2-start2);
}
可以观察到StringBuffer 和StringBuilder要比String快很多倍。
字符串拼接推荐使用:StringBuffer
## **二、时间类**
**1、Date类**
```java
//获取一个日期对象
Date date=new Date();
System.out.prinln(date);
2.SimpleDateFormat类 格式化日期。
功能:格式化和解析日期
1.将Date类型的日期格式化成我们需要的日期类型, 一般是 字符串类型
2.将字符串类的日期在转回来。
方法名 | 描述 |
---|---|
format(Date date) | 将date型转换成特定格式的字符串 |
parse(String str) | 将字符串str转换成特定格式的date型 |
上面得到的date格式不是常用的格式 ,但是可以转化成常用的格式。
SimpleDateFormat类 中的 format(Date date) 将date型转换成特定格式的字符串。
public static void main(String[] args) {
// 格式 new SimpleDateFormat("yyyy-MM-dd W w EEE hh:mm:ss");
// 显示格式 2021-8-6 16:36 2021-8-6 16:36
//yyyy---> 年
//MM---> 月
//dd --> 日
//HH --> 24小时制
//hh--> 12小时制
//mm --> 分钟
//ss -->秒
//EEE -->星期
//W --> 一月中的第几周
//w--> 一年中的第几周
Date date =new Date();
System.out.println(date);//SimpleDateFormat日期格式化
SimpleDateFormat sm1=new SimpleDateFormat("yyy/MM/dd W w EEE hh:mm:ss");
String ss=sm1.format(date);//format 格式
System.out.println(ss);
}
通过SimpleDateFormat类将一个字符串格式的日期 转换成Date类型
使用parse(String str)将字符串str转换成特定格式发date型
Date date =new Date(); //当前的国际时间
System.out.println(date);
System.out.println(date.getTime()); //getTime 获取毫米级的秒数
System.out.println(date.getHours());//Hours 获取时间
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd W w EEE hh:mm:ss");//格式化有一个时间
String s=sdf.format(date); //将国际时间给这个 格式的 输出查看 format格式转化
System.out.println(s);
//将中国通用格式String---》Date类型
String str = "2020-11-13 星期五 11:40:24";//自己设置一个时间格式
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd E HH:mm:ss");
//parse方法将字符串转换成Date形式的
Date a=sdf1.parse(str);
System.out.println(a);
String b=sdf1.format(a);
System.out.println(b);
3、jdk1.8之后的新增的数据相关类
时间相关类 | 介绍 |
---|---|
LocalDateTime | 时间处理类,返回日期时间 |
LocalDate | 时间处理类,返回日期 |
LocalTime | 返回时间 |
DateTimeFormatter | 格式化日期类 |
Duration | 类以秒和纳秒为单位建立数量或时间量 |
Period | 以年,月和日为单位建立数量或时间量 |
方法 | 含义 |
---|---|
now.format(DateTimeFormatter dateTimeFormatter) 如何拿到DateTimeFormatter? 通过 通过DateTimeFormatter类中的ofPattern();可以拿到 括号中就定义我们需要的格式 |
将日期转化成字符串类型 |
parse(str,DateTimeFormatter dateTimeFormatter) | 将字符串转化成日期类型 |
LocalDate now = LocalDate.now();//返回日期 2021-08-07
System.out.println(now);
LocalDateTime now1=LocalDateTime.now();//返回日期时间2021-08-07T09:35:03.810
System.out.println(now1);
LocalTime now2=LocalTime.now();//返回时间09:35:03.810
System.out.println(now2);
DateTimeFormatter now3=DateTimeFormatter.ofPattern("yyyy/MM/dd");
String aa=now.format(now3);//将日期转化成字符串 在用format分析这个这个格式2021/08/07
System.out.println(aa);
String str ="2021/10/16";
DateTimeFormatter dat=DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate date=LocalDate.parse(str,dat);
System.out.println(date);//2021-10-16 将字符串转化成Date类型