常用类_Object和String类
常用类
一,Object类
1.1概述
1.概述:所有类的顶级父类,所有的类都会直接或者间接的继承Object类
2.注意:
a.如果一个类明确写出了extends 父类,那么此类的亲爹就是extends后面的哪个父类
public class A{}
public class B extends A{}
b.如果一个类没有明确写出extends 父类,那么此类的亲爹就是Object
public class A{} A的亲爹就是Object
c.Object属于lang包,使用lang包下的对象,不需要导包
1.2Object类中的toString方法
快捷键:
1.按住ctrl,鼠标点击对应的类,方法等,会快速跳转到被调用的位置
2.按:alt+7,快速看当前类中的成员
- 按:ctrl+n,快速搜索要使用的类
1.Object类中的toString方法
String toString() 返回该对象的字符串表示形式
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
2.结论:
a.如果一个类没有重写Object类中的toString方法,直接输出对象名,默认调用了Object类中的toString方法,输出了地址值
b.如果一个类中重写了Object类中的toString方法,再输出地址值,重写没意义,所以我们重写之后,需要返回对象的内容(属性值)
1.3Object类中的equals()方法
1.equals方法:比较两个对象是否相等
public boolean equals(Object obj) {
return (this == obj);
}
==:针对于基本类型,比较的是值
针对于引用类型,比较的是地址值
结论:
1.如果对象中没有重写Object类中的equals方法,那么使用的equals,就是调用的Object中的,而Object类中的equals只比较地址值
2.如果对象中重写了Object类中的equals方法,再比较地址值就没意义,所以我们重写equals方法之后,应该比较对象之间的内容
/*
工具类:Objects
方法:equals
作用:防空指针
*/
if (Objects.equals(s,"abc")){
System.out.println("s的内容是abc");
}
总结:
如果想直接输出对象名不是地址值,重写toString
如果两个对象比较不是比较地址值,重写equals
怎么重写:alt+insert
二,String类
1.String 介绍
1.概述:String 类代表字符串
2.特点:
a.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现
凡是带双引号的都是String类的对象
b.字符串是常量,它们的值在创建之后不能更改
String s = "hello"
s+="world"
c.字符串是不可变的,所以可以共享
String s1 = "abc"
String s2 = "abc"
2.String的实现原理
1.String的底层是一个数组,而且是一个被final修饰的数组
2.注意:
jdk9之前:String底层数组为char数组->一个char占2个字节
jdk9之后包括9:String底层数组为byte数组->一个byte占1个字节
我们定义的字符串,都会自动装载到底层数组中
String s = "abc"
char[] value = {'a','b','c'}
private final char value[];
数组的前面修饰符为final,为最终的数据,数组一旦建立,数组的地址就被锁死(相当于是一个常量)
3.String的创建
String中的构造:
String() -> 根据String的空参构造创建对象
String(String original) -> 根据String的有参构造创建对象
String(char[] value) -> 根据char数组创建String的对象
String(byte[] bytes)-> 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String
平台:操作系统 GBK
简化形式:
String 变量名 = ""
扩展:
扩展构造:
String(byte[] bytes, String charsetName) ->按照指定的字符集将byte数组转成String对象
charsetName:指定字符集,不区分大小写
String(byte[] bytes, int offset, int length) ->将byte数组中的一部分转成String
bytes:要转的byte数组
offset:代表从数组的哪个索引开始转
length:转多少个
String(char[] value, int offset, int count) ->将char数组中的一部分转成String
value:要转的char数组
offset:代表从数组的哪个索引开始转
count:转多少个
4.字符串拼接
4.1“+”
public class Test05 {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
String s4 = "hello"+"world";
String s5 = s1+"world";
String s6 = s1+s2;
System.out.println(s3==s4);//true
System.out.println(s3==s5);//false
System.out.println(s5==s6);//false
}
}
总结:
字符串拼接:
如果等号右边都是常量拼接,不会产生新的字符串对象
如果等号右边有变量参与,会new一个新的StringBuilder对象
4.2 str.concat()
String str="";
for (int i = 0; i < 100000; i++) {
String haha = str.concat("haha");
}
4.3 StringBuilder()
1.概述:一个可变的字符序列
2.作用:主要是用于字符串拼接
3.既然可以直接用+做字符串拼接,那么为什么还要学StringBuilder呢?
String拼接有个毛病:每次拼接都会产生一个新的串儿,一个串儿就是一个String对象,一个对象就在堆内存中开辟一个新的空间,如果要是拼接次数过多,会造成占用内存资源的问题
StringBuilder拼接的好处:不会过多占用内存资源
4.StringBuilder特点:
a.StringBuilder自带缓冲区,其缓冲区其实就是一个char数组,没有被final修饰,所以可变
b.只要new StringBuilder,缓冲区就有了,拼接的字符串都会自动保存到缓冲区中,不会产生新的对象
c.StringBuilder底层的缓冲区,是char数组,默认长度为16
d.StringBuilder拼接字符串之后,如果长度超过了16,会自动扩容
e.扩容怎么扩:底层源码->Arrays.copyOf->数组复制(创建一个新数组,将容量定位要扩充的容量,然后将新数组赋值给老数组)
f.扩容扩多少呢?-> 2倍+2
1.构造:
StringBuilder()
StringBuilder(String str)
public class Test01 {
public static void main(String[] args) {
//StringBuilder()
StringBuilder sb1 = new StringBuilder();
System.out.println(sb1);
//StringBuilder(String str)
StringBuilder sb2 = new StringBuilder("abc");
System.out.println(sb2);
}
}
StringBuilder sb = new StringBuilder(str);
for (int i = 0; i < 10; i++) {
sb.append(11).append(22);
}
常用方法:
StringBuilder append(任意类型)->字符串拼接,返回的是StringBuilder自己
StringBuilder reverse()->字符串翻转,返回的是StringBuilder自己
String toString()-> 将StringBuilder对象转成String对象
4.4StringBuilder与StringBuffer()
String str="";
StringBuffer stringBuffer = new StringBuffer(str);
System.out.println(stringBuffer.append(11));
String:
拼接字符串效率低,每拼接一次,都会产生一个新的字符串,耗费内存资源
StringBuilder和StringBuffer区别:
1.相同点:用法一样,底层实现一样
2.不同点:
StringBuilder: 效率高,线程不安全
StringBuffer: 效率低,线程安全
4.5几种方式的比较
首先,如果a为null 那么 concat方法会抛出空指针异常 而a+b会把b拼到null后面然后作为字符串输出
其次,concat只能对String操作,而+会把其他类型数据默默地转换为字符串(用toString)再拼接
最后,通常情况下concat会比+更快,但是在大量次数拼接时还是SB最快
从拼接字符串效率上来说:StringBuilder>StringBuffer>String
5.String的方法
判断方法
boolean equals(Object anObject) -> 比较两个字符串的内容
boolean equalsIgnoreCase(String anotherString)-> 比较两个字符串的内容,忽略大小写
获取功能
public int length():返回 此字符串的长度
public String concat(String str):将指定的字符串拼接到老串的末尾
char charAt(int index) :返回指定索引出的char值
int indexOf(String str) :获取的是指定字符串在老串中第一次出现的索引位置
String substring(int beginIndex):返回一个子字符串,从beginIndex开始截取字符串到字符串末尾,老串不动
String substring(int beginIndex, int endIndex) :返回一个子字符串,从beginIndex到endIndex截取字符串, 含beginIndex,不含endIndex
转换功能
char[] toCharArray() -> 将字符串转成char数组
byte[] getBytes() -> 使用默认字符集,将字符串转成字节数组
String replace(CharSequence target, CharSequence replacement) ->将与target匹配的字符串使用replacement字符串替换
扩展:
byte[] getBytes(String charsetName)->按照指定的编码表将字符串转成byte数组
分割功能
String[] split(String regex):按照regex分割字符串,返回字符串数组
其他方法
boolean contains(CharSequence s) -> 判断老串中是否包含指定的字符
boolean endsWith(String suffix) -> 判断老串是否以指定的字符结尾
boolean startsWith(String s) -> 判断老串是否以指定的字符开头
String toLowerCase() -> 将字符串字母转成小写
String toUpperCase() -> 将字符串字符转成大写
String trim() -> 去掉字符串两端空格,中间空格去不了