转眼间我们已经工作完一周了, 这周开始阿 Q 要不定时更新知识了, 先让我们来学习一下 java 中的 Object 与 string 类吧.
Object 类
API:Application Programming Interface 应用程序编程接口, Java API 就是 Java 提供给我们使用的类, 这些类将底层的实现封装了起来, 我们不需要关心这些类是如何实现的, 只需要学习这些类如何使用.
Object: 所有类都直接或者间接的继承自 Object 类, 是类层次结构的根类.
public int hashCode()
返回该对象的哈希码值. 默认情况下, 该方法会根据对象的地址来计算.
不同对象的, hashCode() 一般来说不会相同. 但是, 同一个对象的 hashCode() 值肯定相同.
代码:
- public static void main(String[] args) {
- Object object = new Object();
- int hashCode = object.hashCode();
- System.out.println(hashCode); //26171428
- Student s1 = new Student("张三", 23);
- Student s2 = new Student("李四", 24);
- Student s3 = s1;
- System.out.println(s1.hashCode()); //6330655
- System.out.println(s2.hashCode()); //31782850
- System.out.println(s3.hashCode()); //6330655 与 s1 的 hashCode 值相同
- }
public final Class getClass(): 此方法被 final 修饰表示不能被重写. 此方法返回此 Object 的运行时类对象, 也就是 Class 类的一个对象, 此对象用来描述类的 class 文件.
- public static void main(String[] args) {
- Student s = new Student("张三", 23);// 创建 Student 对象 s
- //s 对象调用 getClass() 返回一个描述 Student 类的 class 文件的对象, 也就是 Class 类的对象
- Class clazz = s.getClass();
- //clazz 对象调用 Class 类的 getName() 返回一个 String 类型, 类的全路径名
- String name = clazz.getName();
- System.out.println(name);
- Student s1 = new Student(); // 新创建了一个 s1 对象
- //s1 对象调用 getClass() 返回一个描述 Student 类的 class 文件的对象, 也就是 Class 类的对象
- Class clazz1 = s1.getClass();
- // 因为 clazz 和 clazz1 都是描述 Student 类的 class 文件的对象 所以他俩是同一个对象
- System.out.println(clazz == clazz1);
- }
Object 的 toString()
我们在打印一个对象的时候, 默认调用的是对象的 toString 方法, 如果该对象没有重写 toString(), 那么调用的是 Object 的 toString() 方法, 因为继承了 Object 嘛;
Object 的 toString 方法返回类的全路径名称 + @ + 16 进制哈希值, 这样返回一般没有意义;
Object 类中 toString() 的源码
- public Stirng toString() {
- return getClass().getName() + "@" + Integer.toHexString(hashCode())
- }
我们一般在编写类的时候都重写 Object 的 toString(), 一般要求是把类里面的属性都显示出来;
代码:
- public class Student {
- String name;
- int age;
- public Student(String name, int age){
- this.name = name;
- this.age = age;
- }
- @Override
- public String toString() {
- return "Student [name=" + name + ", age=" + age + "]";
- }
- }
- public static void main(String[] args) {
- Student s = new Student("张三", 23);
- System.out.println(s); // 这句话就相当于 System.out.println(s.toString());
- }
Object 的 equals()
Object 中 equals 方法的源码
- public boolean equals(Object obj){
- return (this == obj);
- }
比较的引用类型的地址值, 开发中我们调用 equals 方法是想比较对象里面的属性值, 所以在编写类的时候一般重写 Object 中的 equals 方法, 让其比较对象的属性值.
代码:
- public class Student {
- String name;
- int age;
- public Student(String name, int age){
- this.name = name;
- this.age = age;
- }
- // 重写 equals 方法
- // 参数必须是 Object, 因为重写 Object 的方法, 方法体必须和 Object 的 equals 方法一模一样
- @Override
- public boolean equals(Object obj) {
- Student s = (Student)obj;// 因为 obj 不能调用 Student 特有的内容, 所以向下转型
- return this.name.equals(s.name) &&this.age == s.age; //this.name.equals(s.name) 这儿的 equals 方法是 String 类重写 Object 后的 equals 方法
- }
- }
- public static void main(String[] args) {
- Student s1 = new Student("张三", 23);
- Student s2 = new Student("张三", 23);
- boolean b = s1.equals(s2); // 比较 2 个对象属性是否相同
- System.out.println(s1 == s2); //false 比较的是两个对象的地址值是否相同
- System.out.println(b); //true
- }
== 号和 equals 方法的区别
== 是一个比较运算符号, 既可以比较基本数据类型, 也可以比较引用数据类型, 基本数据类型比较的是值, 引用数据类型比较的是地址值;
equals 方法是一个方法, 只能比较引用数据类型, 所有的对象都会继承 Object 类中的方法, 如果没有重写 Object 类中的 equals 方法, equals 方法和 == 号比较引用数据类型无区别, 重写后的 equals 方法比较的是对象中的属性.
Scanner
hasNextInt(): 判断是否还有下一个输入项, 其中 Xxx 可以是 Int,Double 等. 如果需要判断是否包含下一个字符串, 则可以省略 Xxx
nextInt(): 获取下一个输入项. Xxx 的含义和上个方法中的 Xxx 相同, 默认情况下, Scanner 使用空格, 回车等作为分隔符.
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in); // 创建键盘录入对象
- if(sc.hasNextInt()) { // 判断键盘录入的是否是 int 类型的数据
- int i = sc.nextInt(); // 键盘录入的数据存储在 i 中
- System.out.println(i);
- }else {
- System.out.println("输入的类型错误");
- }
- }
bug 问题: 先用 nextInt() 接收 int 类型, 再用 nextLine() 接收字符串的时候, 会导致 nextLine() 直接把回车接收到了, nextLine 不能继续接收字符串了.
先获取一个数值后, 再创建一个新的键盘录入对象获取字符串.
把所有的数据都先按照字符串获取, 然后要什么, 你就对应的转换为什么.
String 类
构造方法
String s = "abc"; s 就是 String 的一个对象
public String(): 空构造
public String(byte[] bytes): 把字节数组转成字符串
public String(byte[] bytes,int index,int length): 把字节数组的一部分转成字符串
public String(char[] value): 把字符数组转成字符串
public String(char[] value,int index,int count): 把字符数组的一部分转成字符串
public String(String original): 把字符串常量值转成字符串
代码:
- public static void main(String[] args) {
- String s = "abc";
- System.out.println(s1); // 打印出: abc
- String s1 = new String();
- System.out.println(s1); //s1 是个空串
- byte[] arr1 = {97,98,99};
- String s2 = new String(arr1); // 解码, 将计算机读的懂的转换成我们读的懂
- System.out.println(s2); // 打印出: abc
- byte[] arr2 = {97,98,99,100,101,102};
- String s3 = new String(arr2,2,3); // 将 arr2 字节数组从 2 索引开始转换 3 个
- System.out.println(s3); // 打印出: cde
- char[] arr3 = {'a','b','c','d','e'}; // 将字符数组转换成字符串
- String s4 = new String(arr3);
- System.out.println(s4); // 打印出: abdcde
- String s5 = new String(arr3,1,3); // 将 arr3 字符数组, 从 1 索引开始转换 3 个
- System.out.println(s5); // 打印出: bcd
- String s6 = new String("heima");
- System.out.println(s6); // 打印出 :heima
- }
String 的判断功能
boolean equals(Object obj): 比较字符串的内容是否相同, 区分大小写
boolean equalsIgnoreCase(String str): 比较字符串的内容是否相同, 忽略大小写
boolean contains(String str): 判断大字符串中是否包含小字符串
boolean startsWith(String str): 判断字符串是否以某个指定的字符串开头
boolean endsWith(String str): 判断字符串是否以某个指定的字符串结尾
boolean isEmpty(): 判断字符串是否为空
String 的获取功能
int length(): 获取字符串的长度.
char charAt(int index): 获取指定索引位置的字符
int indexOf(int ch): 返回指定字符在此字符串中第一次出现处的索引.
int indexOf(String str): 返回指定字符串在此字符串中第一次出现处的索引.
int indexOf(int ch,int fromIndex): 返回指定字符在此字符串中从指定位置后第一次出现处的索引.
int indexOf(String str,int fromIndex): 返回指定字符串在此字符串中从指定位置后第一次出现处的索引.
int lastIndexOf(int ch): 从最后往前数返回指定字符在此字符串中第一次出现处的索引.
int lastIndexOf(String str): 从最后往前数返返回指定字符串在此字符串中第一次出现处的索引.
int lastIndexOf(int ch,int fromIndex): 返回指定字符在此字符串中从指定位置往前数第一次出现处的索引.
int lastIndexOf(String str,int fromIndex): 返回指定字符串在此字符串中从指定位置往前数第一次出现处的索引.
String substring(int start): 从指定位置开始截取字符串, 默认到末尾.
String substring(int start,int end): 从指定位置开始到指定位置结束截取字符串.
String 的转换功能
byte[] getBytes(): 把字符串转换为字节数组.
char[] toCharArray(): 把字符串转换为字符数组.
static String valueOf(char[] chs): 把字符数组转成字符串.
static String valueOf(int i): 把 int 类型的数据转成字符串.
注意: String 类的 valueOf 方法可以把任意类型的数据转成字符串.
String toLowerCase(): 把字符串转成小写.
String toUpperCase(): 把字符串转成大写.
String concat(String str): 把字符串拼接.
String 的其他功能
String replace(char old,char new): 把一个字符串中的所有 old 字符用 new 字符替换
String replace(String old,String new): 把一个字符串中的所有 old 小串用 new 新串替换
String trim(): 去掉两端的空格
int compareTo(String str): 按照字典顺序比较字符串 (暂时不用掌握)
int compareToIgnoreCase(String str): 不区分大小写的按照字典顺序比较字符串 (了解)
String 和字符数组的转换
- String --> char[]==>toCharArray();
- char[] --> String
- ==> new String(char[] chs);
- ==> static String valueOf(char[] chs);
String 和字节数组的转换
- String --> byte[]==>getBytes();
- byte[] -->String==>new String(byte[] bys);
来源: http://www.jianshu.com/p/183856be55cc