1.StringBuffer类
线程安全的,可变的字符序列
关于StringBuffer的代码相当简单是个人都会的,但是底层和面试问的东西比较深的所以你们下去一定看看一些东西
String 不可变
面试题:String Stringbuffer StringBuilder区别
我们可以清楚的看到String的字符串的连接效率是最低的,这一点对于大量字符串的拼接可以很明显的表示出来,所以说大量字符串的拼接最好不要选择String。StringBuffer和StringBuilder对于字符串的拼接效率是大致相同的
为啥StringBUilder效率高?因为StringBuilder是线程不安全的,StringBuffer线程安全
四、总结 1.String为固定长度的字符串,StringBuilder和StringBuffer为变长字符串; 2.stringBuffer是线程安全的,StringBuilder是非线程安全的; 3.StringBuffer和StringBuilder的默认初始容量是16,可以提前预估好字符串的长度,进一步减少扩容带来的额外开销
String在java中是不可变长的,一旦初始化就不能修改长度,简单的字符串拼接其实是创建新的String对象,再把拼接后的内容赋值给新的对象,在频繁修改的情况下会频繁创建对象,而StringBuilder则不会,从头到尾只有一个实例对象,那StringBuilder是怎么实现的呢? StringBuilder在进行append连接字符串的时候并不是用String存储,而是存放到一个名为value的char数组当中,字符串是固定长度的,而数组是可以扩容的,这样就不需要不停创建对象了。
2.枚举(enum)
####
Java 中的枚举是一个特殊的类,一般是表示一组常量 final static int a = 30; 枚举就是用来表示常量的,只不过是常量的换一种写法而已!!!
Java中定义枚举类的时候的语法格式:
public enum 枚举类名 { //下面写常量,常量之间使用逗号隔开 }
package com.qfedu.b_enum; public enum Color { //常量,一般都是大写的 没有任何数据类型的!!! RED, GREEN, BLUE }
swicth (表达式) {}
表达式数据类型有哪些: byte short int char String 枚举
枚举在swicth-case中如何使用【这个重要】
package com.qfedu.b_enum; enum Color3 { RED, GREEN, BLUE } //可以通过switch-case将咱们的常量变成咱们所数据类型 //RED===》红色 //只是一个用判断的一个东西 public class Demo3 { public static void main(String[] args) { Color3 red = Color3.RED; switch (red) { case RED: System.out.println("红色"); break; case GREEN: System.out.println("绿色"); break; case BLUE: System.out.println("蓝色"); break; } } }
枚举类中的几个方法
values();枚举类中所有的值 ordinal();可以找到每个枚举类中常量的索引 valueOf();返回值的是指定字符串的枚举常量
枚举在真实的开发中使用:
在很多时候我们定义一些状态量都是使用0或者1,-1这样在数据库中定义,这样的数据存放在数据库的相应字段中方便数据读取,但是只存储数字,如果定义的表很多,对应的字段也很多,设计的状态就非常多,编码很容易分辨不清楚,一方面去数据库中查看相应字段的注释非常费时间,而且容易产生差错,如果我们使用枚举类,这个问题就很好的解决了。 比如当我们定义了许多状态量,比如订餐支付,未支付,订单的完结,派送,制作等有许多状态,如果不使用枚举,我们在代码层进行判断的时候总是要去思考这个状态是定义的什么呢,0还是-1呢,当项目比较大的时候,光靠我们记是不行的,干脆我们就使用枚举来简化我们的编程,而且还较少了逻辑上出错的可能。
package com.qfedu.b_enum; enum ProductEnum { UP(0, "在架"), DOWN(1, "下架"); private Integer code; private String message; ProductEnum(Integer code, String message) { this.code = code; this.message = message; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } public class Demo5 { public static void main(String[] args) { System.out.println(ProductEnum.UP.getCode()); System.out.println(ProductEnum.UP.getMessage()); System.out.println(ProductEnum.DOWN.getCode());//1 System.out.println(ProductEnum.DOWN.getMessage());//"下架" } }
3.包装类
int->Integer
byte->Byte
short->Short
long->Long
float->Float
double->Double
boolean->Boolean
char->Character
【重点】:
1.自从JDK1.5之后,有拆箱和装箱
自动装箱:将基本数据类型转为包装类
自动拆箱:将包装类转为基本数据类型
2.***Value();将包装类转为基本数据类型
3.toString();将基本数据类型转为字符串
4.parse***();将字符串类型的数据转为基本数据类型【以后开发用】
5.valueOf();将基本数据类型转为包装类类似手动装箱
4.Math
Math
类包含执行基本数字运算的方法,如基本指数,对数,平方根和三角函数。
专门处理数学运算的一个类
绝对值 abs()
最大值 max()
最小值 min()
向上取整 ceil()
向下取整floor()
四舍五入round()
随机数random()
5.Random类
专门处理随机数的类
Random random= new Random;
6.System类
System.out.println(properties.get("os.name")); System.out.println(properties.get("os.version")); System.out.println(properties.get("user.name")); System.out.println(properties.get("user.dir")); System.out.println(properties.get("java.version"));
//Windows 10 //10.0 //bowang //C:\Users\bowang\IdeaProjects\day21_wb //1.8.0_241
7.Runtime【不重要】
//1.获取runtime对象 Runtime runtime = Runtime.getRuntime(); //runtime对象可以启动咱们电脑上面任意的一个软件 //使用代码启动软件 runtime.exec("C:\\Program Files (x86)\\Notepad++\\notepad++.exe"); //返回Java虚拟机将尝试使用的最大内存量。字节数 System.out.println(runtime.maxMemory() / 1024 / 1024);//MB //返回Java虚拟机中的可用内存量 字节数 System.out.println(runtime.freeMemory()/1024/1024); //返回Java虚拟机中的内存总量 字节数 System.out.println(runtime.totalMemory()/1024/1024); } }
8.Date类
专门处理日期的一个类,不过好多方法已经过期了
在类的所有方法Date
接受或返回年,月,日,小时,分钟和秒值,以下表述中使用:
-
y年代表整数y
- 1900
。 -
一个月由0到11的整数表示; 0是1月,1是2月,等等; 11月12日。
-
日期(月的一天)以通常的方式从1到31的整数表示。
-
一小时由0到23之间的整数表示。因此,从午夜到凌晨1点的时间是小时0,从中午到下午1点的小时是12小时。
-
一般以0〜59的整数表示。
-
第二个由0到61的整数表示; 值60和61仅发生在闰秒上,甚至仅在实际上正确跟踪闰秒的Java实现中发生。 由于目前引入闰秒的方式,在同一分钟内不会发生两个闰秒,但是本规范遵循ISO C的日期和时间约定。
-
Date date = new Date(); //Tue Aug 09 16:11:11 IRKT 2022 System.out.println(date); //获取年份 这个年份是减去1900以后的值,所以得加上1900 System.out.println(date.getYear() + 1900); //7 //2 //16 //15 //42 //获取月份 System.out.println(date.getMonth() + 1);//7 //这个日期的星期几。 System.out.println(date.getDay());//2 System.out.println(date.getHours());//16 System.out.println(date.getMinutes());//15 System.out.println(date.getSeconds());//42
9.Calendar
现在国际通用的是Calendar类
Calendar calendar = Calendar.getInstance(); //获取当前的年份 int i = calendar.get(Calendar.YEAR); System.out.println(i);//2022 //获取月份 需要加1的 System.out.println(calendar.get(Calendar.MONTH) + 1);//8 //获取当月的第几天 System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//9 //获取这周的第几天 漂亮国的周日是第1天 System.out.println(calendar.get(Calendar.DAY_OF_WEEK));//3 //获取这一年的第几天 System.out.println(calendar.get(Calendar.DAY_OF_YEAR));//221 //获取时 System.out.println(calendar.get(Calendar.HOUR));//4 System.out.println(calendar.get(Calendar.MINUTE));//39 System.out.println(calendar.get(Calendar.SECOND));//3 //重要的方法 获取当前的时间的 返回值是Date类型的数据 //可以转为Date类型的数据 Date time = calendar.getTime(); System.out.println(time); //Tue Aug 09 16:40:21 IRKT 2022 //这上面时间 对程序员相当不友好!!! //通过一个类将日期格式转换一下 SimpleDateFormat sdf = new SimpleDateFormat("yyyy—MM-dd HH:mm:ss"); //yyyy-MM-dd HH:mm:ss //年-月-天 时:分:秒 //2022-08-09 16:43:32 //将这个格式Tue Aug 09 16:40:21 IRKT 2022 //转换为2022-08-09 16:43:32 String format = sdf.format(time); System.out.println(format); //yyyy-MM-dd HH:mm:ss //以上能不能胡乱写?不能 //以后开发中要用的!!