1.StringBuffer类
StringBuffer是线程安全的,可变的字符序列。
StringBuffer类的常用方法
方法 | 功能 |
---|---|
append(String str) | 将指定的字符串附加到此字符序列。 |
charAt(int index) | 返回 char在指定索引在这个序列值。 |
delete(int start, int end) | 删除此序列的子字符串中的字符。 |
deleteCharAt(int index) | 删除 char在这个序列中的指定位置。 |
indexOf(String str) | 返回指定子字符串第一次出现的字符串内的索引。 |
insert(int offset, String str) | 在此序列中插入 boolean参数的字符串表示形式。 |
lastIndexOf(String str) | 返回指定子字符串最右边出现的字符串内的索引。 |
length() | 返回长度(字符数)。 |
replace(int start, int end, String str) | 用指定的String中的字符替换此序列的子字符串中的 String 。 |
setCharAt(int index, char ch) | 指定索引处的字符设置为 ch 。 |
subSequence(int start, int end) | 返回一个新的字符序列,该序列是该序列的子序列。 |
toString() | 返回表示此顺序中的数据的字符串。 |
substring(int start) | 返回一个新的 String ,其中包含此字符序列中当前包含的字符的子序列。 |
public class Demo6 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
//将指定的字符串附加到此字符序列
sb.append("张三");
sb.append("李四");
//返回char在指定索引在这个序列值
System.out.println(sb.charAt(0));//张
//删除此序列的字符串中的字符,去头不去尾
sb.delete(0, 2);
System.out.println(sb);//李四
//删除char在这个序列中的指定位置
sb.deleteCharAt(1);
System.out.println(sb);//李
//用指定的字符替换此序列的的子字符串
sb.replace(0, 1, "王二麻子");
System.out.println(sb);//王二麻子
System.out.println(sb.indexOf("王二"));
//在此序列中插入boolean参数的字符串形式
sb.insert(1, "关羽");
System.out.println(sb);
//返回一个新的字符序列,该序列是该序列的子序列
sb.subSequence(1,2);
System.out.println(sb);
}
}
面试题:String和Stringbuffer和StringBuilder区别
1.String为固定长度的字符串,StringBuilder和StringBuffer为变长字符串; 2.stringBuffer是线程安全的,StringBuilder是非线程安全的; 3.StringBuffer和StringBuilder的默认初始容量是16,可以提前预估好字符串的长度,进一步减少扩容带来的额外开销
代码实现:
public class Demo2 {
public static void main(String[] args) {
String(10000);
StringBuffer(10000);
StringBuilder(10000);
}
//String耗时
public static void String(int n){
String str = "";
long startString = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
str += i;
}
long endString = System.currentTimeMillis();
System.out.println("String连接"+n+"次消耗: "+(endString-startString)+"ms");
}
//StrinBuffer耗时
public static void StringBuffer(int n){
StringBuffer sb = new StringBuffer();
long startStringBuffer = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
sb.append(i);
}
long endStringBuffer = System.currentTimeMillis();
System.out.println("String连接"+n+"次消耗: "+(endStringBuffer-startStringBuffer)+"ms");
}
//StringBuilder耗时
public static void StringBuilder(int n ){
StringBuilder sb = new StringBuilder();
long startStringBuilder = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
sb.append(i);
}
long endStringBuilder = System.currentTimeMillis();
System.out.println("String连接"+n+"次消耗: "+(endStringBuilder-startStringBuilder)+"ms");
}
}
2.枚举类
Java中定义枚举类的时候的语法格式:
public enum 枚举类名 { //下面写常量,常量之间使用逗号隔开 }
package com.qfedu.b_enum;
public enum Color {
//常量,一般都是大写的 没有任何数据类型的!!!
RED, GREEN, BLUE
}
swicth (表达式) {}
表达式数据类型有哪些:
byte short int char String 枚举
枚举在switch-case中的使用:
enum Color{
RED,GREEN,BLUE;
}
public class Demo7 {
public static void main(String[] args) {
Color red = Color.RED;
switch (red){
case RED:
System.out.println("红色");
break;
case GREEN:
System.out.println("绿色");
break;
case BLUE:
System.out.println("蓝色");
break;
}
}
}
方法 | 功能 |
---|---|
values() | 枚举类中所有的值 |
ordinal() | 可以找到每个枚举类中常量的索引 |
valueOf() | 返回值的是指定字符串的枚举常量 |
代码实现:
enum Color1{
RED,GREEN,BLUE
}
public class Demo8 {
public static void main(String[] args) {
//values;枚举类中所有的值,返回是数组
Color1[] values = Color1.values();
for (Color1 value : values) {
//ordinal()可以找到每个枚举类中常量的索引
System.out.println(value+"对应的索引:"+value.ordinal());
}
}
}
枚举在真实的开发中使用:
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.包装类
Java有八大基本数据类型,都有与之对应的包装类
int age->Integer age;
int->Integer
byte->Byte 1.自从JDK1.5之后,有拆箱和装箱
short->Short 自动装箱:将基本数据类型转为包装类
long->Long 自动拆箱:将包装类转为基本数据类型
float->Float
double->Double
boolean->Boolean
char->Characte
常用方法:
方法 | 功能 |
---|---|
***Value() | 将包装类转为基本数据类型 |
toString() | 将基本数据类型转为字符串 |
parse***() | 将字符串类型的数据转为基本数据类型 |
valueOf() | 将基本数据类型转为包装类类似手动装箱 |
代码实例:
public class Demo9 {
public static void main(String[] args) {
//***value();将包装类转为基本数据类型
Boolean b1 = true;
boolean b2 = b1.booleanValue();
System.out.println(b2);
//toString;将基本数据类型转换为字符串
int i1=45;
String s = Integer.toString(i1);
System.out.println(s);
String s1 = Double.toString(67.3);
System.out.println(s1);
//parse***将字符串类型数据转为基本数据类型
int i = Integer.parseInt("20");
System.out.println(i);
//valueOf()将基本数据类型转为包装类,类似手动装箱
byte b3 = 34;
Byte aByte = Byte.valueOf(b3);
System.out.println(aByte);
}
}
4.Math类
专门处理数学运算的一个类
常用方法:
绝对值 abs() 最大值 max()
最小值 min() 向上取整 ceil()
向下取整floor() 四舍五入round()
随机数random()
代码实现:
public class Demo10 {
public static void main(String[] args) {
//取绝对值
System.out.println(Math.abs(-11));//11
//取最大值
System.out.println(Math.max(30, 20));//30
System.out.println(Math.max(40,Math.max(30,45)));//45
//取最小值
System.out.println(Math.min(10, 9));//9
//向上取整
System.out.println(Math.ceil(3.14));//4.0
//向下取整
System.out.println(Math.floor(3.14));//3.0
//四舍五入
System.out.println(Math.round(3.5));//4
System.out.println(Math.round(3.4));//3
//随机数
System.out.println(Math.random());
}
}
5.Random类
专门处理随机数的类
案例:生成10个不重复的100以内的随机数(能取到100)存入list集合中
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Demo11 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
Random random = new Random();
int num = 0;
while (list.size()<10){
num = random.nextInt(100)+1;
if (!list.contains(num)){
list.add(num);
}
}
System.out.println(list);
}
}
6.System类
ublic class Demo1 {
public static void main(String[] args) {
PrintStream out = System.out;//是一个流 PrintStream 打印流
out.println("goudan");
System.out.println("goudan");//标准输出流打印的东西
System.err.println("xixi");//错误输出流打印的东西
new Scanner(System.in);//输入流
long l = System.currentTimeMillis();
//2022年到1970年 是不是52
System.out.println(l/1000/60/60/24/365);
Properties properties = System.getProperties();
//os.name 系统的名字
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.Data类
专门处理日期的一个类,不过好多方法过期了
SimpleDataFormal常用方法:
方法 | 功能 |
---|---|
equals(Object obj) | 将给定的对象与此 SimpleDateFormat进行比较以获得相等性。 |
format(Date date, StringBuffertoAppendTo, FieldPosition pos) | 将给定的 Date成日期/时间字符串,并将结果追加到给定的 StringBuffer 。 |
parse(String text, ParsePosition pos) | 从字符串中解析文本以产生一个 Date 。 |
方法实现:
public class Demo5 {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//format将给定的 Date成日期/时间字符串,
// 并将结果追加到给定的 StringBuffer
Date date = sdf.parse("2022-08-09");
//parse从字符串中解析文本以产生一个 Date
String str = sdf.format(date);
System.out.println(str);
}
}
案列1:已知两个日期判断相差天数
public class Demo7 {
public static void main(String[] args) throws ParseException {
//定义时间格式
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd");
//利用parse方法解析文本产生一个Date
Date data1 = sdf.parse("08-01");
Date date2 = sdf.parse("08-09");
//将两个已知日期转为毫秒 再转为天
long start1 = data1.getTime();
long starat2 = date2.getTime();
long poor = (starat2 - start1)/1000/60/60/24;
System.out.println("相差了"+poor+"天");
}
}
案列2:输入一个人的出生日期判断多大了
public class Demo6 {
public static void main(String[] args) throws ParseException {
//定义日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//出生日期
Date birday = sdf.parse("2000-12-09");
//先判断当前时间
Date nowTime = new Date();
//将当前日期转为毫秒
long now = nowTime.getTime();
//将出生日期转为毫秒
long birdayM = birday.getTime();
//相减算出毫秒数,再转为年
long age = (now - birdayM)/1000/60/60/24/365;
System.out.println("今年"+age+"岁");
}
}
8.Calendar类
现在国际通用的是Calendar类
常用方法:
方法 | 功能 |
---|---|
DATE | get和 set字段编号表示该月的日期。 |
DAY_OF_MONTH | get字段编号和 set本月的日期。 |
DAY_OF_WEEK | get字段编号和 set表示一周中的日期。 |
DAY_OF_WEEK_IN_MONTH | get字段编号和 set当月的 set几的序号。 |
DAY_OF_YEAR | get和 set字段编号, set本年度的日数。 |
HOUR | get和 set字段编号, get上午或下午的小时。 |
public class Demo2 {
public static void main(String[] args) {
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
//以上能不能胡乱写?不能
//以后开发中要用的!!
}
}