Java基础笔记
一、Java 语⾔有哪些特点?
- ⾯向对象(封装,继承,多态);
- 平台⽆关性,平台⽆关性的具体表现在于,Java 是“⼀次编写,到处运⾏(Write Once,Runany Where)”的语⾔,因此采⽤ Java 语⾔编写的程序具有很好的可移植性,⽽保证这⼀点的正 是 Java的虚拟机机制。在引⼊虚拟机之后,Java 语⾔在不同的平台上运⾏不需要重新编译。
- ⽀持多线程。C++语⾔没有内置的多线程机制,因此必须调⽤操作系统的多线程功能来进⾏多线 程程序设计,⽽ Java 语⾔却提供了多线程⽀持。
- 编译与解释并存
二、说说什么是跨平台性?原理是什么
- 所谓跨平台性,是指 Java 语⾔编写的程序,⼀次编译后,可以在多个系统平台上运⾏。
- 实现原理:Java 程序是通过 Java 虚拟机在系统平台上运⾏的,只要该系统可以安装相应的 Java 虚拟机,该系统就可以运⾏ java 程序。
三、⾃动类型转换、强制类型转换?看看这⼏⾏代码?
- Java 所有的数值型变量可以相互转换,当把⼀个表数范围⼩的数值或变量直接赋给另⼀个表数范围⼤的变量时,可以进⾏⾃动类型转换;反之,需要强制转换。
四、什么是⾃动拆箱/封箱?
- 装箱:将基本类型⽤它们对应的引⽤类型包装起来;
- 拆箱:将包装类型转换为基本数据类型
五、⽤最有效率的⽅法计算 2 乘以 8?
- 2 << 3。位运算,数字的⼆进制位左移三位相当于乘以 2 的三次⽅。
六、说说⾃增⾃减运算?看下这⼏个代码运⾏结果?
int i = 1 ;
i = i + + ;
System . out . println ( i) ;
答案是 1。相当于
int i = 1 ;
int temp = i ;
i + +;
i = temp ;
System . out . println ( i) ;
这段代码会输出什么?
int count = 0 ;
for ( int i = 0 ; i < 100 ; i + + )
{
count = count + + ;
}
System . out . println ( "count = " + count ) ;
答案是 0。
和上⾯的题⽬⼀样的道理,同样是⽤了临时变量,count 实际是等于临时变量的值。
int autoAdd ( int count )
{
int temp = count ;
count = coutn + 1 ;
return temp ;
}
七、==和 equals 的区别?
- = = : 它的作⽤是判断两个对象的地址是不是相等。即,判断两个对象是不是同⼀个对象(基本数据类型= = ⽐较的是值,引⽤数据类型 = = ⽐较的是内存地址)。
- equals() : 它的作⽤也是判断两个对象是否相等。但是这个“相等”⼀般也分两种情况:
- 默认情况:类没有覆盖 equals() ⽅法。则通过 equals() ⽐较该类的两个对象时,等价于通过“= = ”⽐较这两个对象,还是相当于⽐较内存地址。
- ⾃定义情况:类覆盖了 equals() ⽅法。我们平时覆盖的 equals()⽅法⼀般是⽐较两个对象的内容是否相同,⾃定义了⼀个相等的标准,也就是两个对象的值是否相等。
举个例⼦,Person,我们认为两个⼈的编号和姓名相同,就是⼀个⼈:
public class Person {
private String no;
private String name ;
@Override
public boolean equals( Object o ) {
if( this = = o ) return true ;
if(!( o instanceof Person )) return false ;
Person person = ( Person ) o ;
return Objects. equals( n o , person . n o ) & &
Objects. equals( name , person.name ) ;
}
@Override
public int hashCode () {
return Objects. hash ( n o , name ) ;
}
}
八、hashCode 与 equals?
“你重写过 hashcode 和 equals 么,为什么重写 equals 时必须重写 hashCode⽅法?”
- hashCode() 的作⽤是获取哈希码,也称为散列码;它实际上是返回⼀个 int 整数,定义在 Object 类中, 是⼀个本地⽅法,这个⽅法通常⽤来将对象的内存地址转换为整数之后返回。
为什么要有 hashCode?
- 例如 HashMap 怎么把 key 映射到对应的 value 上呢?⽤的就是哈希取余法,也就是拿哈希码和存储元素的数组的长度取余,获取 key 对应的 value 所在的下标位置。
为什么重写 equals 时必须重写 hashCode ⽅法?
- 如果两个对象相等,则 hashcode ⼀定也是相同的。两个对象相等,对两个对象分别调⽤ equals ⽅法都返回 true。反之,两个对象有相同的 hashcode 值,它们也不⼀定是相等的 。因此,equals ⽅法被覆盖过,则 hashCode ⽅法也必须被覆盖。
a.equals(b)==true 但他们两的HashCode不一样,那么这个 类在使用散列集合时就会发生错误,例如 HashMap是拿哈希码进行存储的,就会导致相同的两个值存储在不同的位置。
九、Java 是值传递,还是引用传递?
- Java 语⾔是值传递。
通过形参能改变实参的就是引用传递,反之就是值传递
- JVM 的内存分为堆和栈,其中栈中存储了基本数据类型和引⽤数据类型实例的地址,也就是对象地
址。 - ⽽对象所占的空间是在堆中开辟的,所以传递的时候可以理解为把变量存储的对象地址给传递过去,因
此引⽤类型也是值传递。
十、深拷贝和浅拷贝
- 浅拷贝:仅拷贝被拷贝对象的成员变量的值,也就是基本数据类型变量的值,和引⽤数据类型变量
的地址值,⽽对于引⽤类型变量指向的堆中的对象不会拷贝。 - 深拷贝:完全拷贝⼀个对象,拷贝被拷贝对象的成员变量的值,堆中的对象也会拷贝⼀份。
深拷贝如何实现
- 重写克隆⽅法:重写克隆⽅法,引⽤类型变量单独克隆,这⾥可能会涉及多层递归。
- 序列化:可以先将原对象序列化,再反序列化成拷贝对象。