常用类
Java中有一些常用的类,主要有这些:红色和蓝色字体的多掌握一下,这里主要带着帮助文档列举几个(Object类、String类)。
Object类
- Object类的成员方法
Object:是类Object结构的根,每个class都有Object作为超类
所有对象(包括数组)都实现了这个类的方法
每个类都直接或间接的继承自Object类
Object类中的方法:hashCode()
public int hashCode()返回对象的哈希值。 支持这种方法是为了散列表,如HashMap提供的那样
注意: 哈希值就是根据哈希算法计算出来的一个值,这个值跟地址有关系,但是不是实际的地址值。你可以简单的理解为就一种地址。
Object类中的方法:toString(),介绍在代码中为什么要重写toString方法
public String toString() 返回对象的字符串表达形式,一般来说,toString方法返回一个对象的字符串
Integer类中提供了一个静态的方法:public static String toHexString(int i)返回整数参数的字符串表示形式,作为16位中的无符号整数
Object中的方法:equals(这个方法,要重写)
public boolean equals(Object obj) 指示一些其他的对象是否等于此,这个方法,默认情况下,比较的是地址值,但是呢,比较地址值是没有意义的,更多情况下,我们比较对象中成员变量的值是否一样,所以想到的是重写方法
==:
基本类型:比较的是值是否相同
引用类型:比较的是地址值是否相同
equals:
引用类型:默认情况下,比较的是地址值。不过,根据情况重写,可以自己重写,也可以自动生成
Object中的方法:finalize()、clone()
protected void finalize()
throws Throwable当垃圾回收器确定不再有对该对象的引用时,垃圾回收器在对象上调用该对象。一个子类覆盖了处理系统资源或执行其他清理的finalize方法。简单来说,它就是用于垃圾回收的,但是呢,什么时候回收不确定
protected Object clone()
throws CloneNotSupportedException创建并返回此对象的副本。返回的是这个实例的一个克隆。
public interface Cloneable一个类实现Cloneable接口,以指示Object.clone()方法,该方法对于该类的实例进行现场赋值是合法的,也就是必须要实现Cloneable接口才能使用clone方法
String类
String类概述
字符串是由多个字符组成的一串数据(字符序列)
字符串可以看成是字符数组
通过查看API,发现
String类代表字符串
Java程序中所有字符串文字(例如“abc”)都可以实现为此类的实例
字符串字面值“abc”也可以看成一个字符串对象
字符串是常量,一旦被赋值,就不能被改变
构造方法:
public class StringDemo1 {
public static void main(String[] args) {
String s = new String();
System.out.println("s:"+s);
System.out.println("s的长度"+s.length());
System.out.println("******************");
//public String(byte[] bytes) 将字节数组转化成字符串
byte[] b = new byte[]{11,22,33,44,55,66,77,88,99};
String s1 = new String(b);
System.out.println("s1:"+s1);
System.out.println(s1.length());
System.out.println("******************");
//public String(byte[] bytes,int offset,int length)
//将字节数组的一部分截取成字符串
String s2 = new String(b,1,4);
System.out.println("s2:"+s2);
System.out.println(s2.length());
System.out.println("******************");
//public String(char[] value) 将字符数组转化成字符串
char[] c = new char[]{'a','b','c','d','e','f','g'};
String s3 = new String(c);
System.out.println("s3:"+s3);
System.out.println(s3.length());
System.out.println("******************");
//public String(char[] value,int offset,int count)
//将字符数组的一部分转化成字符串
String s4 = new String(c,1,4);
System.out.println("s4:"+s4);
System.out.println(s4.length());
System.out.println("******************");
//public String(String original)
//将字符串常量转化成字符串对象
String abcde = new String("abcde");
System.out.println(abcde);
System.out.println(abcde.length());
String s6 = "asdfghj";
String s7 = new String(s6);
System.out.println("s7:"+s7);
System.out.println(s7.length());
}
}
- 字符串的特点:一旦被赋值,就不能被改变
面试题:
但我们发现下面这个例子,s从Hello,变为了HelloWorld
但实际上,我们可以发现,当我们创建“Hello”的时候,是在方法区里面的字符串常量池创建了一个空间,“World”也开辟了一个空间,“HelloWorld”也是一个新的空间,s是从“Hello”的地址,变成了“HelloWorld”的地址,但本身的字符串是不发生改变的。
- String s = new String(“hello”) 和 String s = "hello"的区别
- == 比较的是引用类型的地址值
- equals默认比较的是地址值,但是String重写了equals方法,所以比较的是内容
- 前者会创建两个对象,后者创建一个对象
图解:
首先是在栈里面创建了一个s1对象,然后在堆里面开辟了一个空间,赋值了hello,存进了方法区的字符串常量池,s1指向的是堆内存里面的位置;接着在栈里面开辟了s2空间,指向的是方法区中字符串常量池的位置。
- 看程序写结果
- 字符串如果是变量相加,是先开辟空间,再拼接
- 字符串如果是常量相加,是先加,再去常量池中查找,如果找到就返回,否则就创建
以上为一些基本的判断功能,下面是相关代码展示:
public static void main(String[] args) {
//创建字符串对象
String s1 = "helloworld";
String s2 = "Helloworld";
String s3 = "HelloWorld";
//boolean equals(Object obj) 比较字符串的内容是否相同,区分大小写
System.out.println(s1.equals(s2)); //false
System.out.println(s1.equals(s3)); //false
System.out.println("**********************");
//boolean equalsIgnoreCase(String str)
// 比较字符串的内容是否相同,忽略大小写
System.out.println(s1.equalsIgnoreCase(s2)); //true
System.out.println(s1.equalsIgnoreCase(s3)); //true
System.out.println("**********************");
//boolean contains(String str)
//判断大的字符串中是否包含小的字符串
System.out.println(s1.contains("Hello"));
System.out.println(s1.contains("lowo"));
System.out.println("**********************");
//boolean startsWith(String str) 测试此字符串是否以指定的前缀开头。
System.out.println(s1.startsWith("h")); //true
System.out.println(s1.startsWith("he")); //true
System.out.println(s1.startsWith("world")); //false
System.out.println("**********************");
//boolean endsWith(String str)测试此字符串是否以指定的后缀结尾。
System.out.println(s1.endsWith("world")); //true
System.out.println(s1.endsWith("hello")); //false
System.out.println("**********************");
//boolean isEmpty() 判断字符串是不是空
System.out.println(s1.isEmpty());
System.out.println("**********************");
String s4 = "";
String s5 = null;
System.out.println(s4.isEmpty()); //true
//因为s5的对象都没有,所以不能够调用方法,空指针异常
// System.out.println(s5.isEmpty()); //NullPointerException
System.out.println("asd".equals(s1));
// System.out.println(s5.equals("asd"));
//比较字符串的内容,推荐这种
System.out.println("asd".equals(s5));
}
}
获取功能
int length():获取字符串的长度
public static void main(String[] args) {
String s = "helloworld";
// int length():获取字符串的长度
System.out.println(s.length());
System.out.println("*******************");
//char charAt(int index)
//返回char指定索引处的值。 指数范围为0至length() - 1
System.out.println(s.charAt(7));
System.out.println("*******************");
//int indexOf(int ch)
//返回指定字符第一次出现的字符串内的索引。
System.out.println(s.indexOf('l')); //2
System.out.println("*******************");
//int indexOf(String str)
//返回指定子字符串第一次出现的字符串内的索引。
System.out.println(s.indexOf("ello")); //1
System.out.println("*******************");
//int indexOf(int ch,int fromIndex)
//返回指定字符第一次出现的字符串内的索引,以指定的索引开始搜索。
System.out.println(s.indexOf('l',4)); //8
System.out.println(s.indexOf('p',4)); //-1
System.out.println(s.indexOf('l',40)); //-1
//int indexOf(String str,int fromIndex)
//返回指定子串的第一次出现的字符串中的索引,从指定的索引开始
System.out.println("*******************");
//String substring(int start)
//返回一个字符串,该字符串是此字符串的子字符串。
// 子字符串以指定索引处的字符开头,并扩展到该字符串的末尾
//截串
//最大可以传的数值到length的值
System.out.println(s.substring(3)); //loworld
//System.out.println(s.substring(11));//StringIndexOutOfBoundsException
System.out.println("*******************");
//String substring(int start,int end)
//返回一个字符串,该字符串是此字符串的子字符串。
// 子串开始于指定beginIndex并延伸到字符索引endIndex - 1 。
// 因此,子串的长度为endIndex-beginIndex 。
//左闭右开
System.out.println(s.substring(1,3)); //el
System.out.println(s.substring(4,8)); //owor
}
感谢观看,我是酷酷的涛。