String
String直接赋值 ,存储在方法区常量池中,是固定的值,不能更改,强制更改只是在常量池中再创建一个空间
new String 对象存储在堆中,通过引用方法取中的常量。String str = newString(“a”);是根据"a"这个String对象再次构造一个String对象;在堆中从新new一块儿内存,把指针赋给栈,将新构造出来的String对象的引用赋给str。 因此 只要是new String(),则,栈中的地址都是指向最新的new出来的堆中的地址,
str1 == str2 是false。str1.equals(str2) 比较的是具体的值所以是true
str1和str2都存储在栈中,str2存放的是堆中分配的空间,堆中分配的空间存放的才是常量池中存放ABCD的地址
str1存放的是常量池中ABCD的地址
String str1 = “ABCD” 会创建1(0)个对象
String str2= new String(“ABCD”) 会创建2(1)个对象
str1和str2存放的是两个地址值
注:当字符串常量池中有对象hello时括号内成立!
字符串如果是常量相加,那么先加再在常量池中寻找是否有相加后的这个常量,如果有则地址值相同指向,没有就在常量池中创建,两个常量相加后结果为常量
只要是常量加变量或者是变量加变量,结果就在堆中
static String s1 = "Hello";
static String s2 = "Java";
static String s3 = "Hello"+"Java";
static String s4 = "HelloJava";
static String s5 = s1 + "Java";
static String s6 = "Hello" + s2;
static String s7 = s1 + s2;
static String s8 = (s1 + s2).intern();
字符串.charAt(索引值):获取字符串中索引处的字符
char[] chars = 字符串.tocharArray(); : 将字符串转换为字符数组
String s = new String(字符数组名,起始索引,截取字符串总共的长度) :截取一部分字符数组转化为字符串
String s = new String(字符数组名):将全部字符数组转化为字符串
字符串1(对象).compareTo(字符串2(参数)):字符串是以字节数组形式存储的,当比较两个字符数组的时候是进行逐位比较,从左到右比较是否相等,相等就跳过,比较下一个,不相等就输出(str1的阿斯克码值-str2的阿斯克码值)并且不再向后比较。
string.join(“分隔符”,“要分割的值”“要分割的值”“要分割的值”)
字符串.contains(“查找是否包含的字符串”)如果包含,返回true
字符串.endsWith(“判断字符串是否以字符结尾”)
字符串.startsWith(“判断字符串是否以字符开始”)
" ".equals();
" ".equalsIgnoreCase;
byte[] bytes = 字符串.getBytes(); 将字符串中的字符转化为字节数组
UTF-8编码下一个汉字占三个字节;
gbk编码下一个汉字占两个字节;
字符串名.toUpperCase() : 将字符变为大写
字符串名.toLowerCase() : 将字符变为小写
字符串的哈希码值是固定的
字符串.indexOf(“要找的字符”,“从哪个索引开始查找”) : 获取要找的字符出现的第一个位置,找不到就返回-1;
字符串.intern():只显示值,不判断类型
字符串.isEmpy :是否是一个空字符串,包含空格
字符串.isBlank() :不包含空格看是否是一个空字符串
str.lastIndexOf(“需要找的字符串”) : 输出在字符串中的最后的位置
str.lastIndexOf(“需要找的字符串”,数字): 从数字之前向左找最近的字符串,如果数字位置恰好在需要找字符串的一部分,则不向前找,直接输出那个位置,即便只有一部分
str.replace(旧字符串,需要替换的新字符串)
str.substring(从这个索引后输出全部字符)
str.substring(1,3) : 从一索引输出,到2索引结束
正则表达式
字符串名.matches(“”)
返回true或者false
. 代表任意字符
\d 代表 [0-9]
\w 代表任意一个单词字符,等同于[a-zA-Z0-9_] 字母数字和下划线
\D 不是数字
[] 中括号表示匹配其中任意一个字符
[abc]? 表示可以匹配a或b或c或者什么也不写,不是a和b和c,其间的内容是或的关系
‘+’ 代表之前的字符至少出现了一次
'*'代表之前的字符可有可无
'?'代表之前的字符最多出现一次
正则数量词
[字符]+{n} : 这个字符恰好出现n次
[字符]+{n,}:这个字符出现n次及以上
[字符]+{n,m}:这个字符最少出现n次,最多出现m次
分组
()使用小括号
(abc){3} 表示abc整体出现3次
(abc|def){3} 表示abc整体或者def整体一共出现3次 abcdefabc
String支持正则表达式方法
matches()
boolean match = 字符串变量名1.matches(正则表达式的字符串变量名2)
//字符串1是否符合正则表达式字符串变量名2,符合返回true,不符合返回false
replaceAll():替换
将当前字符串中满足正则表达式的部分全部替换为指定的字符串
String line = “isudf23231sdgniog2354”
字符串变量1 = 字符串变量1.replaceAll(“正则表达式”,“满足正则表达式部分要替换的字符串”)
split() 拆分
将当前字符串按照满足正则表达式的部分进行拆分,将拆分出的以String[]形式返回,相隔的字符用逗号分隔
String[] 字符串数组名 = 字符串名.split(“正则表达式”)
Array.toString(字符串数组的名)—>将字符串数组转化为字符串
注意:1. 如果正则表达式需要分隔字符串在第一个元素,则在字符串中以空字符串代替,只有一个逗号,前面什么也没有
2. 如果需要分隔的元素在字符串最后,则在输出时忽略
3. 如果有连续两个需要分隔的符号,则会输出一个空字符串
JavaBean
JavaBean的三点规则
- 属性都是私有的 private
- 提供私有属性对应的getter\setter
- 必须有一个无参的构造方法
object
所有类的直接间接继承的类,顶级父类
所有类默认继承Object类
为了多态,向上继承
两个常用的被重写的方法
toString
使用构造方法时,就会输出引用变量,默认会调用Object类的toString()方法
如果直接sout这个引用变量,输出的字符串格式为:类的全称@hashcode值,但这个结果对于我们来说没有意义,我们想要输出的是对象的属性值。使用默认的toString不能满足要求,需要重写Object的toString方法
StringBuilder方法 重写toString方法
public String toString(){}
equals
默认调用object类的equals(),内部还是在用==比较地址,没有参考意义,若想比较new出来的两个对象的属性值是否相同,需要重写equals()来比较属性值是否相同
重写alt+insert equals and hashcode()
重写之后就可以用equals比较属性值是否相等
Object类不能装八种包装类,其他的类都可以装
String和包装类在内部重写了equals,所以用equals比较字符串比较属性值.StringBuileder类没有重写equals(),比较的不是属性值。equals两边的类型要相同