Java常见对象(一)

222 阅读7分钟

B站刘意老师视频

API概述

  • 应用程序编程接口
    • JDK提供的提高编程效率的Object类

Object类

Object类概述

  • 类层次结构的根类,有类的结构都直接或间接继承自该类
  • Object类的构造方法只有一个无参的: public Object(),理解之前说的在面向对象中,子类的构造方法默认访问的是父类的无参构造方法

要掌握的方法

  • toString()
    • 返回对象的字符串表示,默认是由类的全路径+'@'+哈希值的十六进制表示
    • 这个表示其实是没有意义的,一般子类会重写该方法
    • 如何重写??
    • 最终还是建议自动生成
  • equals()
    • 比较两个对象是否相同,默认情况下,比较的是地址值是否相同。
    • 比较地址值没啥意义,所以一般子类会重写该方法
    • 如何重写??(初始版本,优化版本,自动生成)
    • 最终还是建议自动生成

要了解的方法

  • hashCode():返回对象的哈希值,不是实际的地址值,可以理解为地址值。
  • getClass():返回对象的字节码文件对象,反射中会详细看
  • finalize():用于垃圾回收,在不确定地方时间
  • clone():创建并返回此对象的一个副本,包括成员变量的数据复制,但是他和两个引用指向同一个对象是有区别的

两个注意问题

  • 直接输出一个对象名称,其实默认调用了该对象的toString()方法
  • 面试题:==和equals()的区别:
    • ==
      • 基本类型,比较两个值是否相同
      • 引用类型:比较的是地址值是否相同
    • equals()
      • 只能比较引用类型,默认情况下,比较的是地址值是否相同
      • 但是,可以根据需求重写该方法。

Scanner类

构造方法

  • System类下有一个静态的字段
    • public static final InputStream in;//标准的输入流,对应着键盘录入
    • InputStream is = System.in;
    • 键盘录入都是字符格式,然后用Scanner包装一下:Scanner(System.in),调用Scanner的转换函数
    • 转换函数例如: nextInt(),nextLine()
InputStream is = Sysytem.in
Scanner(InputStream is)
  • 常用格式
  • Scanner(InputStream is)

基本方法格式

  • hasNextXxx():判断是否是某种类型的
  • nextXxx():返回某种类型的元素
  • 配套使用
//创建对象
Scanner sc = new Scanner(System.in);
//获取数据
if (sc.hasNextInt()){
    int x = sc.nextInt();
}

常用的两种方法

public int nextInt() public String nextLine()

需要注意的问题

  • 同一个Scanner对象,先获取数值,再获取字符值,会出现问题,把回车当成字符接收
  • 解决方案:
    • 重新定义一个Scanner对象
    • 把所有的对象都用字符串获取,然后再根据需求进行相应的转换

String类

概述

  • 字符串:就是由多个字符组成的一串数据,也可以看成是一个字符数组。
  • 通过查看API,我们可以知道:
    • 字符串字面值“abc”也可以看成是一个字符串对象
    • 字符串是常量,一旦被赋值,就不能被改变。

构造方法

  • 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 length):把字符数组的一部分转成字符串
  • public String(String original):把字符串常量值转成字符串
  • 字符串方法:
    • public int length():返回此字符串的长度

字符串的特点

  • 字符串一旦被赋值,就不能被改变
    • 注意:这里指的是字符串的内容不能改变,不是引用不能改变
  • 字面值作为字符串对象和通过构造方法创建对象的不同
// output??
String s = "hello";
s += "world";
Sysytem.out.println("s:"+ s);
//helloworld以下图解

  • String s = new String("hello")和String s = "hello"的区别?
  • 前者创建2个对象,后者创建一个对象,如下图:

面试题—— 看程序写结果

/*
 * 字符串如果是变量相加, 先开空间,再拼接
 * 字符串如果是常量相加,先加,然后在方法区的常量池找,如果有,就直接返回,否则,就创建
*/
public class StringDemo {
      public static void main(String[] args) {

           String s1 = "hello";
           String s2 = "world";
           String s3 = "helloworld";
           System.out.println(s3 == s1+s2);  //false
           System.out.println(s3.equals(s1+s2));  //true
           System.out.println(s3 == "hello" + "world"); //true
           System.out.println(s3.equals("hello" + "world")); //true
      }
}
  • 七种方法得到字符串数组
public static void main(String[] args) {

           //空构造
           String s1 = new String();
           System.out.println("s1:"+s1);    
           System.out.println("s1.length():" + s1.length())
           System.out.println("--------------------------");           

           // public String(byte[] bytes):把字节数组转成字符串
           byte[] bys = {97,98,99,100,101};
           String s2 = new String(bys);
           System.out.println("s2:"+s2);    
           System.out.println("s2.length():" + s2.length())
           System.out.println("--------------------------");            

           // public String(byte[] bytes,<u>int</u> index,<u>int</u> length):把字节数组的一部分转成字符串
           String s3 = new String(bys,1,3);
           System.out.println("s3:"+s3);    
           System.out.println("s3.length():" + s3.length())
           System.out.println("--------------------------");           

           // public String(char[] value):把字符数组转成字符串
           char[] chs = {'a','b','c','d','e'};
           String s4 = new String(chs);
           System.out.println("s4:"+s4);    
           System.out.println("s4.length():" + s4.length())
           System.out.println("--------------------------");            

           // public String(char[] value,<u>int</u> index,<u>int</u> length):把字符数组的一部分转成字符串
           String s5 = new String(chs,1,3);
           System.out.println("s5:"+s5);    
           System.out.println("s5.length():" + s5.length())
           System.out.println("--------------------------"); 
        
           // public String(String original):把字符串常量值转成字符串
           String s6 = new String("abcde");
           System.out.println("s6:"+s6);    
           System.out.println("s6.length():" + s6.length())
           System.out.println("--------------------------"); 
           
           //上面的一种方法意义不大,字符串常量值也可以看成是对象
           String s7 = "abcde";
           System.out.println("s7:"+s7);    
           System.out.println("s7.length():" + s7.length());
      }

Sring类的判断功能

  • boolean equals(Object obj)
  • boolean equalsIgnoreCase(String str)
  • boolean contains(String str)
  • boolean startsWith(String str)
  • boolean endWith(String str)
  • boolean isEmpty()

Sring类的获取功能

  • int length()
  • char charAt(int index):获取指定索引位置的字符
  • int indexOf(int ch):返回指定字符在此字符串中第一次出现的索引
    • 为什么是int类型?用的ASCII码
  • int indexOf(String str):
  • int indexOf(int ch,int fromIndex):
  • int indexOf(String str,int fromIndex):
  • String substring(int start):截取字符串
  • String substring(int start,int end):左闭右开

String类的转换功能

  • byte[] getBytes():把字符串转换为字节数组
  • char[] toCharArry()
  • static String valueOf(char[] chs):把字符数组转换为字符串
  • static String valueOf(int i):
    • String类的valueOf方法可以把任意类型的数据转换成字符串
  • String toLowerCase()
  • String toUpperCase()
  • String concat(String str):字符串拼接

String类的其他功能

  • 替换功能
    • String replace(char old,char new)
    • String replace(String old,String new)
  • 去除字符串两端空格
    • String trim()
  • 按字典顺序比较两个字符串
    • int compareTo(String str)
      • 比较到不同的地方,两个字符的ASCII码做减法返回
      • 如果是'hello'和‘hel'这种,返回长度差
    • int compareToIgnoreCase(String str)

StringBuffer

概述

  • 线程安全
    • 安全--同步--效率低
    • 不安全--不同步--效率高一些
  • StringBuffer是线程安全的可变字符串

构造方法

  • StringBuffer():无参构造
  • StringBuffer(int size):指定容量的字符串缓冲区对象
  • StringBuffer(String str):指定字符串内容的字符串缓冲区对象

常用方法

  • public int capacity();//返回当前容量,理论值
  • public int length();//返回长度(字符数),实际值

常见功能

  • 添加:
    • public StringBuffer append(String str);
    • public StringBuffer insert(int offset,String str)
  • 删除:
    • public StringBuffer deleteCharAt(int index)
    • public StringBuffer delete(int strart,int end)
  • 替换:
    • public StringBuffer replace(int start,int end,String str)
  • 反转:
    • public StringBuffer reverse()
  • 截取:
    • public String subString(int start)
    • public String subString(int start,int end)
    • 注意:返回值是String类型,本身未发生改变

练习

  • String 和StringBuffer的相互转换
//String ---- StringBuffer
           String s = "hello";
           //注意 StirngBuffer不能直接赋值
           //StringBuffer <u>sb</u> = "hello";
           //StringBuffer <u>sb</u> = s;           

           //方式1:通过构造方法
           StringBuffer <u>sb</u> = new StringBuffer(s);
           //方式2:通过append方法
           StringBuffer sb2 = new StringBuffer();
           sb2.append(s);

// StringBuffer ---- String
           StringBuffer sb3 = new StringBuffer("java");
           //方式1:通过构造方法
           String <u>s1</u> = new String(sb3);
           //方式2:通过toString()方法
           String <u>s2</u> = sb3.toString();
  • 字符串的拼接
    • String:遍历数组,一个一个+ s+=arr[x]
    • StringBuffer:遍历数组,用append方法,sb.append(arr[x]);
  • 把字符串反转
    • String:先转成字符串数组,倒着遍历
      • char[] chs = s.toCharArray();
    • StringBuffer:先转成StringBuffer,reverse().toString()
      • return new StringBuffer(s).reverse().toString();
  • 判断一个字符串是否对称
// 判断一个字符串是否对称
      public static void main(String[] args) {
           String s = "hello";
           System.out.println(isEqual(s));
           System.out.println(isEqual2(s));
      }
      // 方法1
      public static boolean isEqual(String s) {
           return new StringBuffer(s).reverse().toString().equals(s);
      }

      //方法2
      public static boolean isEqual2(String s) {
           char[] chs = s.toCharArray();
           for(int start = 0, end = s.length()-1;start<=end;start++,end--) {
                 if(chs[start] != chs[end]) {
                      return false;
                 }
           }
           return true;
      }

面试题

  • String 和 StringBuffer 和StringBuilder的区别
    • String是内容不可变的,而StringBuffer,StingBuilder都是内容可变的
    • StringBuffer是同步的,数据安全但是效率低;StingBuilder不同步,数据不安全但效率高。
  • StringBuffer 和数组的区别
    • 两者都可以看作是一个容器,里面放数据。
    • 前者只能放字符数据,后者可以放多种类型数据,但每个数组内数据类型必须相同。

注意的问题

  • String作为形式参数,StringBuffer作为形式参数
    • String作为参数传递,效果和基本类型作为参数传递是一样的。
    • 字符串是个常量值,属于特殊的引用类型,当作基本类型来看。
    • StringBuffer 形参直接赋值(=),不改变;调用方法时,改变实参的值。(P363)