常用类
1.1 StringBuffer
看API官方手册
线程安全的,可变的字符序列
关于StringBuffer的代码相当简单是个人都会的,但是底层和面试问的东西比较深的所以你们下去一定看看一些东西
String 不可变
package com.day21_w.a_StringBuffer;
public class Demo1 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
//官方手册 构造一个字符串缓冲区 16个字符
//在缓冲区添加字符串元素
System.out.println(sb);
//在末尾添加
sb.append("xixi");
sb.append("hehe");
sb.append("haha");
//在下标为2的地方插入
sb.insert(2, "狗");
System.out.println(sb);
//字符串反转
System.out.println(sb.reverse());
//删除指定下标范围的字符
//要头不要尾 start包含 end不包含
System.out.println(sb.delete(1,3));
//为什么有String还要学习StringBuffer和StringBuilder
//拼接字符串效率不一样
//字符串拼接的时候使用 + 或concat()
//StringBuffer和StringBuilder效率高
//为什么StringBuffer和StringBuilder高 String低
}
}
面试题:String Stringbuffer StringBuilder区别
https://blog.csdn.net/pf6668/article/details/108875324
package com.qfedu.a_stringbuffer;
public class Test {
public static void main(String[] args) {
//String 连接10000次消耗1127ms
//StringBuffer 连接10000次消耗5ms
//StringBuilder 连接10000次消耗3ms
StringTest(10000);
StringBufferTest(10000);
StringBuilderTest(10000);
}
public static void StringTest(int n){
String str = "";
//获取当前系统的时间 还没有执行下面for循环的时候的时间
Long startTime = System.currentTimeMillis();
//使用for循环来拼接!!!
for(int i=0;i<n;i++){
str += i;
}
//获取当前系统的时间 执行下面for循环的时候的时间
Long endTime = System.currentTimeMillis();
System.out.println("String 连接"+ n +"次消耗"+(endTime-startTime)+"ms");
}
public static void StringBufferTest(int n){
StringBuffer str = new StringBuffer();
Long startTime = System.currentTimeMillis();
for(int i=0;i<n;i++){
str.append(i);
}
Long endTime = System.currentTimeMillis();
System.out.println("StringBuffer 连接"+ n +"次消耗"+(endTime-startTime)+"ms");
}
public static void StringBuilderTest(int n){
StringBuilder str = new StringBuilder();
Long startTime = System.currentTimeMillis();
for(int i=0;i<n;i++){
str.append(i);
}
Long endTime = System.currentTimeMillis();
System.out.println("StringBuilder 连接"+ n +"次消耗"+(endTime-startTime)+"ms");
}
}
我们可以清楚的看到String的字符串的连接效率是最低的,这一点对于大量字符串的拼接可以很明显的表示出来,所以说大量字符串的拼接最好不要选择String。
为啥StringBUilder效率高?因为StringBuilder是线程不安全的,StringBuffer线程安全
四、总结 1.String为固定长度的字符串,StringBuilder和StringBuffer为变长字符串; 2.stringBuffer是线程安全的,StringBuilder是非线程安全的; 3.StringBuffer和StringBuilder的默认初始容量是16,可以提前预估好字符串的长度,进一步减少扩容带来的额外开销
1.2 枚举(enum)
语法格式
public enum 枚举类名 {
//下面写常量,常量之间使用逗号隔开
RED,GREEN,BULE
}
package com.day21_w.b_enum;
enum Color2 {
RED, GREEN, BLUE
}
public class Demo2 {
public static void main(String[] args) {
Color2 red = Color2.RED;
System.out.println(red);
Color2 green = Color2.GREEN;
System.out.println(green);
}
}
1.2.1 枚举用于switch-case
package com.day21_w.b_enum;
enum Color3 {
RED, GREEN, BULE
}
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 BULE:
System.out.println("蓝色");
break;
}
}
}
1.2.2 枚举中的方法
package com.day21_w.b_enum;
enum Color4 {
RED, GREEN, BULE
}
public class Demo4 {
public static void main(String[] args) {
//Color4.values() 枚举类中所有的值
Color4[] values = Color4.values();
//ordinal() 打印对应的索引
for (Color4 value : values) {
System.out.println(value + "对应的索引" + value.ordinal());
}
//Color4.valueOf("RED") 返回字符串的枚举常量
//只是换了一种方式
Color4 red = Color4.valueOf("RED");
Color4 red1 = Color4.RED;
System.out.println(red);
}
}
1.3 包装类
Java有八大基本数据类型,都有与之对应的包装类
为啥会有八大基本数据类型的包装类?
包装类能被实例化,封装了很多方法,可以使用,这样操作八大基本数据类型就比较方便了
所以开发中的实体类都是写的包装类
int age====>Integer age;
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();将基本数据类型转为包装类类似手动装箱
1.3.1 自动装箱与拆箱
自动装箱
int i = 10;
Integer i1 = i;
自动拆箱
Integer i2 = 10;
int i3 = i2;
package com.day21_w.c_baozhuang;
public class Demo1 {
public static void main(String[] args) {
//jdk1.5以后有自动装箱和自动拆箱
//自动装箱 int转为Integer
//自动拆箱 Integer转为int
System.out.println(Integer.MAX_VALUE);//最大值
System.out.println(Integer.MIN_VALUE);//最小值
//自动装箱
//int转为Integer
Integer i1 = 45;
//自动拆箱
int i2 = i1;
//除了自动拆箱和自动装箱 java还给我们提供了拆箱装箱方法
Boolean b1 = true;
//***value()
boolean b =b1.booleanValue();
//b现在是基本数据类型
System.out.println(b);
int i3 = 45;
//toString() 是包装类中方法【重要】
String s = Integer.toString(i3);
System.out.println(s);
//以后做银行项目是 double和float有可能会丢失 字符串绝对不会
//pass***();将字符串类型转为基本数据类型【重要】
//passBnt() passBouble() passFloat
int i = Integer.parseInt("250");
System.out.println(i);//int类型
//开发中 分页
//valueOf();将基本数据类型转为包装类
byte b2 = 34;
Byte aByte = Byte.valueOf(b2);
System.out.println(aByte);
//没有必要 因为会自动装箱
}
}
面试题
Integer i1 = 10;
Integer i2 = 10;
sout(i1 == i2);
Integer i3 = 1000;
Integer i4 = 1000;
sout(i3 == i4);
1.4 Math
1.4.1 方法
绝对值 abs()
最大值 max()
最小值 min()
向上取整 ceil()
向下取整floor()
四舍五入round()
随机数random()
package com.day21_w.d_Math;
public class Demo1 {
public static void main(String[] args) {
System.out.println(Math.PI);
System.out.println(Math.E);
//以上两个是常量
//abs() 绝对值
System.out.println(Math.abs(-89));
//max() 最大值
System.out.println(Math.max(39,Math.max(36,56)));
//min() 最小值
System.out.println(Math.min(3,16));
//cell() 向上取整
System.out.println(Math.ceil(45.2));
//floor() 向下取整
System.out.println(Math.floor(89.8));
//round() 四舍五入
System.out.println(Math.round(45.5));
//random() 随机数
System.out.println(Math.random());
//随机1-100之间的整数
int i1 = (int)(Math.random() * 100);
System.out.println(i1);
}
}
1.5 Random类
随机数
package com.qfedu.e_random;
import java.util.Random;
public class Demo1 {
public static void main(String[] args) {
Random random = new Random();
System.out.println(random.nextInt());
System.out.println(random.nextInt(100));//[0,100);
System.out.println(random.nextFloat());
System.out.println(random.nextDouble());
System.out.println(random.nextBoolean());
}
}
1.6 System类
System 是系统的意思
package com.day21_w.f_System;
import java.io.PrintStream;
import java.util.Properties;
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args) {
//打印流
//标准输出流 System.out
PrintStream out = System.out;
out.println("goudan");
//错误输出流 System.err
System.err.println("xixi");
//输入流 System.in
Scanner scanner = new Scanner(System.in);
//1970/1/1到当前时间的毫秒数
long l = System.currentTimeMillis();
System.out.println(l/1000/60/60/24/365);
//获取系统的东西 System 英文就是系统
Properties properties = System.getProperties();
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
// hp
// D:\Java\day21_w
// 1.8.0_241
}
}
1.7 Runtime类
package com.qfedu.g_runtime;
import java.io.IOException;
public class Demo1 {
public static void main(String[] args) throws IOException {
//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);
}
}
1.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的日期和时间约定。
package com.day21_w.h_Date;
import java.util.Date;
public class Demo1 {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date);
//获取年份
System.out.println(date.getYear() + 1900);
//获取月份
System.out.println(date.getMonth() + 1);
//获取星期
System.out.println(date.getDay());
//时分秒
System.out.println(date.getHours());
System.out.println(date.getMinutes());
System.out.println(date.getSeconds());
}
}
1.9 Calender
国际通用的是Calendar类
package com.day21_w.i_Calendar;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Demo1 {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
int i = calendar.get(Calendar.YEAR);
System.out.println(i);
//月份 一月从0开始
System.out.println(calendar.get(Calendar.MONTH) + 1);
//当月第几天
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
//本周第几天 周日为第一天
System.out.println(calendar.get(Calendar.DAY_OF_WEEK) - 1);
//今年的第几天
System.out.println(calendar.get(Calendar.DAY_OF_YEAR));
//时分秒
System.out.println(calendar.get(Calendar.HOUR));
System.out.println(calendar.get(Calendar.MINUTE));
System.out.println(calendar.get(Calendar.SECOND));
//重要的方法 获取当前时间 可以转为Date类型的数据
Date time = calendar.getTime();
System.out.println(time);
//Tue Aug 09 16:39:58 CST 2022
//对程序员相当不友好
//可以通过一个类将日期格式转一下
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(time);
System.out.println(format);
}
}