Java知识分享网 - 轻松学习从此开始!    

Java知识分享网

Java1234官方群25:java1234官方群17
Java1234官方群25:838462530
        
SpringBoot+SpringSecurity+Vue+ElementPlus权限系统实战课程 震撼发布        

最新Java全栈就业实战课程(免费)

springcloud分布式电商秒杀实战课程

IDEA永久激活

66套java实战课程无套路领取

锋哥开始收Java学员啦!

Python学习路线图

锋哥开始收Java学员啦!

java学科面试宝典v7.0 PDF 下载


分享到:
时间:2020-08-17 11:01来源:http://www.java1234.com 作者:小锋  侵权举报
java学科面试宝典v7.0 PDF 下载
失效链接处理
java学科面试宝典v7.0 PDF 下载


本站整理下载:
 
相关截图:
 
主要内容:
一.Java 基础 
1. Java 基础知识 
1.1 重载和重写的区别
重载: 发生在同一个类中,方法名必须相同,参数类型不同.个数不同.顺序不同,方法返回
值和访问修饰符可以
不同,发生在编译时。
重写: 发生在父子类中,方法名.参数列表必须相同,返回值范围小于等于父类,抛出的异
常范围小于等于父类,
访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。
1.2 String 和 StringBuffffer.StringBuilder 的区
别是什么?String 为什么是不可变的? 
可变性 
简单的来说:String 类中使用 fifinal 关键字字符数组保存字符串, private final char 
value[] ,所以 String 对象是不可变的。而 StringBuilder 与 StringBuffffer 都继承自
AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串
char[]value 但是没有用 fifinal 关键字修饰,所以这两种对象都是可变的。
StringBuilder 与 StringBuffffer 的构造方法都是调用父类构造方法也就是
AbstractStringBuilder 实现的,大家可以自
行查阅源码。
AbstractStringBuilder.java
abstract class AbstractStringBuilder implements Appendable, CharSequence { 
char[] value; 
int count; 
AbstractStringBuilder() { 
}
AbstractStringBuilder(int capacity) { 
value = new char[capacity]; 
}
线程安全性 
String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是
StringBuilder 与 StringBuffffer 的公共父类,定义了一些字符串的基本操作,如
expandCapacity.append.insert.indexOf 等公共 方法。StringBuffffer 对方法加了同步锁或者对
调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对
方法进行加同步锁,所以是非线程安全的。
性能 
abstract class AbstractStringBuilder implements Appendable, CharSequence { 
char[] value; 
int count; 
AbstractStringBuilder() { 
}
AbstractStringBuilder(int capacity) { 
value = new char[capacity]; 
}每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的
String 对象。
StringBuffffer 每次都会对 StringBuffffer 对象本身进行操作,而不是生成新的对象并改变
对象引用。相同情况下使用 StirngBuilder 相比使用 StringBuffffer 仅能获得 10%~15% 左右的性
能提升,但却要冒多线程不安全的风险。
对于三者使用的总结: 
1. 操作少量的数据 = String 
2. 单线程操作字符串缓冲区下操作大量数据 = StringBuilder 
3. 多线程操作字符串缓冲区下操作大量数据 = StringBuffffer 
1.3 自动装箱与拆箱
装箱:将基本类型用它们对应的引用类型包装起来;
拆箱:将包装类型转换为基本数据类型;
1.4 == 与 equals 
== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本
数据类型==比较的是值,引用数据类型==比较的是内存地址) 
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
情况 1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”
比较这两个对象。
情况 2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;
若它们的内容相等,则返回 true (即,认为这两个对象相等)。
public class test1 { 
public static void main(String[] args) { 
String a = new String("ab"); // a 为一个引用
String b = new String("ab"); // b 为另一个引用,对象的内容一样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
if (aa == bb) // true 
System.out.println("aa==bb"); 
if (a == b) // false,非同一对象
System.out.println("a==b"); 
if (a.equals(b)) // true 
System.out.println("aEQb"); 
if (42 == 42.0) { // true 
System.out.println("true"); 
}
说明: 
String 中的 equals 方法是被重写过的,因为 object 的 equals 方法是比较的对象的内存地
址,而 String 的 equals 方法比较的是对象的值。
当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同
的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。
1.5 关于 fifinal 关键字的一些总结
fifinal 关键字主要用在三个地方:变量.方法.类。
1. 对于一个 fifinal 变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更
改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
2. 当用 fifinal 修饰一个类时,表明这个类不能被继承。fifinal 类中的所有成员方法都会被
隐式地指定为 fifinal 方法。
3. 使用 fifinal 方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;
第二个原因是效率。
在早期的 Java 实现版本中,会将 fifinal 方法转为内嵌调用。但是如果方法过于庞大,可能看
不到内嵌调用带来的任何性能提升(现在的 Java 版本已经不需要使用 fifinal 方法进行这些优化了)。
类中所有的 private 方法都隐式地指定为 fifianl。
1.6 Object 类的常见方法总结
Object 类是一个特殊的类,是所有类的父类。它主要提供了以下 11 个方法:
public final native Class<?> getClass()//native 方法,用于返回当前运行时对象的 Class 对象,使用
final 关键字修饰,故不允许子类重写。
public native int hashCode() //native 方法,用于返回对象的哈希码,主要使用在哈希表中,比如 JDK
中的
HashMap。
public boolean equals(Object obj)//用于比较 2 个对象的内存地址是否相等,String 类对该方法进行了
重写用户
比较字符串的值是否相等。
protected native Object clone() throws CloneNotSupportedException//naitive 方法,用于创建并返回
当前对象的一份拷贝。一般情况下,对于任何对象 x,表达式 x.clone() != x 为 true,x.clone().getClass() 
== x.getClass() 为 true。Object 本身没有实现 Cloneable 接口,所以不重写 clone 方法并且进行调用的
话会发生
CloneNotSupportedException 异常。
public String toString()//返回类的名字@实例的哈希码的 16 进制的字符串。建议 Object 所有的子类都
重写这个方
法。
public final native void notify()//native 方法,并且不能重写。唤醒一个在此对象监视器上等待的线
程(监视
器相当于就是锁的概念)。如果有多个线程在等待只会任意唤醒一个。
public final native void notifyAll()//native 方法,并且不能重写。跟 notify 一样,唯一的区别就是
会唤醒
在此对象监视器上等待的所有线程,而不是一个线程。
public final native void wait(long timeout) throws InterruptedException//native 方法,并且不能
重写。暂停线程的执行。注意:sleep 方法没有释放锁,而 wait 方法释放了锁 。timeout 是等待时间。
public final void wait(long timeout, int nanos) throws InterruptedException//多了 nanos 参数,
这个参数表示额外时间(以毫微秒为单位,范围是 0-999999)。 所以超时的时间还需要加上 nanos 毫秒。
public final void wait() throws InterruptedException//跟之前的 2 个 wait 方法一样,只不过该方法
一直等
待,没有超时时间这个概念
protected void finalize() throws Throwable { }//实例被垃圾回收器回收的时候触发的操作
1.7 Java 中的异常处理


 

------分隔线----------------------------

锋哥公众号


锋哥微信


关注公众号
【Java资料站】
回复 666
获取 
66套java
从菜鸡到大神
项目实战课程

锋哥推荐