1.== 和 equals 的区别是什么?
初始版本
==是直接判断两个对象的地址是否相同
equals
如果是引用类型 会调用两个对象的equals方法进行判断两个对象是否相同 默认的Object就是用==判断两个是不是相同的对象
补充版本
- 如果是基本类型 比较的就是值
- equals不能和基本类型比较
final关键字的作用
补充:
修饰引用
1.如果是基本类型
重写与重载
1.== 和 equals 的区别是什么?
==是直接判断两个对象的地址是否相同
equals 如果是引用类型 会调用两个对象的equals方法进行判断两个对象是否相同 默认的Object就是用==判断两个是不是相同的对象
- 如果是基本类型 比较的就是值
- equals不能和基本类型比较
final关键字的作用
修饰变量时
- 基本类型 表明该变量的内容不可变化
- 引用类型 /数组 表示该变量的指针地址不可变化 但是对象的具体内容 属性可以发生改变
- 修饰成员变量时 必须当场赋值
修饰方法时
- 表示该方法无法被子类重写 但是可以被继承
修饰类的时候
- 表示该类无法被继承 例如String
String 不属于基础的数据类型吗
基本类型和包装类型的区别?
- 用途:对于基本类型 我们一般在方法中使用 而包装类型更常见于JavaBean和方法参数中 参数传递:空和默认值是有区别的
- 存储方式:基本类型放在jvm的栈中 而包装类型在堆中
- 比较方式:参考1 equals
⚠️ 注意:基本数据类型存放在栈中是一个常见的误区! 基本数据类型的成员变量如果没有被 static 修饰的话(不建议这么使用,应该要使用基本数据类型对应的包装类型),就存放在堆中。
对于包装类型 使用equals
如果频繁拆装箱的话,也会严重影响系统的性能。我们应该尽量避免不必要的拆装箱操作。
静态变量有什么作用?
静态变量被类的所有实例所共享 用于节省内存 可以用于创建常量池
什么是方法的返回值?方法有哪几种类型?
方法的返回值 是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果)。返回值的作用是接收出结果,使得它可以用于其他的操作!
我们可以按照方法的返回值和参数类型将方法分为下面这几种:
参数和返回值相互组合
静态方法为什么不能调用非静态成员?
静态方法时属于类的 在类加载的时候就会分配内存
而非静态方法是类的实例 需要创建实例后才能分配内存
可变长参数
遇到方法重载的情况怎么办呢?会优先匹配固定参数还是可变参数的方法呢?
答案是会优先匹配固定参数的方法,因为固定参数的方法匹配度更高。
面向对象
面向对象和面向过程
两者的区别主要在于解决方法的方式不用
面向过程讲所有问题抽成一个个过程
面向对象则是抽离出一个对象 而用对象调用方法解决问题
面向过程的性能一般比面向对象高 但并不是绝对的 由编程语言的运行机制来决定
面向对象三大特征
封装
封装是指把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外界访问的方法来操作属性。就好像我们看不到挂在墙上的空调的内部的零件信息(也就是属性),但是可以通过遥控器(方法)来控制空调。如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。就好像如果没有空调遥控器,那么我们就无法操控空凋制冷,空调本身就没有意义了
使用Javabean就是封装
继承
通过使用继承,可以快速地创建新的类,可以提高代码的重用,程序的可维护性,节省大量创建新类的时间 ,提高我们的开发效率。
多态的特点:
- 对象类型和引用类型之间具有继承(类)/实现(接口)的关系;
- 引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;
- 多态不能调用“只在子类存在但在父类不存在”的方法;
- 如果子类重写了父类的方法,真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父类的方法
补充
在Java8中 接口可以有默认实现 即关键字default
如果实现两个接口 同类型 都有一个相同的default 则实现类要重写这个方法
如果父类有相同类型 而子类又实现了default接口 优先使用父类的 即类优先于接口
深拷贝和浅拷贝区别了解吗?什么是引用拷贝?
关于深拷贝和浅拷贝区别,我这里先给结论:
- 浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。
- 深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。
hashCode() 有什么用?
hashCode() 的作用是获取哈希码(int 整数),也称为散列码。这个哈希码的作用是确定该对象在哈希表中的索引位置。
那为什么 JDK 还要同时提供这两个方法呢?
这是因为在一些容器(比如 HashMap、HashSet)中,有了 hashCode() 之后,判断元素是否在对应容器中的效率会更高(参考添加元素进HashSet的过程)!
我们在前面也提到了添加元素进HashSet的过程,如果 HashSet 在对比的时候,同样的 hashCode 有多个对象,它会继续使用 equals() 来判断是否真的相同。也就是说 hashCode 帮助我们大大缩小了查找成本。
那为什么不只提供 hashCode() 方法呢?
这是因为两个对象的hashCode 值相等并不代表两个对象就相等。
那为什么两个对象有相同的 hashCode 值,它们也不一定是相等的?
因为 hashCode() 所使用的哈希算法也许刚好会让多个对象传回相同的哈希值。越糟糕的哈希算法越容易碰撞,但这也与数据值域分布的特性有关(所谓哈希碰撞也就是指的是不同的对象得到相同的 hashCode )。
总结下来就是:
- 如果两个对象的hashCode 值相等,那这两个对象不一定相等(哈希碰撞)。
- 如果两个对象的hashCode 值相等并且equals()方法也返回 true,我们才认为这两个对象相等。
- 如果两个对象的hashCode 值不相等,我们就可以直接认为这两个对象不相等。
String
String是常量
Stringbuffer是线程安全的 都用了 synchronized进行修饰
StringBuilder则是线程不安全的
性能 则是stringbuffer最快 但是却牺牲了线程不安全
String s1 = new String("abc");这句话创建了几个字符串对象?
会创建 1 或 2 个字符串对象。