一、Obiect
1、''==''和equals的区别
== | eqquls |
在比较基本类型的数据时 比较的是数值是否相同 | 在没有重写时比较的是两个对象的内存地址是否相同 |
在对比引用数据类型时 比较的是地址是否相同 | 重写后比较的是两个对象的内容是否相同 |
特别注意:理论上重写equals方法必须重写hashCode方法,理论上两个对象的equals相等那么他们的hashCode必须一致,例如s1.equals(s2) = true,则s1.hashCode则必须等于s2.hashCode,同一个类的两个对象的equals相等,则hash code必须一致,但是反过来则不一定;
2、String
1、解释字符串是一个常量--被创建完成后不能被改变;
特别注意上图中的MethodArea在jdk1.8后被合并到heap中用永久代(Parmanent)和元空间(MetaSpace)来代替了;
3、字符串的+拼接运算,底层默认调用了StringBuilder中的append方法。如果拼接的字符串数量相对较少,那么可以使用+拼接运算;如果拼接的字符串数量较多,那么建议用StringBuilder
StringBuilder加append()后产生的对象返回的是一个StringBuilder对象,所以后面一半使用toSring方法来转化为字符串;特别注意:toString底层调用的是一个新的new String转化的方式;
4、String中提供了很多操作,但是并不会改原字符串的操作:比如concat()
String s1 = "abc";
s1.concat("def");
system.out.print(s1)//s1=abc
//下面一种会改变
String s1 = "abc";
String s1=s1.concat("def");
system.out.print(s1)//s1=abcdef
5、常用的函数
//底层维数组--所以传入想要查找的下标即可;
charAt(int index)
//比较两个字符串是否相等(严格来讲比较两个字符串的大小)
//底层获取两个字符串对应位置上的元素--然后逐位相减-不相等则返回字符串之差
相同则返回字符串长度之差
结果:正数---s1>s2; 0 --- s1=s2; 负数 --- s1<s2;
compareTo()
compareToIngoreCase()//忽略大小写
concat()//拼接
contains()// 包含
endWith()
startWith()
equals()//底层默认重写了--所以在比较字符串时--结果为比较两个字符串的内容是否一致;
6、字节和字节数组的转化过程;
7、获取指定子串在第一次出现的下标
String str = “hdahfakfnalkf“
String sub = ”e“
sout(str.indexOf(sub));//找不到则返回-1----里面也可以指定从指定下标的位置往后找;传两个参数即可;
练习:获取指定元素所有的下标
8、截取子串在java中用
substring(3)//在下标为3 的位置到末尾
substring(3,6)//在下标为3 的位置到6[3,6)--一半包小不包大;
9、toCharArray();//将字符串转化为字符数组
new String(cs) //将字符数组转化为字符串输出--可以指定转化范围(cs,3,4)
10、转化大小写 toLowCase();toUpperCase();
11、去掉字符串的前部和尾部空白 trim()
12、将参数转化为字符串;String s1 = String.valueOf(3);//底层默认转化为字符串toString操作
13、对于对象而言,底层相当于调用了对象的toString方法---结果为对象的地址
14、char[] 数组的valueOf()和toString()不一样;因为它的valueof底层没有调用toString方法所以产生的结果一个是字节,一个是地址;
15、正则表达式知识点:
// 匹配:由字母开头的长度至少为2的字符串
// + 至少一次 x>=1
String s1 = "d 4";
System.out.println(s1.matches("[A-Za-z].+"));
// 匹配:由字母开头的字符串
// * 可有可无 x>=0
String s2 = "a";
System.out.println(s2.matches("[a-zA-Z].*"));
// 匹配:由字母开头的长度不超过2的字符串
// ? 至多一次 x<=1
String s3 = "A2";
System.out.println(s3.matches("[a-zA-Z].?"));
// 判断字符串中是否有数字
String s4 = "o4p";
System.out.println(s4.matches(".*\\d.*"));
// 匹配:由5个字母组成的字符串
// {n} 表示恰好n次 x=n
String s1 = "abcde";
System.out.println(s1.matches("[a-zA-Z]{5}"));
// 匹配:由至少5个字母组成的字符串
// {n,} 表示至少n次 x>=n
String s2 = "abcdef";
// System.out.println(s2.matches("[a-zA-Z]{4}[a-zA-Z]+"));
System.out.println(s2.matches("[a-zA-Z]{5,}"));
// 匹配:由5-8个字母组成的字符串
// {n,m} 表示至少n次不超过m次 n <= x <= m
String s3 = "abcdefgh";
System.out.println(s3.matches("[a-zA-Z]{5,8}"));
// 在正则表达式中,用()括起来的部分,称之为捕获组
// 捕获组是有编号的,编号默认从1开始
// 可以通过\x的方式来引用编号为x的捕获组
// 捕获组的编号按照左半边(出现的位置来依次计算的
// 例如(AB(C(D)E))(F)
// \1 AB(C(D)E)
// \2 C(D)E
// \3 D
// \4 F
// 匹配:至少包含2个"abc"的字符串
String s1 = "sabc5a3s3s";
System.out.println(s1.matches(".*(abc).*\\1.*"));
// 匹配:叠字
// 例如:嘻嘻嘻,哈哈哈哈哈哈哈哈,嗯嗯
String s2 = "嘻嘻嘻";
System.out.println(s2.matches("(.)\\1+"));
// 匹配:AABB式词语
// 例如开开心心,嘻嘻哈哈
String s3 = "高高兴兴";
System.out.println(s3.matches("(.)\\1(.)\\2"));
// 匹配:ABAB式词语
// 例如:活动活动,溜达溜达
String s4 = "活动活动";
System.out.println(s4.matches("(..)\\1"));
// 对数据进行替换
String s1 = "d3hgol23dgn20psn2";
// 将数组替换为-
System.out.println(s1.replaceAll("[0-9]", "-"));
// 去掉所有小写字母
System.out.println(s1.replaceAll("[a-z]", ""));
// 在replaceAll方法中,可以用$x形式来引用编号为x的捕获组
String s2 = "Amy Bob Can Danny Eden Fred Grace";
// 交换Can和Eden的顺序
System.out.println(s2.replaceAll("(.*)(Can)(.*)(Eden)(.*)", "$1$4$3$2$5"));
// 叠字的替换
String s3 = "我我我我我我我我我我我爱爱爱爱爱学学学学学学学学学学学习习习";
System.out.println(s3.replaceAll("(.)\\1+", "$1"));
// split - 对字符串进行切分
String str = "4158dnl3dio2fnl04dfgnl351";
// 以数字作为切分符号,将字符串进行切分
// 如果切分符号是相邻的,那么会且分出""
// 如果切分符号在末尾,那么会将整个切分符号给切掉
String[] arr = str.split("\\d");
System.out.println(Arrays.toString(arr));
16、正则练习:---
1、判断字符串是否是小数--
System.out.println(str.matches("0\\.\\d+|[1-9]\\d*\\.\\d+"));
2、判断是否是8~16的密码--其中包含大小写字母、数字和特殊符号;
// 获取密码
Scanner s = new Scanner(System.in);
String password = s.nextLine();
// 判断密码的长度
// if (password.length() < 8 || password.length() > 16) return;
if (!password.matches(".{8,16}")) {
System.out.println("不合格");
return;
}
// 定义一个变量来记录出现的符号个数
int i = 0;
// 判断大写字母
if (password.matches(".*[A-Z].*")) i++;
// 判断小写字母
if (password.matches(".*[a-z].*")) i++;
// 判断数字
if (password.matches(".*[0-9].*")) i++;
// 判断符号(_ .#)
if (password.matches(".*[_ \\.#].*")) i++;
System.out.println(i >= 3 ? "合格" : "不合格");
17、string中math的常用函数
// 圆周率
System.out.println(Math.PI);
// 立方根
System.out.println(Math.cbrt(27));
// 平方根
System.out.println(Math.sqrt(81));
// 判断一个数字是否是完全平方数
int n = 10;
int sqrt = (int) Math.sqrt(n);
System.out.println(sqrt * sqrt == n);
// 向上取整
System.out.println(Math.ceil(2.4));
// 向下取整
System.out.println(Math.floor(3.98));
// 四舍五入
System.out.println(Math.round(3.51));
// 指数 -> 2^5
System.out.println(Math.pow(2.5, 3.7));
// 获取0<=n<1的伪随机数
System.out.println(Math.random());
// 获取0~100之间的随机整数
int i = (int) (Math.random() * 100);
System.out.println(i);
// 获取20~50之间的随机整数
int i2 = (int) (Math.random() * 30 + 20);
System.out.println(i2);
// 生成6位数字验证码
StringBuilder sb = new StringBuilder();
for (int j = 0; j < 6; j++) {
int n = (int) (Math.random() * 10);
sb.append(n);
}
System.out.println(sb.toString());
练习--模拟双色球(彩票)
// 双色球
// 定义数组来表示红球
// 用true表示这个红球被选中了,用false表示红球没有选中
boolean[] reds = new boolean[35];
// 定义变量记录红球的个数
int n = 0;
System.out.println("红球:");
while(n < 6){
// 选取红球
int i = (int) (Math.random() * 35);
// 判断求之前是否被选中过
if (reds[i]) continue;
System.out.print(i + 1 + "\t");
// 标记红球
reds[i] = true;
n++;
}
System.out.println();
System.out.println("蓝球:");
System.out.println((int) (Math.random() * 16 + 1));
18、bigDecimal
// strictfp关键用在方法上,在方法计算过程中,要求小数以34位小数来进行计算
// 最后计算完成之后,会舍弃掉多余部分的小数
public static /*strictfp*/ void main(String[] args) {
System.out.println(3.02 - 2.87);
// BigDecimal bd1 = new BigDecimal(3.02);
// BigDecimal bd2 = new BigDecimal(2.87);
BigDecimal bd1 = new BigDecimal("3.02");
BigDecimal bd2 = new BigDecimal("2.87");
System.out.println(bd1.subtract(bd2));
BigInteger bi1 = new BigInteger("458741217827854548455665863512373996");
BigInteger bi2 = new BigInteger("12492748935896136842456016657858759812659813941635254106");
// 求和
System.out.println(bi1.add(bi2));
// 求差
System.out.println(bi1.subtract(bi2));
// 求积
System.out.println(bi1.multiply(bi2));
// 0和#
// 0表示必须出现,#表示可以出现可以没有
// .之前,#只能出现0之前 #0.00 #0.0#
// .之后,#只能出现0之后 0.0# 0.#
DecimalFormat df = new DecimalFormat("00.00");
String str = df.format(312.589);
System.out.println(str);
19、Date
// 获取Calendar对象
Calendar c = Calendar.getInstance();
System.out.println(c);
// 指定日期
Calendar c2 = Calendar.getInstance();
c2.set(2022, 5, 1);
System.out.println(c2);
// 获取是这个周的第几天
int i = c.get(Calendar.DAY_OF_WEEK);
System.out.println(i);
//
// 构建日期对象
// 如果不指定,那么默认情况下,获取的是当前的日期对象
Date date = new Date();
System.out.println(date);
// 传入的参数表示从1970年01月01日00:00:00到指定时间的毫秒值
Date date2 = new Date(1689745676848L);
System.out.println(date2);
// 日期格式化 年-月-日
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String fd = sdf.format(date);
System.out.println(fd);
// 指定字符串,转化为日期格式
String str = "2022年05月20日";
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");
Date pd = sdf2.parse(str);
System.out.println(pd);
//
// LocalDate表示日期的类,不包含时间
// 获取当前的日期
LocalDate d1 = LocalDate.now();
System.out.println(d1);
// 指定日期
LocalDate d2 = LocalDate.of(2022, 5, 1);
System.out.println(d2);
// 判断日期是否是一个闰年
System.out.println(d1.isLeapYear());
// 判断指定日期的早晚
System.out.println(d1.isBefore(d2));
System.out.println(d1.isAfter(d2));
// 三周之后
System.out.println(d1.plus(3, ChronoUnit.WEEKS));
// 星期几
System.out.println(d2.getDayOfWeek());
//
// LocalTime只有时间没有日期
// 获取当前的时间
LocalTime t1 = LocalTime.now();
System.out.println(t1);
// 指定时间
LocalTime t2 = LocalTime.of(13, 21, 45);
System.out.println(t2);