day10 常用类
常用类
Object介绍
Objective类
Objective类的特点
所有类的父类,定义任何一个类就天生具备了Object类的所有方法。
本地方法
native:本地修饰符
本地方法是c++编写,所有的本地方法,要和当前的操作系统交互。
Object类进入内存,本地方法就被调用了,JVM就和操作系统连接了
本地方法运行,是另一个独立的内存区域,本地方法栈
toString()方法
- 定义在Object中,所有子类都可以使用,方法返回的是字符串
- 在输出语句中,输出的是一个对象,默认调用toString()方法
- Object中toString()
1 | public String toString() { |
重写父类toString()方法
- 利用多态性,如果重写了就调用子类的toString(),如果不重写就调用父类(Object)的。
equals()方法
java中认为所有的对象都具备比较性,进行对象之间比较的方法定义在Object中,equals方法的结果返回值boolean类型。
- Object类中的equal()方法
1 | public boolean equals(Object obj) { |
- ==比较引用类型时,比较的是地址。
重写equals()方法
public boolean equals(Object obj) { if(obj==null){//健壮性判断 return false; } if(this==obj){//提升性能的校验 return true; } if(obj instanceof 某类){//安全性校验 //自定义 return 布尔; } return false; } <!--2--> 字符数组私有、final:字符数组一旦创建,数组的地址不能改变,是常量。 jdk9开始,字符串底层实现是byte数组,省内存。
字符串对象的不变性
1
2String str="abc";
str="hello";存放”abc”的String没有改变,而是重新创建String对象存放”hello”,变量str重新保存了”hello”对象的地址。
字符串对象的创建
String对象创建后,在堆内存的对象中会有char数组,用来存放字符。而这个char数组是私有的且不提供set方法,所有通过String对象无法修改char数组的值。final修饰后,数组变量value的值(这个值是地址)也不能修改。
直接创建
1
String str="hello";
使用String的构造器
1
2//不推荐使用,代码太多
String str=new String("hello");两种创建方式的区别:
1
2
3
4
5public static void main(String[] args) {
String str="hello";
String str1=new String("hello");
System.out.println(str==str1);//false
}两个对象的内存地址是不一样的,使用了new ,创建了一个新的字符串对象。所以两个字符串变量不共享同一个String对象。
两种创建方式创建出来的对象在堆内存中的布局是一样的。
字符串定义比较的问题
1
2
3
4
5
6
7
8
9
10
11
12
13public static void main(String[] args) {
String str1="hello";
String str2="hello";
System.out.println(str1==str2);//true 没有new 字符串相同时,编译器优化,共享空间。
String str3="hello";
String str4="world";
String str5="helloworld";
System.out.println((str3+str4)==str5);//false 编译器编译时,不确定 str3和str4的值,所以会使用新的内存,产生新的对象。
System.out.println(("hello"+"world")==str5);//true 常量运算,确定了值 编译时做优化会共享空间。
String str6="a"+"b"+"c";//创建了1个对象,因为编译时是常量确定了值,所以值创建一个对象
}
final String str7="hello";
final String str8="world"; System.out.println((str7+str8)==str5);//true 编译后没有final这个关键字,编译时会把带有 final关键字的变量作为常量直接把值带过去String类的构造方法
创建对象的时候使用new String(),重载的形式。
传递字节数组 String(byte[] bytes)
使用操作系统默认字符集。中文GB系列
1
2
3
4
5
6
7
8
9
10public static void main(String[] args) {
byte[] bytes={97,98,99,100};//查询ascii编码表 正数
String str=new String(bytes);
System.out.println(str);
byte[] bytes1={-26,-97,-91};//出现结果 负数汉字:查
//使用的编码表是UTF-8 3个字节为一个汉字 GBK汉字两个字节
// 默认编码表GBK 在idea中 main函数传参被修改成了UTF-8
String str1=new String(bytes1);
System.out.println(str1);
}传递字节数组 String(byte[] bytes,char[] charsetName)使用指定字符集
1
2
3
4
5String str1=new String(bytes1,"gbk");
System.out.println(str1);//鏌�
String str2=new String(bytes1,"utf8");
//StandardCharsets.UTF_8 也可以使用定义好的常量进行传递
System.out.println(str2);//查传递字节数组 String(byte[] bytes,int off,int len)
off数组开始索引
len数组中转的个数
1
2String str3=new String(bytes,1,1);
System.out.println(str3);//b传递字符数组 String(char[] ch)和编码表无关
1
2
3char []ch={'a','b','c','d','e'};
String s1=new String(s);
System.out.println(s);//abcde传递字节数组 String(char[] ch,int off,int len)
1
2
3char []ch={'a','b','c','d','e'};
String s2=new String(ch,1,3);
System.out.println(s2);
String类的判断方法(计算结果为布尔类型)
boolean equals(Object obj)比较字符串是否相等,完全相等返回true
String类继承Object,重写方法equals
1
2
3
4
5public static void method1(){
String s1="abc";
String s2=new String("abc");
System.out.println(s1.equals(s2));//true
}boolean equalsIgnoreCase(Object obj)比较字符串是否相等,忽略大小写,相等返回true
1
2
3
4
5public static void method1(){
String s1="Abc";
String s2=new String("abC");
System.out.println(s1.equalsIgnoreCase(s2));//true
}boolean isEmpty()判断字符串是否为空
1
2
3
4
5
6public static void method2(){
String str1="";
System.out.println(str1.isEmpty());//true
String str2=" ";
System.out.println(str2.isEmpty());//false
}boolean startWith()
1
2
3
4public static void method3(){
String str="helloWorld,java";
System.out.println(str.startsWith("hell"));//true
}
原文作者: 赖卓成
原文链接: https://lzcxfz.github.io/2021/05/13/day10常用类/
版权声明: 转载请注明出处(必须保留作者署名及链接)