Java基础重要知识点
1.==和equals()的区别
== :比较的是值是否相等
如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
equals:(注意:equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象)
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
重写equals方法一定重写hashcode
1)使用hashcode方法提前校验,可以避免每一次比对都调用equals方法,提高效率
2)保证是同一个对象,如果重写了equals方法,而没有重写hashcode方法,会出现equals相等的对象,hashcode不相等的情况,重写hashcode方法就是为了避免这种情况的 出现。
2.值传递和引用传递
值传递:
是基本类型的传递,会把要传递的值复制一份传递给要赋值的变量,如果数据多,会占用大量内存
引用传递
是将对象的地址值传递过去,在方法的执行过程中,两个对象的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象。
3.int和Integer
1)Integer是int的包装类,int则是java的一种基本数据类型
2)Integer变量必须实例化后才能使用,而int变量不需要
3)Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
4)Integer的默认值是null,int的默认值是0
4.String和StringBuffer和StringBuilder
String
是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,这样不仅效率低下,而且大量浪费有限的内存空间,所以经常改变内容的字符串最好不要用 String
StringBuffer
字符串缓冲区,是线程安全的
StringBuilder
也是字符串缓冲区,线程不安全,但是效率高
对字符串进行修改的时候,特别是字符串对象经常改变的情况下,需要使用 StringBuffer 和 StringBuilder 类。效率比较StringBuilder > StringBuffer > String
5.&和&&的区别
&是按位与和逻辑与
&&是短路与
&&之所以被称为短路与,是因为,如果表达式左边的值为false,则右边会直接被短路掉,不会执行。如:username!=null&&username.equals(""),如果第一个条件不成立,则不会运行第二个条件,如果交换顺序,可能会出现NullPointException异常
6.Java和Javascript
它们的相同之处包括:
1)它们的语法和 C 语言都很相似;
2)它们都是面向对象的(虽然实现的方式略有不同);
3)JavaScript 在设计时参照了 Java 的命名规则;
它们的不同之处包括:
1)JavaScript 是动态类型语言(动态类型语言,就是类型的检查是在运行时才做。类型对于变量,属性,方法以及方法的返回类型都是可有可无的,在给变量赋值时才决定它的类型, 之后,还可以赋值不同类型的值),而 Java 是静态类型语言;
2)JavaScript 是弱类型的,Java 属于强类型;
3)java广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网等,而Javascript的用途是:①嵌入动态文本于HTML页面;②对浏览器事件做出响应; ③读写HTML元素;④在数据被提交到服务器之前验证数据;⑤检测访客的浏览器信息; ⑥控制cookies,包括创建和修改等。
7.final、finally和finalize
final
final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖和类不可被继承。
final属性:被final修饰的变量不可变,指的时引用不可变,即它只能指向初始时指向的那个对象,而不关心对象的变化内容。所以,被final修饰的对象必须初始化。初始化方式:①定义时初始化②final成员变量可以在初始化块中初始化,但是不能再静态初始化块中初始③静态final成员变量可以在静态初始化块中,但是不能在初始化块中初始化④在类的构造器中初始化,但静态final成员变量不可以在在构造函数中初始化
final方法;当一个方法声明为final时,该方法不允许任何子类重写这个方法,但子类仍然可以使用这个方法。
final参数:用来表示参数在这个函数内部不允许被修改。
final类:当一个类被声明为final时,此类不能被继承,所有方法都不能被重写,但这不能表示final类的成员也是不能改变的,要想做到成员不能改变,必须在此变量前加final修饰。abstract和final不能同时修饰。
finally
作为异常处理的一部分,它只能用在try/catch语句中,并且附带语句块表示这段语句最终一定会被执行。
finalize
是Object类的一个方法,在垃圾回收器执行时会被调用。
8.重载和重写
重载
1)同名方法,不同参数
2)对于继承来说,如果父类方法是private修饰,子类有同名方法,该方法不是重载,而是一个新的方法
重写(也叫覆盖)
1)重写的方法必须和基类的方法名、返回值、抛出的异常、参数相同
2)如果父类方法是private修饰,子类有同名方法,该方法不是重写,而是一个新的方法
9.static
static成员变量
虽然Java语言没有全局的概念,但是可以通过static关键字达到全局的效果。静态变量属于类,在内存中只有一个复制(所有的实例都指向同一个地址),只要静态变量所在的类被加载,这个静态变量就会被分配空间,因此就可以被使用。
static成员方法
static方法中不能使用this和super关键字,不能调用非static方法,只能访问静态变量和静态方法。静态变量一个很重要的用途是实现单例模式。
static代码块
它不存在任何一个方法体内。jvm在加载类时会执行static代码块,如果有多个静态代码块,则按顺序执行。经常用来初始化静态变量。
static内部类
它可以不依赖于外部类实例对象而被实例化,而通常的内部类需要外部类实例化后才能实例化。只能访问外部类中的静态成员和方法。
10.泛型
参数化类型,在没有泛型之前,一旦吧一个对象“丢进”java集合中,集合就会忘记对象的类型,把所有的对象都当成是Object类型处理。当程序从集合中取出对象之后,就要进行强制类型转换,这种强制类型转换不仅代码臃肿还容易引起ClassCastException异常。
<? extends T>限定参数类型的上界:参数类型必须是T或T的子类型
<? super T> 限定参数类型的下界:参数类型必须是T或T的超类型
?和T都是表示不确定的类型,区别在于我们可以对T进行操作而对?不可以
11.接口和抽象类
1)接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),抽象类可以 有非抽象的方法
2)接口中的实例变量默认是 final 类型的,而抽象类中则不一定
3)一个类可以实现多个接口,但最多只能实现一个抽象类
4)一个类实现接口的话要实现接口的所有方法,而抽象类不一定
5)接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,抽象是对类的抽 象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
12.Comparable和Comparator
他们都是java的一个接口, 并且是用来对自定义的class比较大小的。
Comparable 定义在 Person类的内部。
Comparator 是定义在Person的外部的, 此时我们的类的结构不需要有任何变化,然后我们另外定义一个比较器实现Comparator
总结:用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码, 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器
13.异常关键字
try块表示程序正常的业务执行代码。如果程序在执行try块的代码时出现了“非预期”情况,JVM将会生成一个异常对象,这个异常对象将会被后面相应的catch块捕获。
catch块表示一个异常捕获块。当程序执行try块引发异常时,这个异常对象将会被后面相应的catch块捕获。
throw用于手动地抛出异常对象。throw后面需要一个异常对象。
throws用于在方法签名中声明抛出一个或多个异常类,throws关键字后可以紧跟一个或多个异常类。
finally块代表异常处理流程中总会执行的代码块。
对于一个完整的异常处理流程而言,try块是必须的,try块后可以紧跟一个或多个catch块,最后还可以带一个finally块。
try块中可以抛出异常。

浙公网安备 33010602011771号