“Object类”“String类”“异常处理机制”出来接客了---进来看就完事了

背景:

首先感谢牛客职导老师的思维导图
顺着思维导图总结学习
牛客的视频都免费了,不辍

https://www.nowcoder.com/courses/cover/live/689

班门弄斧,如有问题欢迎指正,鄙人必虚心学习


学习内容:

Day1

Object类

1.Object类中包含的主要方法

  1. package java.lang;Object这个类在lang包下,所以不需要主动导入
  2. 源码中给出这句话—Class {@code Object} is the root of the class hierarchy.即Object类是Java中类层次结构的根
  3. public final native Class<?> getClass();这个本地方法是Object类提供用来得到该对象的运行时类
  4. 题外话: 例如这个方法用于了反射,你先有被反射类的实例化对象–再调用Object提供的方法–对象.getClass()–反射得到这个类,Reflect re = new Reflect();Class<? extends Reflect> class1 = re.getClass();
  5. boolean equals(Object obj):判断指定对象与该对象是否相等。(不重写的情况下,就是通过==进行比较【比较地址】)
  6. int hashCode():返回该对象的hashCode值。在默认情况下,Object类的hashCode()方法根据该对象的地址来计算。但很多类都重写了Object类的hashCode()方法,不再根据地址来计算其hashCode()方法值。
  7. String toString():返回该对象的字符串表示,当程序使用System.out.println()方法输出一个对象,或者把某个对象和字符串进行连接运算时,系统都会自动调用该对象的toString()方法返回该对象的字符串表示
  8. 关于线程的wait()/notify()/notifyAll()这里不赘述,在专栏以后的关于现成的文章中会再系数
  9. 最后一个clone()方法,该方法用于帮助其他对象来实现“自我克隆”,这就涉及到了深浅拷贝

https://blog.csdn.net/one_Jachen/article/details/78246047

  1. finalize()方法,当系统中没有引用变量引用到该对象时,垃圾回收器调用此方法来清理该对象的资源。并且,针对某一个对象,垃圾回收器最多只会调用它的finalize()方法一次,调用了也不会立即回收,不确定何时回收。

2.hashCode()和equals()的关系
上文也很简单提到了二者关系
上面两个方法具有一定的联系 “如果两个对象相等(equals()),那么它们的哈希值一定相同。如果两个对象的哈希值相同,这个两个对象不一定相等” 。。
源码中也给出了解释 **“it is generally necessary to override the {@code hashCode} method whenever this method is overridden”**当equals()方法被重写时通常必须去重写hashCode方法–以便维护hashCode方法的一般约定,即相等的对象必须具有相等的哈希码。

3.equals和==有什么区别?

//对于基本数据类型,==比较的是值;对于引用数据类型,==比较的是内存(引用)地址。
//equals()对于没有重写equals方法的类,equals方法和==作用类似;对于重写过equals方法的类,equals比较的是值。
	下面是重点
	涉及到了自动装箱和自动拆箱
public static void main(String[] args) {
		Integer a = 1;
		Integer b = 2;
		Integer c = 3;
		Long g = 3L;
		int int1 = 12;
		int int2 = 12;
		Integer integer1 = new Integer(12);
		Integer integer2 = new Integer(12);
		Integer integer3 = new Integer(1);

		System.out.println("c==(a+b) ->" + (c == (a + b)));//c==(a+b) ->true
		System.out.println("g==(a+b) ->" + (g == (a + b)));//g==(a+b) ->true
		//对于上面这两条解释:a+b相加是先各自自动拆箱求和,c/g都会拆箱,与得到的和进行数值比较
		System.out.println("c.equals(a+b) ->" + (c.equals(a + b)));//c.equals(a+b) ->true
		System.out.println("g.equals(a+b) ->" + (g.equals(a + b)));//g.equals(a+b) ->false
		//对于上面这两条解释:首先明确一点包装类Integer\Long的equals()肯定是重写过的(下面的源码),其次对于equals()---a+b先触发自动拆箱进行数值相加得到的和“3”,再触发自动装箱过程变成Integer类型的变量3,再执行下面的重写的equals()方法,——————而对于g.equals(a+b),调用Long包装类中重写的equals()方法,下面代码块中指出false的原因
		System.out.println("int1 == int2 -> " + (int1 == int2));//int1 == int2 -> true
		//上面这行无需多言
		System.out.println("int1 == integer1 -> " + (int1 == integer1));//int1 == integer1 -> true
		//一句话-Integer自动拆箱
		System.out.println("integer1 == integer2 -> " + (integer1 == integer2));//integer1 == integer2 -> false
		//包装类直接==,比较是引用地址,又因为是“new”出来的,所以堆中地址不同
		System.out.println("integer3 == a -> " + (integer3 == a));//integer3 == a -> false
		//对于最后一条比较 重要。先清楚:(JVM虚拟机的)方法区的用途: 主要用于存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫“非堆”。重点 常量池在方法区中,而大家知道Integer具有常量池,对于不是new出来的变量,并且数值在-128~127之间的,都是引用常量池中的数值。
		//所以Integer a = 1;a是常量池中的1的地址,而Integer integer3 = new Integer(1);这里的integer3 是堆中新对象的地址
		//jvm虚拟机是绕不开的重中之重
	}
//这是Integer包装类重写的方法--对Integer的对象进行数值比较
   public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
//这是Long包装类重写的方法--对Long的对象进行数值比较
    public boolean equals(Object obj) {
        if (obj instanceof Long) {//经Debug,这句话将Integer类型的(a+b)拒之门外
            return value == ((Long)obj).longValue();
        }
        return false;
    }

**

String类

**
1.String类主要包含哪些方法

  1. char charAt(int index):返回指定索引处的字符;
  2. String substring(int beginIndex, int endIndex):从此字符串中截取出一部分子字符串;
  3. String[] split(String regex):以指定的规则将此字符串分割成数组;
  4. String trim():删除字符串前导和后置的空格;
  5. int indexOf(String str):返回子串在此字符串首次出现的索引;
  6. int lastIndexOf(String str):返回子串在此字符串最后出现的索引;
  7. boolean startsWith(String prefix):判断此字符串是否以指定的前缀开头;
  8. boolean endsWith(String suffix):判断此字符串是否以指定的后缀结尾;
  9. String toUpperCase():将此字符串中所有的字符大写;
  10. String toLowerCase():将此字符串中所有的字符小写;
  11. String replaceFirst(String regex, String replacement):用指定字符串替换第一个匹配的子串;
  12. String replaceAll(String regex, String replacement):用指定字符串替换所有的匹配的子串。

2.String类包含哪些支持正则表达式的方法
正则也很重要,快滚去B站学习
(这就牵扯到了正则表达式,表达式知道一些常见的符号就好,并给大家带来一个网站:开源中国的正则表达式测试(可以帮你生成正则表达式)
言正传
正则表达式Regular Expression,所以你凡是看到原生方法中参数列表有“ regex”.。这个方法就是可以用正则表达式的:除上面特殊标记的三个以外,还有 boolean matches(regex)[全匹配,整个字符串是否是正则表达式的匹配器形式];
例如----public static void main(String[] args) {
String a = new String(“abcabcabc”);
System.out.println(a.matches(“abc”));//false
//如果a这个字符串是"abc",结果就为true
}
3.new和""有什么区别
一句话 String 也有常量池
对于String a = “aaa”;和 String a = new String(“aaa”);
解释:前者JVM会使用常量池来管理字符串直接量。在执行这句话时,JVM会先检查常量池中是否已经存有"aaa",若没有则将"aaa"存入常量池,若常量池中已经存在就复用常量池中已有的"aaa",将其引用赋值给变量a。————后者,执行这句话时,JVM会先使用常量池来管理字符串直接量(同样,若有就复用),即将"aaa"存入常量池。然后再创建一个新的String对象,这个对象会被保存在堆内存中。并且,堆中对象的数据会指向常量池中的直接量。即:将堆中地址赋值给a,将常量池中地址赋值给堆中内存空间。

4.字符串相加的实现机制
如果拼接的都是字符串直接量,则在编译时编译器会将其直接优化为一个完整的字符串,和你直接写一个完整的字符串是一样的。例如String c = “aa”+“bb”;其实就相当于写String c = “aabb”;
如果拼接的字符串中包含变量,则在编译时编译器采用StringBuilder对其进行优化,即自动创建StringBuilder实例并调用其append()方法,将这些字符串拼接在一起。

5.String、StringBuffer、StringBuilder三者的区别联系
StringBuffer、StringBuilder都代表可变的字符串对象,它们有共同的父类 AbstractStringBuilder,并且两个类的构造方法和成员方法也基本相同。
方便记忆--三者

异常处理机制

1.三花乱窜
前辈的文章前辈的文章
在这里插入图片描述

3.finally在什么条件下会执行,在finally中return会怎么样
不管try块中的代码是否出现异常,也不管哪一个catch块被执行,甚至在try块或catch块中执行了return语句,finally块总会被执行。
不过要注意两点
1.如果在try块或catch块中使用 System.exit(1); 来退出虚拟机,则finally块将失去执行的机会。但是我们在实际的开发中,重来都不会这样做,所以尽管存在这种导致finally块无法执行的可能,也只是一种可能而已。
2.在通常情况下,不要在finally块中使用return、throw等导致方法终止的语句,一旦在finally块中使用了return、throw语句,将会导致try块、catch块中的return、throw语句失效。如果finally{}中含有return,会导致程序提前退出,不在执行try{}或catch(){}中的return。


小试牛刀:

1.输出15答案是 输出15

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值