day11 StringBuilder
StringBuilder和StringBuffer 的概述
区别
二者所有的方法都一样,构造方法也是,他们都具有方法缓冲区,相当于一个容器,内容是可以改变的
StringBuilder 是不同步的,数据不安全,效率高
StringBuffer是同步的,数据安全,效率低
二者不能向String 一样不创建对象直接赋值
StringBuilder和StringBuffer构造方法
public class StringBuilderDemo01{ public static void main(String[] args) { ```java //StringBuffer() 创建一个字符串容器 16 StringBuilder sb = new StringBuilder();//16 System.out.println(sb);//应该一个对象的地址值,一个空? System.out.println(sb.length());//0 System.out.println(sb.capacity());//16 System.out.println("-------------------------"); // StringBuffer(int capacity) StringBuilder sb2 = new StringBuilder(4);//4 System.out.println(sb2); System.out.println(sb2.length());//0 有容量不一定有内容 System.out.println(sb2.capacity());//4 System.out.println("-------------------------"); // StringBuffer(String str) StringBuilder sb3 = new StringBuilder("hello"); System.out.println(sb3.length());//5 是内容的长度 System.out.println(sb3.capacity());//5? 16? 5+16=21 } ``` }
具体原理进入二者的类中查看
总结:StringBuilder sb = new StringBuilder() 默认创建容器空间 16
StringBuilder sb = new StringBuilder(int n); 创建容器空间 n
StringBuilder sb = new StringBuilder("asb");创建容器空间 16+3
而这常用的方法
添加方法
append() insert(int n , String s)//这个需要指定位置添加
StringBuilder sb = new StringBuilder()
sb.append("hello");//hello
sb.append("111");//hello111
链式写法
sb.append("hello").append("111");//hello111
StringBuilder sb = new StringBuilder("hello");
sb.insert(5,11);hello11
删除方法
deleteCharAt(int indexof)
delete(int start,int end) [start,end)
StringBuilder sb = new StringBuilder("hello");
sb.deleteChar(1); //hllo
sb.delete(1,3);//hlo
替换方法
replace(int start,int end,String str) [start,end)
StringBuilder sb = new StringBuilder("hello");
sb.replace(1,3,"aaaa");//haaaalo
反转方法
reverse()
StringBuilder sb = new StringBuilder("hello");
sb.reverse();//olleh
转换方法
toString();
将StringBuilder 转换成 String
StringBuilder sb = new StringBuilder("hello");
String s = sb.toString();
String s1 = new String(sb);
String 类转换成 StringBuilder
方式一
String s = "aaabbb"
StringBuilder s1 = new StringBuilder(s);
方式二
StringBuilder s2 = new StringBuilder();
s2.append(s);
二者与String的区别
String是内容不可变的,而StringBuffer,StringBuilder都是内容可变的。同步 ,是最安全的,效率最低的
StringBuilder和StringBuffer的每次扩容原理
若是这种形式 StringBuilder sb = new StringBuilder();
默认情况下,StringBuilder会将容量扩大为当前容量的两倍加上2
若是 StringBuilder sb = new StringBuilder( int n);
容量扩容 n*2+2;
若是StringBuilder sb = new StringBuilder( String str);
容量扩容 str.length() + 16
Math类
没有构造方法
Math类常用方法
方法名 | 说明 |
---|---|
Math.PI | 常量,圆周率 |
public static double abs(double num) | 取绝对值 |
public static double ceil(double num) | 向上取整 |
public static double floor(double num) | 向下取整 |
public static long round(double num) | 四舍五入 |
public static int max(int a, int b) | 求最大值 |
public static int min(int a, int b) | 求最小值 |
public static double pow(double a, double b) | 求a的b次幂 |
public static double random() | 随机数,随机的范围[0,1) |
Arrays类
概述
java.util.Arrays
此类包含用来操作数组的各种方法,比如排序和搜索等。其所有方法均为静态方法,调用起来非常简单。简单来说:Arrays这个是专门用来操作数组相关的工具类
常用方法
public static String toString(int[] a) 将数组转变为字符串,不止适用于int数组
public static void sort(int[] a) 对指定的int型数组按数字升序进行排序。 相当于冒泡排序
binarySearch(int[] a, int key) 使用二叉搜索算法搜索指定的int数组的指定值,不止适用于与于int数组
binarySearch(int[] a, int fromIndex, int toIndex, int key) 使用二叉搜索算法搜索指定值的指定数组的范围。只不过定义了查找范围,不止适用于与于int数组
System 类
概述
java.lang.System
类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作
常用的方法
public static long currentTimeMillis() 返回以毫秒为单位的当前时间。
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 将源数组指定的元素,覆盖到目标数组指定的元素
public static void exit(int status) 用来结束正在运行的Java程序。参数传入一个数字即可。通常传入0记为正常状态,其他为异常状态
三大属性
-
-
Modifier and Type Field and Description static PrintStream
err
“标准”错误输出流。static InputStream
in
“标准”输入流。static PrintStream
out
“标准”输出流。
-
out 的应用理解
PrintStream out = System.out;//返回了一个PrintStream类的对象 out.println();
in 的应用理解
InputStream in = System.in; //返回了一个InputStream Scanner scanner = new Scanner(in);
err 的应用理解
System.err.println("nihao"); PrintStream err = System.err; err.println("nihao");
包装类
概述
Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而很多情况,会创建对象使用,因为对象可以做更多的功能,如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类,如下:
基本类型 | 对应的包装类(位于java.lang包中) |
---|---|
byte | Byte |
short | Short |
int | ==Integer== |
long | Long |
float | Float |
double | Double |
char | ==Character== |
boolean | Boolean |
什么是装箱
从基本类型转换为对应的包装类对象
什么是拆箱
从包装类对象转换为对应的基本类型
为什么要将基本数据类型转换成包装类对象
基本数据类型功能太单一了
包装类和基本数据类型的区别
以int 为例
int 是基本数据类型, Integer是int的包装类
int 默认值为0 , Integer的默认值null
以Integer与int为例演示他们之间的转换
-
基本类型 转 包装对象(自动装箱)
Integer i = new Integer(4);//使用构造函数函数 Integer iii = Integer.valueOf(4);//使用包装类中的valueOf方法 Integer ii = 4;//自动装箱。相当于Integer i = Integer.valueOf(4); ii = ii + 5;//等号右边:将i对象转成基本数值(自动拆箱) i.intValue() + 5; //加法运算完成后,再次装箱,把基本数值转成对象。
-
包装对象 转 基本类型(自动拆箱)
int num = i.intValue();
基本数据类型与String类型的转换
基本数据类型转String类型
只需要记住valueOf
String s = String.valueOf(数据);
String类型转基本数据类型
基本数据类型 变量名 = 基本数据类型的包装类.parse首字母大字的数据基本类型(字符串)
注意事项
如果字符串参数的内容无法正确转换为对应的基本类型,则会抛出java.lang.NumberFormatException
异常
BigInteger类和BigDecimal类
略
时间日期类
Date类
概述
java.util.Date
类 表示特定的瞬间,精确到毫秒。
继续查阅Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,但是其中有未过时的构造函数可以把毫秒值转成日期对象。
常用构造方法
无参构造
public Date()
分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)
// 创建日期对象,把当前的时间 System.out.println(new Date()); // Tue Jan 16 14:37:35 CST 2020
有参构造
public Date(long date)
分配Date对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即1970年1月1日00:00:00 GMT)以来的指定毫秒数。
System.out.println(new Date(165));//Thu Jan 01 08:00:00 CST 1970 由于我们处于东八区,所以我们的基准时间为1970年1月1日8时0分0秒 所以跟据这个时间通过传入的毫秒数来推断 出 Thu Jan 01 08:00:00 CST 1970
常用方法
public long getTime()
把日期对象转换成对应的时间毫秒值
Date date = new Date(); // 获取从1970年到现在的毫秒值差 long time = date.getTime(); System.out.println(time);
DateFormat类
DateFormat类概述
java.text.DateFormat
是日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。
-
格式化:按照指定的格式,从Date对象转换为String对象。
-
解析:按照指定的格式,从String对象转换为Date对象。
常用的构造方法
public SimpleDateFormat()
用默认的模式和默认语言环境的日期格式符号构造SimpleDateFormat
public SimpleDateFormat(String pattern)
用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。
DateFormat的常用方法
public String format(Date date)
将Date对象格式化为字符串。
// Date --> String Date d = new Date(); // 创建格式化对象 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); String s = sdf.format(d); System.out.println(s);
public Date parse(String source)
将字符串解析为Date对象。
//String --> Date String str = "2019-08-08 12:12:12"; //在把一个字符串解析为日期的时候,请注意格式必须和给定的字符串格式匹配 SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date dd = sdf2.parse(str); System.out.println(dd);
Calendar类
Calendar为抽象类,由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法
public static Calendar getInstance()创建,返回子类对象
Calendar cal = Calendar.getInstance();
==Calendar类中提供很多成员常量,代表给定的日历字段:==
字段值 | 含义 |
---|---|
YEAR | 年 |
MONTH | 月(从0开始,可以+1使用) |
DAY_OF_MONTH | 月中的天(几号) |
HOUR | 时(12小时制) |
HOUR_OF_DAY | 时(24小时制) |
MINUTE | 分 |
SECOND | 秒 |
DAY_OF_WEEK | 周中的天(周几,周日为1,可以-1使用) |
Calendar类常用方法
public int get(int field)
返回给定日历字段的值。
Calendar cal2 = Calendar.getInstance(); //获取当前日期 int year = cal2.get(Calendar.YEAR); int month = cal2.get(Calendar.MONTH)+1; int day = cal2.get(Calendar.DAY_OF_MONTH); int hour = cal2.get(Calendar.HOUR_OF_DAY); int minute = cal2.get(Calendar.MINUTE); int second = cal2.get(Calendar.SECOND); System.out.println(year+"年"+month+"月"+day+"日");//2021年10月26日 System.out.println(hour+"时"+minute+"分"+second+"秒");
public abstract void add(int field, int amount)
根据日历的规则,为给定的日历字段添加或减去指定的时间量。
Calendar cal2 = Calendar.getInstance(); //2021 10 26 //修改日期 cal2.add(Calendar.DAY_OF_MONTH,2);//加2天 cal2.add(Calendar.YEAR,-2);//减2年 //修改后重新获取 int year2 = cal2.get(Calendar.YEAR); int month2 = cal2.get(Calendar.MONTH)+1; int day2 = cal2.get(Calendar.DAY_OF_MONTH); System.out.println(year2+"年"+month2+"月"+day2+"日");//2019年10月28日
public void set(int field, int value)
将给定的日历字段设置为给定值
Calendar cal = Calendar.getInstance(); //单个设置 设置时间 cal.set(Calendar.YEAR, 2021); cal.set(Calendar.MONTH, 11); cal.set(Calendar.DAY_OF_MONTH, 26); //多个设置 cal.set(2021,7,24,13,20,19);
public Date getTime()
返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象
Calendar cal = Calendar.getInstance(); Date date = cal.getTime(); System.out.println(date); // Tue Jan 16 16:03:09 CST 2018
注意
==西方星期的开始为周日,中国为周一。 在Calendar类中,月份的表示是以0-11代表1-12月。日期是有大小关系的,时间靠后,时间越大。==
Calendar和Date互转
//Calendar转Date Calendar c = Calendar.getInstance(); Date d = c.getTime(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); String s = simpleDateFormat.format(d); System.out.println("Calendar转Date为:"+s);
//Date转Calendar //创建日期对象 Date d = new Date(); //创建日历对象 Calendar c = Calendar.getInstance(); c.setTime(d ); System.out.println(c.get(Calendar.YEAR) +"-"+(c.get(Calendar.MONTH)+1)+"-"+c.get(Calendar.DATE));
Date和Calendar有什么区别
区别:比较明显的区别是Date是日期,Calendar是日历,Date是类,Calendar是抽象类。当然,你也可以觉得Calendar是Date的加强版,今后如何使用呢? 都会使用,Calendar功能更强大