java -- Object类和String类

打印 上一主题 下一主题

主题 993|帖子 993|积分 2979

Object类

java.lang.Object类是Java语言中的根类,每个类都使用 Object 作为超类, 所有的类都直接或间接继承自 Object 类。所有对象(包括数组)都实现这个类的方法。
native 本地方法

在Object类的源码中定义了native修饰的方法,native修饰的方法称为本地方法。
特点


  • 被native修饰的方法,非Java语言编写,是由C++语言编写。
  • 本地方法在运行时期进入本地方法栈内存,本地方法栈是一块独立内存的区域。
  • 本地方法的意义是和操作系统进行交互。
  1. private static native void registerNatives();
  2. static {
  3.     registerNatives();
  4. }
复制代码
当程序运行的时候,Object类会最先被加载到内存中。类进入内存后首先加载自己的静态成员,static代码块中调用了本地方法registerNatives(),和操作系统进行交互。
toString方法

方法声明:public String toString():返回该对象的字符串表示。
Object类toString()方法源码:
  1. public String toString() {
  2.         return getClass().getName() + "@" + Integer.toHexString(hashCode());
  3. }
复制代码
源码分析:

  • getClass().getName()返回类的全限定名字。
  • hashCode()方法返回int值,可以暂时理解为对象的内存地址。
  • Integer.toHexString()将int类型的值转成十六进制。
  • 因此调用对象的toString()方法将看到内存的地址值。
创建Person类,并调用方法toString()
  1. public static void main(String[] args){
  2.     Person person = new Person();
  3.     String str = person.toString();
  4.     System.out.println(str);
  5.     System.out.println(person);
  6. }
复制代码
通过程序运行,得到结论,在输出语句中打印对象,就是在调用对象的toString()方法
重写toString方法

由于toString方法返回的结果是内存地址,而在开发中,内存地址并没有实际的应用价值,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。
  1. public class Person {  
  2.     private String name;
  3.     private int age;
  4.     @Override
  5.     public String toString() {
  6.         return "Person"+name+":"+age;
  7.     }
  8.     // 省略构造器与Getter Setter
  9. }
复制代码
equals方法

方法声明:public boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。
Object类equals()方法源码:
  1. public boolean equals(Object obj) {
  2.     return (this == obj);
  3. }
复制代码
源码分析:

  • this是当前对象,哪个对象调用的equals方法就表示哪个对象。
  • obj表述传递的参数,参数类型Object,可以传递任意类型对象。
  • this==obj 比较两个对象的内存地址是否相同
equals方法默认比较两个对象的内存地址是否相同,相同则返回true。
重写equals方法

实际应用中,比较内存地址是否相同并没有意义,我们可以定义对象自己的比较方式,比较对象中成员变量的值是否相同。需要对方法进行重写。
需求:重写equals()方法,比较两个对象中姓名和年龄是否相同,如果姓名和年龄都相同返回true,否则返回false。
  1. public class Person {
  2.     private String name;
  3.     private int age;
  4.    
  5.     public boolean equals(Object obj){
  6.         //判断两个对象地址弱相同,即为同一个对象
  7.         if(this == obj)
  8.             return true;
  9.         //obj对象为空,无需比较,返回false
  10.         if(obj == null)
  11.             return  false;
  12.         //obj如果是Person类型对象,则强制转换
  13.         if(obj instanceof Person){
  14.             Person person = (Person)obj;
  15.             //比较两个对象的name属性和age属性,如果相等,返回true
  16.             return this.name.equals(person.name) && this.age == person.age;
  17.         }
  18.         return false;
  19.     }
  20. }
复制代码
hashCode方法

方法声明 public native int hashCode();
返回一个哈希值
哈希值: 可以理解为一个唯一值 或 逻辑地址
调用hashCode, 比较两对象的哈希, 相当于比较两个对象的地址值
重写hashCode, 比较两对象的内容
若想确定内容是否真的相同 先比较两对象的hashCode(因为比较数字较容易)

  • 不同 说明两对象内容一定不同
  • 相同 不能说明两对象一定相同 需要继续比较 equals, 比较其内容
重写hashCode方法
  1. public int hashCode() {
  2.         // 成员变量是引用类型, 直接调用hashCode方法得到一个int值
  3.         // 成员变量是基本类型, 直接使用对应的值
  4.         int result = name != null ? name.hashCode() : 0;
  5.         result = 31 * result + age;
  6.         return result;
  7. }
复制代码
String类

java.lang.String 类代表字符串。Java程序中所有的字符串文字(例如"abc" )都可以被看作是实现此类的实例。
特点

1.字符串不变:字符串的值在创建后不能被更改。
  1. String s1 = "abc";
  2. s1 += "d";
  3. System.out.println(s1); // "abcd"
  4. // 内存中有"abc","abcd"两个对象,s1从指向"abc",改变指向,指向了"abcd"。
复制代码
2.因为String对象是不可变的,所以它们可以被共享。
  1. String s1 = "abc";
  2. String s2 = "abc";
  3. // 内存中只有一个"abc"对象被创建,同时被s1和s2共享。
复制代码
3."abc" 等效于 char[] data={ 'a' , 'b' , 'c' },但是底层原理是字节数组( byte[] )
  1. 例如:
  2. String str = "abc";
  3. 相当于:
  4. char data[] = {'a', 'b', 'c'};     
  5. String str = new String(data);
  6. // String底层是靠字符数组实现的。
复制代码
构造方法


  • public String()  :初始化新创建的 String对象,以使其表示空字符序列。
  • public String(char[] value)  :通过当前参数中的字符数组来构造新的String。
  • public String(byte[] bytes)  :通过使用平台的默认字符集解码当前参数中的字节数组来构造新的String。
  • 直接赋值的方式创建字符串对象
构造举例,代码如下:
  1. public class StringDemo01 {
  2.     public static void main(String[] args) {
  3.         //public String():创建一个空白字符串对象,不含有任何内容
  4.         String s1 = new String();
  5.         System.out.println("s1:" + s1);
  6.         //public String(char[] chs):根据字符数组的内容,来创建字符串对象
  7.         char[] chs = {'a', 'b', 'c'};
  8.         String s2 = new String(chs);
  9.         System.out.println("s2:" + s2);
  10.         //public String(byte[] bys):根据字节数组的内容,来创建字符串对象
  11.         byte[] bys = {97, 98, 99};
  12.         String s3 = new String(bys);
  13.         System.out.println("s3:" + s3);
  14.         //String s = “abc”;        直接赋值的方式创建字符串对象,内容就是abc
  15.         String s4 = "abc";
  16.         System.out.println("s4:" + s4);
  17.     }
  18. }
复制代码
常用方法

获取字符串的长度

public int length () : 返回此字符串的长度
字符串拼接

public String concat (String str) :将指定的字符串连接到该字符串的末尾。
  1. String s12 = "abc".concat("bcd");
  2. System.out.println("concat拼接后: " + s12);
复制代码
字符串 转换为 字符数组

public char[] toCharArray()
  1. char[] strToChar =  s4.toCharArray();
  2. for (int i = 0; i < strToChar.length; i++) {
  3.         System.out.print(strToChar[i] + " ");
  4. }
  5. System.out.println();
复制代码
字符串 转换为 字节数组

public byte[] getBytes()
  1. byte[] strToByte = s2.getBytes();
  2. for (int i = 0; i < strToByte.length; i++) {
  3.         System.out.print(strToByte[i] + " ");
  4. }
复制代码
获取指定索引位置的元素

public char charAt (int index) :返回指定索引处的 char值。
  1. // 根据索引找字符, 若索引不存在, 抛出StringIndexOutOfBoundsException(字符串索引越界异常)
  2. String s = "I Love Java";
  3. char c = s.charAt(0);
  4. System.out.println(c);
  5. for (int i = 0; i < s.length(); i++) {
  6.         System.out.print(s.charAt(i));
  7. }
  8. System.out.println();
复制代码
获取指定字符索引

public int indexOf (String str)  :返回指定子字符串第一次出现在该字符串内的索引。
int indexOf(String str, int fromIndex): 从指定索引位置开始查找
lastIndexOf(String str): 查找字符(串)最后一次出现的位置的索引
参数可以是char, int 或 String 类型
  1. int index = s.indexOf('a');
  2. System.out.println("字符a第一次出现的索引位置: " + index);
  3. System.out.println("97对应的字符第一次出现的位置: " + s.indexOf(97) );
  4. // 字符a第二次出现的索引位置
  5. System.out.println("字符a第二次出现的索引位置: " + s.indexOf('a', index + 1) );
  6. s1 = "abcaaaabcaab";
  7. int abIndex = s1.indexOf("ab");
  8. System.out.println("字符串ab第一次出现的索引位置: " + abIndex);
  9. int abIndex2 = s1.indexOf("ab", abIndex + 1);
  10. // int abIndex2 = s1.indexOf("ab", abIndex + "ab".length());
  11. System.out.println("字符串ab第二次出现的索引位置: " + abIndex2);
  12. System.out.println("字符串ab第三次出现的索引位置: " + s1.indexOf("ab", abIndex2 + 1));
  13. String path = "d:\\work\\abc\\1.txt";
  14. // 查询字符'\'最后一次出现的位置
  15. System.out.println(path.lastIndexOf('\\'));
复制代码
字符串截取

substring(int startIndex): 从开始索引截取到末尾
substring(int startIndex, int endIndex): 截取字符串中 [start, end)的字符串
因为字符串不可改变, 所以返回一个新的字符串
  1. // 截取Love
  2. String subLove = s.substring(2, 6);
  3. System.out.println(subLove);
  4. // 截取文件名
  5. int lastIndex = path.lastIndexOf('\\');
  6. String fileName = path.substring(lastIndex + 1);
  7. System.out.println(fileName);
复制代码
去除字符串两端空格

public String trim()
  1. String s13 = "             ab       c      ";
  2. System.out.println("原字符串: " + s13);
  3. System.out.println("去除两端空格: " + s13.trim());
复制代码
字符串替换

public String replace (CharSequence target, CharSequence replacement) : 将与target匹配的字符串使用replacement字符串替换
public String replaceAll(String regex, String replacement): 将与regex(正则)匹配的字符串使用replacement字符串替换
区别: replaceAll支持正则表达式, 而replace不支持
  1. String s14 = "张三-李四-王五-赵六";
  2. String s15 = s14.replace("-", " ");
  3. System.out.println("replace替换: " + s15);
  4. s14 = "张三--------李四---王五--赵六";
  5. String s16 = s14.replaceAll("-+", " ");
  6. System.out.println("replaceAll替换: " + s16);
复制代码
切割字符串

public String[] split(String regex) :将此字符串按照给定的regex(正则)拆分为字符串数组
  1. String[] strArr = s14.split("-+");
  2. for (String s : strArr) {
  3.         System.out.print(s + " ");
  4. }
  5. System.out.println();
  6. // 以'.'分割ip地址
  7. String myIp = "192.168.1.1";
  8. // '.'在正则中表示匹配任意字符, '\'为转义符, java要拿到'\', 需要对'\'转义, 即'\\'
  9. strArr = myIp.split("\\.");
  10. for (String s: strArr) {
  11.         System.out.print(s + " ");
  12. }
  13. System.out.println();
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

络腮胡菲菲

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表