一、字符串 String
1.1 声明字符串
字符串(本质:字符的数组) String 引用数据类型 默认值:null(可不是“” 哦)
String str="巴拉巴拉";
str=new String();
str=new String ("巴拉巴拉");
char[]arr={'a','b','c',97};
str=new String(arr);
System.out.println(str);//abca
//valueOf ParseInt
String s = String.valueOf(12);
System.out.println(s);//12
1.2 字符串的拼接
-
加号在做字符拼接和数学运算时,优先级是一样的 字符串和任何类型相加之后类型都是字符串
- 加号 + 使用
(1)加法运算:
- 隐式转换:byte,short,char—> int (byte,short,char三种类型在参与运算时,会先提升为int类型,再进行运算)
- 强制转换:取值范围大的转换成取值范围小的数据,是不允许直接赋值的,需要强制转换。
(2)字符串 “+” 操作:
- 当“+”操作中含有字符串时,“+”就不是算术运算符,而是一个拼接符;
- "123"+123 结果:"123123"
- 连续“+”操作时,从左到右依次执行; 1+99+“年黑马” 结果:“100年黑马”
(3)字符“+”操作:
- 当字符+字符或字符+数字时,就会把字符通过ASCII码表转换成相应数字,进行计算。
-
A~Z的ASCII码值从65~90; a~z的ASCII码值从97~122
-
1+“a" 结果为:98
-
“a"+"abc" 结果为:“aabc"(此处出现字符串,应该是拼接符)
1.3 Arrays.toString
str ="123"+new Object();//123+这个对象Tostring(默认地址)的结果
System.out.println(str);//123java.lang.Object@1b6d3586
// str ="123"+"abc";
str ="123"+new int[] {1,2,3};
System.out.println(str);//123[I@4554617c
1.4 String 类型常用方法
-
* valueOf:把传入参数转成字符串类型 * indexOf:查找字符/子串出现的位置 * ---字串中第一个字符出现的位置,找不到字串返回-1 * charAt():获取指定位置的字符 * subString():截取字符串 * replace():替换(出现即替换) * replaceAll():替换(采用正则表达式) * split():分割字符串 * length():获取字符串长度 * trim():去除前后空白位(空格 \n \r \t ),无法去掉中间空白位 * toUpperCase():大写(针对字母) * toLowerCase():小写(针对字母) * isEmpty():判断是否是空 * starsWith():以什么开头: endsWith(): 以什么结束
- 注意点:
是分割还是还是截取,原字符串没有改变(不可以改变的),产生的是新的变量
-
valueOf()
String.valueOf('1'); String.valueOf(new Object()); String.valueOf(""); 就近原则---选择String 而不是Object //valueOf内部参数列表定义 object 与string ,string更精确,就近选string //String.valueOf(null); //就近原则---选择String 而不是Object test(null);
public static void test(String strs){ System.out.println("1111111"); } public static void test(Object obj ){ System.out.println("2222222"); } }
//indexOf:查找字符/子串出现的位置
// * ---字串中第一个字符出现的位置,找不到字串返回-1
int indext="123456".indexOf("34");//返回3的下标---2
System.out.println(indext);
indext="123123123".indexOf("1");//0--找到第一个停止
indext="123123123".lastIndexOf("1");//6---倒着找第一个
//charAt():获取指定位置的字符
char c = "12345".charAt(4);//3
System.out.println(c);
/* char c1 = "12345".charAt(8);
System.out.println(c1);//StringIndexOutOfBoundsException*/
//subString():截取字符串
"1234567".substring(1);//从下标为1开始截取,直到最后
"1234567".substring(1,4);//截取下标范围:[1,4)---不能为substring(1,7):越界
//replace():替换--有就替换
"123456".replace("34","aa");//12aa56
//replaceAll():
//regex:正则表达式 .表示任意字符
"12.31.23".replaceAll(".","a");//aaaaaaaa
//split():分割字符串
String[] split = "123123123".split("2");//根据2分割字符串
System.out.println(Arrays.toString(split));//[1, 31, 31, 3]
String[] split1 = "123123123".split("1");
System.out.println(Arrays.toString(split1));//[, 23, 23, 23]
String[] split2 = "231231231".split("1");
System.out.println(Arrays.toString(split2));//[23, 23, 23]
//length():获取字符串长度
//trim():去除前后空白位(空格 \n \r \t )无法去掉中间空白位
String trim = "\n\r123 1 3".trim();
System.out.println(trim);//123 1 3
//大写小写(针对字母)
String s2 = "123abc".toUpperCase();//
System.out.println(s2);//123ABC
String s3 = "123abcABC".toLowerCase();//
System.out.println(s3);//123abcabc
//判断是否是空
boolean empty = "123".isEmpty();//是空串返回true
System.out.println(empty);//false
if(!str.isEmpty()){
//str 不为空进行相关操作
//S以什么开头: starsWith()
//以什么结束: endsWith()
boolean b = "123".startsWith("1");//true
boolean b1 = "123".endsWith("0");//false
}
1.5 intern()
-
返回stA在字符串常量池的副本对象
-
过程:检查stA是否在字符串常量池中存在副本,如果不存在就复制一份并存入到常量池中, * 然后返回常量池中的副本对象,如果已经存在副本对象,直接返回副本对象 * * 所以如果两个字符串equals为true---内容一样, * 那么两个字符串的intern的方法是相等的
String s1 = new String("123123"); String s2 = new String("123123"); System.out.println(s1==s2);//false System.out.println(s1.equals(s2));//ture System.out.println(s1.intern()==s2.intern());//true 都返回常量池副本对象
1.6 字符串常量池
-
程序中第一次使用量的形式定义“123”字符串,会将这个字符串对象存入到字符串常量池中 //之后使用量的形式使用该对象,就直接使用常量池的对象
-
String 对象定义后不可改变 //可视为常量---private final char value[] //数组长度不可以改变--字符串长度不可以改变 /*字符串常量池(容器)---方便字符串重用 * 字符串怎样加入到字符串常量池:使用量(双引号引起来的)的方式声明的字符串就会加入到常量池中*/
- 笔试题!!!!!!!!!!!!!!!!!!!
//笔试题 String strC=new String("123"); String strD=new String("123"); System.out.println(strA==strC);//false strC是new出来的是独立的 System.out.println(strC==strD);//false strC和strD都是new出来的,不相同 String strE="12"+"3"; String strF="1"+"2"+"3"; String item="12"; String strG=item+"3"; String strGG=item+3; System.out.println(strG==strGG);//false 都是运行之后才知道结果 String strH="12"+3; System.out.println(strA==strE);//true 在前面解析过程中strE已经明确为”123“ System.out.println(strA==strF);//true System.out.println(strE==strF);//true System.out.println(strA==strG);//false // item是一个变量,不确定的量,在解析时无法确定G是”123“ System.out.println(strA==strH);//true System.out.println(strG==strC);//false final String aa="12";//final常量,不可变的量,就可以明确值可以优化 String strI=aa+"3"; System.out.println(strA==strI);//true String bb=new String("12"); //' String("12") '是构造方法,要运行出来以后才能知道结果 String strJ=bb+"3"; System.out.println(strA==strJ);//false
-
//量的形式 int a=12; String s="123"; Integer.valueOf("23"); //不是量的形式 ???????????????????? char[] arr={'a','b','c'}; s=new String(arr);//不会加入常量池
//程序运行时:就已经编译成abc12的形式,程序没有运行时连常量池都没有 //new String ("abc"+“12”) 创建1个或2个对象(看常量池是否有副本) //new String ("abc12”)
1.7 StringBuilder StringBuffer
- 存在的意义:
追加--调用append 就是往StringBuilder数组中追加字符,没有产生字符串对象
-
在拼接字符串的时候不要产生中间串 --可变性字符串
-
StringBuilder 与 StringBuffer 的区别 线程安全:StringBuilder 不是线程安全的,而 StringBuffer 是线程安全的。StringBuilder 类的方法没有同步(synchronized),因此在多线程环境下,它的性能通常比 StringBuffer 更好。 性能:StringBuilder 通常比 StringBuffer 具有更高的性能,因为它没有同步开销。 其他方面,如可变性、方法和用法,StringBuilder 与 StringBuffer 非常类似。
-
StringBuilder(默认容量 :16)怎么进行扩容: 追加字符数容量不够就需要扩容,默认:原来容量*2+2 如果还不够需要多少就扩到多少
- 补充:数组扩容
System.arraycopy(src,0,st,0,9); 把src(从下标为0开始) 粘贴到St(从下标为0开始) 长度为9
1.8 Objects对象
boolean aNull = Objects.isNull(null);//true
boolean equals = Objects.equals(strB, null);//false/
二、随机数
2.1 随机数 random
- 切记 左闭右开
//随机数 random
double random = Math.random();//[0,1)
//[8,90)
double v = random * 82 + 8;
2.2 随机数对象 Random ---假随机(需要一个种子)
- 种子相同时随机数也会相同
- 如果不传入种子,就会将时间戳作为种子
可以设置最大值范围
//随机数对象 Random---假随机(需要一个种子)
Random random1=new Random(12);
Random random2=new Random(12);
int i = random1.nextInt();//获取随机数
int i1 = random2.nextInt();//
System.out.println(i+"------"+i1);//-1160101563-------1160101563
i = random1.nextInt();//获取随机数
i1 = random2.nextInt();//
System.out.println(i+"------"+i1);//256957624------256957624
//如果不传入种子,就将时间戳作为种子
i = random1.nextInt(200);//设定最大值为200
i1 = random2.nextInt(200);//
System.out.println(i+"------"+i1);//156------156
2.3 四舍五入 round 向上取整 ceil 向下取整--floor
v=12.5;
//取整---long(取整,整数最大就是long)
//四舍五入--round
//输入doubl --》long 输入float--》int
long num=Math.round(v);//13
int round = Math.round(12.33f);
System.out.println(Math.round(0.5));//1
System.out.println(Math.round(-0.4));//0
System.out.println(Math.round(-0.5));//0`1
System.out.println(Math.round(-1.5));//-1
System.out.println(Math.round(-1.8));//-2
//向上取整--ceil
double ceil = Math.ceil(v);//13
//向下取整--floor
double floor = Math.floor(v);//12
三、Date
-
long 表示时间:从1970-1-1 00:00:00 开始 每一毫秒加
//获取当前时间---执行代码time Date date =new Date(); System.out.println(date); Date date1 =new Date(0); System.out.println(date1);//Thu Jan 01 08:00:00 CST 1970
3.1 获取时间戳:getTime()
//getTime():获取时间戳
long time=date.getTime();
System.out.println(time);//毫秒现今累加--1721284513590
//设置两天后的时间
time=time+2*24*60*60*1000;
date =new Date (time);
System.out.println(date);//Sat Jul 20 14:38:53 CST 2024
- 补充:获取月份(月份返回0-11) getMonth()
- 获取分钟0-59,但是日期就按照实际习惯(其他均是)
3.2 时间格式化
- 对象 SimpleDateFormat
- 方法 format
- 补充:12制 hh 24 制 HH
//时间格式化 //12小时制:hh 24 : HH SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd :HH:mm:ss"); String format = sdf.format(date); System.out.println(format);//2024-07-20 :14:45:07
3.3 显示本地时间
-
本地时间--不记录时区 LocalDateTime.now();
-
本地时间--记录时区 ZonedDateTime.now()
- 显示时区 (计算机默认东八区 上海) zdt.getZone()
-
//本地时间--不记录时区 LocalDateTime ldt=LocalDateTime.now(); System.out.println(ldt);//2024-07-18T14:52:37.783 //本地时间--记录时区 ZonedDateTime zdt= ZonedDateTime.now(); System.out.println(zdt);//2024-07-18T14:52:37.784+08:00[Asia/Shanghai] ZoneId zone = zdt.getZone(); System.out.println(zone);//时区 Asia/Shanghai