JavaSE阶段:易混淆概念全总结(超详细!)

简介: JavaSE阶段:易混淆概念全总结(超详细!)

📌 & 与 &&


○  &    无论左边是真是假,右边表达式都运算.

○  &&  当左边表达式为真,右边表达式才运算;若左边为假,那么右边不参与运算.

 ( ||  和 |  同理  ,|| 表示左边为真,右边不参与运算)

✎  实际开发中推荐使用  &&   ||

📌 this 与 super


this代表当前对象,可以调用当前类的构造方法, 成员变量和成员方法等。

super代表当前对象中从父类的引用的资源,可以调用父类构造方法,成员变量和方法。


✍   关于 this关键字  


○ this在非静态实例方法中:表示调用该方法的对象,即谁在调用,this就代表谁。


○ 当方法的局部变量与当前对象的成员变量重名时,就可以在成员变量前面加this. ,如果没有重名问题,就可以省略this.

○ this.成员变量会先从本类声明的成员变量列表中查找,如果未找到,会去从父类继承的在子类中仍然可见的成员变量列表中查找。

○ this不能出现在静态代码块和静态方法中

  关于 super关键字  

○ 在子类构造方法中要调用父类的构造方法,需要注意:super语句只能出现在子类构造方法体的第一行。


○ 用“super.成员变量名”来引用父类成员变量


○ 用“super.方法名(参数列表)”的方式访问父类的方法。


注意:super和this都不能出现在静态方法和静态代码块中

📌 方法重载与重写


  关于方法的重载  

在一个类中有多个名称相同的方法时,在调用时通过方法的重载,即改变方法的参数的个数类型顺序来区分同名的方法。

注意:方法的重载与返回值类型无关

  关于方法的重写  

当父类中方法的实现不能满足子类需求时,可以在子类中对父类的方法进行重写 ( 覆盖) , 这样调用时, 就会调用子类中重写的方法。

重写时需要注意:

● 子类重写的方法结构与父类方法的结构必须一致(方法名,参数列表,返回值类型必须一致)

● 子类重写的方法使用的访问权限 不能小于父类被重写方法的访问权。

构造方法,静态方法不能重写,成员变量不存在重写

● 使用 @Override 注解标签

     @Override是Java中的一个注解标签,定义在重写的方法上面,表示此方法是从父类重写而来,也可以不用添加,不过建议保留,因为编译器可以进行语法验证 ,并且阅读代码时可以明确的知道此方法是重写的。

📌 抽象类与接口


  关于抽象类  

抽象方法是一种特殊的方法,只有声明没有具体的实现,必须用abstract关键字修饰,没有方法体。

  关于接口  

○ 接口可以看做是一种特殊的抽象类,里面可以包含抽象方法,但不能被创建对象

○ 接口可以被类实现,实现类必须实现接口中定义的所有 方法;

○ 接口和抽象类十分的类似,接口内部的方法也是默认抽象的,不可在内部实例化的,只能由接口的调用者去实现。

○ 接口通过关键字 interface定义;类通过implements关键字来实现接口。

📌 "==" 与 equals


  关于 "=="  

“ == ” 比较等号两边是否相等

当==用于基本类型 比较时,比较的是变量的是否相等。

当==用于引用类型 比较时,比较的是对象的地址是否相等。

public static void main(String[] args) {
        //int属于基本数据类型
        int a = 5;
        int b = 5;
        System.out.println(a == b); //true
        //数组属于引用数据类型
        int[] c={1,2,3};
        int[] d={1,2,3};
        System.out.println(c); //[I@1b6d3586
        System.out.println(d); //[I@4554617c
        System.out.println(c==d);//  false  数组c与数组d的地址不同
        
    }

✍   关于 equals  


equals()方法属于Object类,Object类是所有Java类的祖先;equals方法默认比较的是两个对象的


地址是否相等, 所以我们就以使用 == 代替它;实际使用equals方法时,在其他类中,一般都重写


了equals(), 把它改造为比较对象中的内容是否相等。


public class Test_2 {
    public static void main(String[] args) {
        Person p1 = new Person("小魏",16);
        Person p2 = new Person("小魏",16);
        System.out.println(p1==p2);   // 输出:false 比较的是地址
        System.out.println(p1.equals(p2)); // 输出:true 已经对equals方法进行了重写,使其比较的是两对象内容是否相等
    }
}

●  (Object 中的 equals 方法默认使用==比较,比较的是对象地址,这点需要注意 )

●  在Person类中对equals方法进行重写,使其比较的是对象中的内容是否相等

 @Override
    public boolean equals(Object obj) {
        if(obj instanceof Person){
            Person other =(Person)obj;
            return name.equals(other.name) && age ==other.age;
        }
        return false;
    }

📌 String 与 StringBuffer


✎ String修饰的字符串是一个值不能改变 的字符串,用String声明的字符串对象值一旦给定就不能

改变了,每次拼接都会创建新的字符串对象,耗时且占用空间。

✎ StringBuffer是内容可以改变的字符串,值可以改变且不需要创建新对象,在多任务执行时是安全的

适合单线程。

📌 HashSet 与 HashMap


  关于 HashSet  

HashSet是单列集合Set接口 下的实现类, 并且我们知道Set中所存储的元素是不重复的.

关于HashSet在 添加元素时,是如何判断元素重复的?        

○  在底层会先调用hashCode(),注意:Object中的hashCode()返回的是对象的地址,此时并不会调用;此时调用的是类中重写的hashCode(),返回的是根据内容计算的哈希值,遍历时,会用哈希值先比较 是否相等,会提高比较的效率;但哈希值会存在问题:内容不同,哈希值相同;这种情况下再调equals比较 内容,这样既保证效率又确保安全。


✍   关于 HashMap  

HashMap是双列结合Map 接口下的实现类,并且我们知道双列集合数据存储是以 ( 键,值 ) 形式存 储且键不能重复,值可以重复,HashMap中的键是无序的。


★ 关于HashMap底层存储数据的结构 :(面试高频题)


○ 底层使用了一个长度默认为16的哈希数组,用来确定元素的位置,每次用key计算出哈希值,再     用哈希值%数组长度确定元素位置,将元素放在哈希表中指定的位置。


○ 后来继续添加元素,如果出现位置相同且不重复的元素,那么将后来元素添加到之前元素的next     节点。


○ 当链表长度等于8且哈希数组的长度大于64时链表会自动转为红黑树。

补充: 哈希表负载因子为0.75 , 当哈希表使用数组的0.75倍时会自动扩容为原来数组长的2倍

📌 Collection 与 Collections


  关于 Collection  

Collection接口定义了单列集合共有的方法,其子接口Set和List分别定义了存储方式。


✍   关于 Collections  


Collections是集合类的工具类,与数组的工具类Arrays类似.


📌 final 与 finally


  关于 final  

○ final 可以修饰类,方法,参数,成员变量(常量)

○ final 修饰的类不能被继承,所以不能修饰抽象类,例如Java中String类就是final修饰。

○ final 修饰的方法不能被重写

○ final 修饰方法的参数,参数值在方法中不能被改变。

○ final 修饰的成员变量值不能改变,因此称为常量。

  关于 finally  

○ finally关键字常常在异常处理中使用,finally块中的内容总是会执行的,,且只能有一个finally语句.

当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行

try{  

编写可能出现异常的代码

}catch(异常类型){

处理机制  

}finally{

代码总能执行

}

📌 throws 与 throw

○ throws 用在方法声明的地方,只声明方法异常的类型,并不处理异常。谁用谁异常谁处理。


○ throw 是一个关键字 在方法体中,会抛出一个异常,然后生成一个处理异常的新对象,通过传输一些异常数据,返回处理异常的结果 throw 为手动抛出异常,也可以抛出一些自己写的异常。


📌 ReentrantLock与synchronized

  • synchronized是一个关键字 ,控制依靠底层编译后的指令去实现.
  • synchronized可以修饰一个方法 或一个代码块.
  • synchronized是 隐式 的加锁和释放锁,一旦方法或代码块出现异常,会自动释放锁.


  • ReentrantLock是一个 ,依靠java底层代码去控制 (底层有一个同步队列)
  • ReentrantLock只能修饰 代码块.
  • ReentrantLock需要 手动 的加锁和释放锁, 所以释放锁最好写在finally中 , 一旦出现异常, 保证锁能释放.

sleep与wait


sleep ( ) :

  • 属于Thread类 中的方法.
  • sleep休眠指定时间后,会自动唤醒.
  • sleep( ) 不会释放锁.

wait ( ) :

  • 属于Object类 中的方法,必须要有锁对象调用.
  • wait后的线程必须要等待其他线程唤醒(notify或notifyAll).
  • wait( ) 自动释放锁.
相关文章
|
2月前
|
自然语言处理 Java 编译器
深入解析Java代码执行过程,揭开神秘的黑匣子!
深入解析Java代码执行过程,揭开神秘的黑匣子!
|
8天前
|
存储 安全 Java
Java泛型:深度解析编译时类型安全的核心机制
【6月更文挑战第28天】Java泛型自JDK 1.5起增强了代码安全与复用。它们允许类、接口和方法使用类型参数,如`<T>`在`Box<T>`中。泛型确保编译时类型安全,例如`List<String>`防止了运行时ClassCastException。尽管运行时存在类型擦除,编译时检查仍保障安全。理解泛型核心机制对于优化Java编程至关重要。
|
9天前
|
存储 Java 编译器
技术经验解读:一文带你搞懂java中的变量的定义是什么意思
技术经验解读:一文带你搞懂java中的变量的定义是什么意思
10 0
|
2月前
|
Java 关系型数据库
软件工程设计原理开放封闭原则 ,具体实现及JAVA代码举例
【4月更文挑战第4天】开放封闭原则(Open/Closed Principle, OCP)是面向对象设计的核心原则之一,它指出软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。这意味着在不修改已有代码的前提下,可以通过扩展来增加新的功能,从而提高软件系统的灵活性和可维护性
33 1
|
2月前
|
Java
软件工程设计原理依赖倒置原则 ,具体实现及JAVA代码举例
【4月更文挑战第5天】在软件工程中,依赖倒置原则(Dependency Inversion Principle, DIP)是一项重要的设计原则,它是SOLID原则中的一个组成部分。这个原则主张高层模块不应该依赖于低层模块,而是应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。这种设计方法有助于降低代码间的耦合度,增强系统的灵活性和可维护性
32 0
|
9月前
|
安全 Java 编译器
为什么说 Java 语言“编译与解释并存”?
为什么说 Java 语言“编译与解释并存”?
|
11月前
|
存储 Java 测试技术
《JavaSE-第十三章》之异常体系
《JavaSE-第十三章》之异常体系
|
IDE Unix 编译器
关于编译的重要概念总结
关于编译的重要概念总结
3360 0
关于编译的重要概念总结
|
存储 关系型数据库 MySQL
【JavaP6大纲】分布式事务篇:BASE理论
【JavaP6大纲】分布式事务篇:BASE理论
|
设计模式 Java
JavaSE:第七章:高级类特性
JavaSE:第七章:高级类特性
JavaSE:第七章:高级类特性

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    27
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    27
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    27
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    28
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    25
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    31
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    22
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    20
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    21
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    20