卑微小吴励志写博客第1天

在这里插入图片描述

去年12月25元旦入职到今天,已经差不多5个月了。最近觉得自己技术日益荒废,技术不断落后,故励志每天写一下博客(当然可能睡一觉明天就忘了),来记录自己学习的过程,提醒自己还有一颗进取的心。
今天同事还说,我们已经沦为社会底层的人,想想确实也是,带着和保洁阿姨,门口保安一样的外包工牌,拿着一个月都不够花的工资,略感卑微啊,所以取名卑微小吴。还不努力一点,以后怎样过得上年少时梦想的像咸鱼一样可以无忧无虑躺着玩游戏的生活。故想从今天开始,写写博客,做点改变。
为了能以后能顺利跳槽,拿个自己心仪的offer,先从面试题开始学习把(实在是感觉需要学习的太多了),每日记录一点心得,一点干货。

1、String

1.1 String类常用的方法

在这里插入图片描述

1.2 String 、StringBuilder 、StringBuffer 的区别

Java 平台提供了两种类型的字符串:String 和 StringBuffer/StringBuilder,它们都可以储存和操作字符串,区别如下。

  • String 是只读字符串,也就意味着 String 引用的字符串内容是不能被改变的。初学者可能会有这样的误解:

    1. String str = “abc”;
    2. str = “bcd”;
      如上,字符串 str 明明是可以改变的呀!其实不然,str 仅仅是一个引用对象,它指向一个字符串对象“abc”。第二行代码的含义是让 str
      重新指向了一个新的字符串“bcd”对象,而“abc”对象并没有任何改变,只不过该对象已经成为一个不可及对象罢了。
  • StringBuffer/StringBuilder 表示的字符串对象可以直接进行修改。

  • StringBuilder 是 Java5 中引入的,它和 StringBuffer 的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方法都没有被 synchronized 修饰,因此它的效率理论上也比 StringBuffer 要高。

1.3 是否可以继承String类? String为什么要用final修饰?

String类是final修饰的类,故不可以继承。
为了安全和效率。
因为只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。但如果字符串是可变的,那么String interning将不能实现,因为这样的话,如果变量改变了它的值,那么其它指向这个值的变量的值也会一起改变。
如果字符串是可变的,那么会引起很严重的安全问题。譬如,数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接,或者在socket编程中,主机名和端口都是以字符串的形式传入。因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符串指向的对象的值,造成安全漏洞。
因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的。
因为字符串是不可变的,所以在它创建的时候HashCode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串。

2 Object类

在这里插入图片描述

2.1 Object类有11个成员方法,加上一个构造方法。
  1. public final native Class<?> getClass()
    native方法,用于返回当前运行时对象的Class对象,使用了final关键字修饰,故不允许子类重写。
  2. public native int hashCode()
    native方法,用于返回对象的哈希码,主要使用在哈希表中,比如JDK中的HashMap。
  3. public boolean equals(Object obj)//用于比较2个对象的内存地址是否相等,String类对该方法进行了重写用户比较字符串的值是否相等。
  4. protected native Object clone() throws CloneNotSupportedException
    naitive方法,用于创建并返回当前对象的一份拷贝。一般情况下,对于任何对象
    x,表达式 x.clone() != x 为true,x.clone().getClass()== x.getClass()
    为true。Object本身没有实现Cloneable接口,所以不重写clone方法
    并且进行调用的话会发生CloneNotSupportedException异常。
  5. public String toString()
    返回类的名字@实例的哈希码的16进制的字符串。建议Object所有的子类都重写这个方法。
  6. public final native void notify()//native方法,并且不能重写。唤醒一个在此对象监视器上等待的线程(监视器相当于就是锁的概念)。如果有多个线程在等待只会任意唤醒一个。
  7. public final native void
    notifyAll()//native方法,并且不能重写。跟notify一样,唯一的区别就是会唤醒在此对象监视器上等待的所有线程,而不是一个线程。
  8. public final native void wait(long timeout) throws
    InterruptedException//native方法,并且不能重写。暂停线程的执行。注意:sleep方法没有释放锁,而wait方法释放了锁
    。timeout是等待时间。
  9. public final void wait(long timeout, int nanos) throws
    InterruptedException//多了nanos参数,这个参数表示额外时间(以毫微秒为单位,范围是 0-999999)。
    所以超时的时间还需要加上nanos毫秒。
  10. public final void wait() throws InterruptedException
    跟之前的2个wait方法一样,只不过该方法一直等待,没有超时时间这个概念
  11. protected void finalize() throws Throwable { }
    实例被垃圾回收器回收的时候触发的操作。
2.2 equals() 与 == 的区别

基本类型(int,char,long,boolean等)都是用 == 判断相等性。对象引用的话,判断引用所指的对象是否是同一个。equals是Object的成员函数,默认是使用 ==,都是比较地址值。但一般的类会覆盖(override)这个方法,用于判断对象的等价性。例如String类,两个引用所指向的String都是"abc",但可能出现他们实际对应的对象并不是同一 个(和jvm实现方式有关),因此用判断他们可能不相等,但用equals判断一定是相等的。

2.3 Java中为什么需要Object类,Object类为什么是所有类的父类

1)可以使不同对象之间可以统一、互转。其中还包括 toString(),wait()…等公共方法的 统一定义
2)对父类的逻辑处理统一,不需要根据有没有父类分两种实现。

2.4 如何保证Object是默认父类

编译器编译的时候自动进去的。在编译源代码时,当遇到没有父类的类时,编译器会将其指定一个默认的父类(一般为Object),而虚拟机在处理到这个类时,由于这个类已经有一个默认的父类了,因此,VM仍然会按着常规的方法来处理每一个类。对于这种情况,从编译后的二进制角度来看,所有的类都会有一个父类。
可以自己通过写一个类,编译后通过反编译工具验证一下。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值