String字符串
String
是一个类,属于引用类型。
Java
程序中一切使用
""
引起来的内容,都是这个类的实例,称为字符串对象。
字符串定义后是一个常量
,值不可更改。字符串
实际是一个字符数组
。
String str="hello";//这句话在执行时,创建一个hello字符串对象,将其地址保存在str变量中
str="abc";//这里看似是在改变字符串的值,实际是又创建了一个字符串对象abc,将其地址保存在str变 量中
//以上两句话,在内存中会有两个字符串对象hello和abc,str只引用最后赋值的字符串地址abc
String str2="abc";
//字符串实际是一个字符数组
char[] list = {'a','b','c'};
String str3= new String(list);
//这里str2和str3中保存的内容是一样的
可变字符串
String
字符串对象是一个常量,在定义后其值不可改变。
如果使用
String
类的对象,对其频繁更新时,就会不停地创建新的对象,重新引用。
所以如果要执行
1000
次重新赋值的过程,就要创建
1000
个字符串对象,花费很多时间和内存空间,所以
效率很低。这时就需要使用可变字符串类
import java.math.BigDecimal;
import java.util.Random;
import java.util.zip.DeflaterOutputStream;
/** 可变字符串 * */
public class Test1 {
public static void main(String[] args) {
//定义一个空的可变字符串对象
StringBuilder sb = new StringBuilder();
//定义一个普通字符串对象
String str = "";
//1970 1 1 0:0:0 到当前这个瞬间,经过了多少毫秒。记录开始时间
long begin = System.currentTimeMillis();
//模拟循环多次频繁操作字符串,记录花费的时间
for (int i = 1000000; i > 0; i--) {
//如果使用字符串,每次循环都会创建一个新的String字符串对象,重写引用给str,需要 花费大量时间
// str+=i;
//如果使用可变字符串,只有一个对象sb参与,每次都在操作这个对象,不创建新对象,很快 就能结束
sb.append(i);
}
//记录结束时间
long end = System.currentTimeMillis();
System.out.println(end - begin);
}
}
StringBuilder类
用于表示可变字符串的一个类,是
非线程安全
的,建议在单线程环境下使用,效率略高于
StringBuffer
。
StringBuffer类
用于表示可变字符串的一个类,是
线程安全
的,建议在多线程环境下使用,效率略低于
StringBuilder
。
StringBuilder
和
StringBuffer
中的方法作用都一致,只不过
StringBuffer
中的方法使用了
synchronized
关
键字修饰,表示一个同步方法,在多线程环境下不会出现问题。
Date类
用于表示日期时间的类,位于
java.util
包下
SimpleDateFormat类
是一个用于格式化日期的类。
//参数为一个日期模板
SimpleDateFormat(String pattern);
//如定义这样的一个模板对象
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
//创建一个Date对象
Date now = new Date();
//调用格式化方法,参数为一个Date对象
String res=sdf.formart(now);
//输出的形式为2022/07/28
System.out.println(res);
Calendar类
用于表示日历的类。包含了很多日历相关的信息。
是一个抽象类,无法直接创建对象,可以通过该类的
静态方法
getInstance()
获取该类的实例
。
异常
当程序没有按程序员的意愿正常执行,中途出错导致程序中断,出现这种情况,就称为异常。
学习异常就是认识异常的种类和如何避免异常出现。
为了让程序能正常执行,就需要学会解决异常。
异常的产生
异常在程序中以对象的形式存在。当代码执行时出现异常,虚拟机会自动创建一个相应的
异常对象
,如
果没有对该异常进行处理,就会导致程序中断。
异常的分类
异常在程序中以对象的形式存在,所以异常有对应的类。
数组与集合
数组的特点
数组中保存的元素都是有序的,可以通过下标快速访问
数组中保存的数据都是同一种类型
数组的长度在定义后,无法改变
数组无法获取其中保存的实际元素数量
集合的特点
能保存一组数据,可以有序也可以无序
集合的容量可变
集合中可以保存不同类型的数据
可以获取集合中实际的元素数量
ArrayList和LinkedList的区别
1.两者都是
List
接口的实现类,保存的元素有序可重复,允许保存
null
,拥有一些公共的方法,如
size()
,
isEmpty()
,
subList(int from,int to)
等
2。ArrayList
采用数组实现,对于随机读取效率更高,通常用于查询;
LinkedList
采用双向链表实现,
插入删除不影响其他元素位置,通常用于中间插入删除。
Set接口(无序不重复)
无序集合,元素不可以重复,允许保存
null
,没有索引。
在接口中定义了一些操作元素的方法,如获取元素数量、添加、删除、替换、截取等。