没有合适的资源?快使用搜索试试~ 我知道了~
Java八股文面试基础超级详细
资源推荐
资源详情
资源评论
Java八股文-Java基础
1、Java的特点
Java是一门面向对象的编程语言。
Java有一句口号: Write once, run anywhere ,一次编写、到处运行。这也是Java的魅力所在。
而实现这种特性的正是Java虚拟机JVM。已编译的Java程序可以在任何带有JVM的平台上运行。你可
以在windows平台编写代码,然后拿到linux上运行。只要你在编写完代码后,将代码编译成.class
文件,再把class文件打成Java包,这个jar包就可以在不同的平台上运行了。
Java具有稳健性。
Java是一个强类型语言,它允许扩展编译时检查潜在类型不匹配问题的功能。Java要求显式的方法
声明,它不支持C风格的隐式声明。这些严格的要求保证编译程序能捕捉调用错误,这就导致更可
靠的程序。
异常处理是Java中使得程序更稳健的另一个特征。异常是某种类似于错误的异常条件出现的信号。
使用 try/catch/finally 语句,程序员可以找到出错的处理代码,这就简化了出错处理和恢复的
任务。
2、Java 与 C++ 的区别
Java 是纯粹的面向对象语言,所有的对象都继承自 java.lang.Object,C++ 兼容 C ,不但支持面向
对象也支持面向过程。
Java 通过虚拟机从而实现跨平台特性, C++ 依赖于特定的平台。
Java 没有指针,它的引用可以理解为安全指针,而 C++ 具有和 C 一样的指针。
Java 支持自动垃圾回收,而 C++ 需要手动回收。
Java 不支持多重继承,只能通过实现多个接口来达到相同目的,而 C++ 支持多重继承。
3、面向对象和面向过程的区别?
面向对象和面向过程是一种软件开发思想。
面向过程就是分析出解决问题所需要的步骤,然后用函数按这些步骤实现,使用的时候依次调用就
可以了。
面向对象是把构成问题事务分解成各个对象,分别设计这些对象,然后将他们组装成有完整功能的
系统。面向过程只用函数实现,面向对象是用类实现各个功能模块。
4、JDK和JRE的区别?
JDK和JRE是Java开发和运行工具,其中JDK包含了JRE,而JRE是可以独立安装的。
JDK:Java Development Kit,JAVA语言的软件工具开发包,是整个JAVA开发的核心,它包含了JAVA的
运行(JVM+JAVA类库)环境和JAVA工具,编译器和调试器等。
JRE:Java Runtime Environment,Java运行环境,包含JVM标准实现及Java核心类库。JRE是Java运行
环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器)。
5、面向对象有哪些特性?
面向对象四大特性:封装,继承,多态,抽象
原始类型 包装类型
boolean Boolean
byte Byte
char Character
float Float
int Integer
long Long
short Short
double Double
1、封装就是将类的信息隐藏在类内部,不允许外部程序直接访问,而是通过该类的方法实现对隐藏信息
的操作和访问。良好的封装能够减少耦合。
2、继承是从已有的类中派生出新的类,新的类继承父类的属性和行为,并能扩展新的能力,大大增加程
序的重用性和易维护性。在Java中是单继承的,也就是说一个子类只有一个父类。
3、多态是同一个行为具有多个不同表现形式的能力。在不修改程序代码的情况下改变程序运行时绑定的
代码。实现多态的三要素:继承、重写、父类引用指向子类对象。
静态多态性:通过重载实现,相同的方法有不同的參数列表,可以根据参数的不同,做出不同的处
理。
动态多态性:在子类中重写父类的方法。运行期间判断所引用对象的实际类型,根据其实际类型调
用相应的方法。
4、抽象。把客观事物用代码抽象出来。
6、什么是值传递和引用传递?
值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量。
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。所以
对引用对象进行操作会同时改变原对象。
7、自动装箱和拆箱
Java中基础数据类型与它们对应的包装类见下表:
装箱:将基础类型转化为包装类型。
拆箱:将包装类型转化为基础类型。
当基础类型与它们的包装类有如下几种情况时,编译器会自动帮我们进行装箱或拆箱:
赋值操作(装箱或拆箱)
进行加减乘除混合运算 (拆箱)
进行>、<、==比较运算(拆箱)
调用equals进行比较(装箱)
ArrayList 、 HashMap 等集合类添加基础类型数据时(装箱)
示例代码:
下面看一道常见的面试题:
输出:
为什么第三个输出是false?看看 Integer 类的源码就知道啦。
Integer e = 200; 会调用 调⽤ Integer.valueOf(200) 。而从Integer的 valueOf() 源码可以看到,
这里的实现并不是简单的 new Integer ,而是用 IntegerCache 做一个cache。
Integer x = 1; // 装箱 调⽤ Integer.valueOf(1)
int y = x; // 拆箱 调⽤了 X.intValue()
public void testAutoBox() {
int a = 100;
Integer b = 100;
System.out.println(a == b);
Integer c = 100;
Integer d = 100;
System.out.println(c == d);
Integer e = 200;
Integer f = 200;
System.out.println(e == f);
}
true
true
false
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
这是IntegerCache静态代码块中的一段,默认 Integer cache 的下限是-128,上限默认127。当赋值
100给Integer时,刚好在这个范围内,所以从cache中取对应的Integer并返回,所以二次返回的是同一
个对象,所以==比较是相等的,当赋值200给Integer时,不在cache 的范围内,所以会 new Integer 并
返回,当然==比较的结果是不相等的。
下限是-128,上限默认127的原因:因为计算机存储数据是使用补码存储,8位的int中,首位是符号
位,0代表正,1代表负,原码(真值)的范围是-127~127。但是0出现了两次,即+0,-0。因此让-0的
补码为10000000,即-128。这样即扩大了补码的表示范围又保证了计算机中表示0的唯一性。
8、String 为什么不可变?
先看下Java8 String类的源码:
String类是final的,它的所有成员变量也都是final的。为什么是final的?
1. 线程安全。同一个字符串实例可以被多个线程共享,因为字符串不可变,本身就是线程安全的。
2. 支持hash映射和缓存。因为String的hash值经常会使用到,比如作为 Map 的键,不可变的特性使
得 hash 值也不会变,不需要重新计算。
3. 字符串常量池优化。String对象创建之后,会缓存到字符串常量池中,下次需要创建同样的对象
时,可以直接返回缓存的引用,节省大量的内存空间。
9、String, StringBuilder 和 StringBuffer
区别
1. 可变性
String 不可变
StringBuffer 和 StringBuilder 可变
2. 线程安全
String 不可变,因此是线程安全的
StringBuilder和StringBuffer都实现了继承了AbstractStringBuilder(核心类,对char[]进行操
作),实现了Serializable接口(支持序列化和反序列化)和CharSequence(主要定义了length、
charAt、subSquence方法)
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
}
...
}
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
}
StringBuilder 不是线程安全的
StringBuffer 是线程安全的,内部append、delete、replace、length等方法都使用 synchronized
进行同步
10、String 类的常用方法有哪些?
indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
getBytes():返回字符串的 byte 类型数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
equals():字符串比较。
11、new String("dabin")会创建几个对象?
使用这种方式会创建两个字符串对象(前提是字符串常量池中没有 "dabin" 这个字符串对象)。
"dabin" 属于字符串字面量,因此编译时期会在字符串常量池中创建一个字符串对象,指向这个
"dabin" 字符串字面量;
使用 new 的方式会在堆中创建一个字符串对象。
12、什么是字符串常量池?
字符串常量池保存着所有字符串字面量,这些字面量在编译时期就确定。字符串常量池位于堆内存中,
专门用来存储字符串常量。在创建字符串时,JVM首先会检查字符串常量池,如果该字符串已经存在池
中,则返回其引用,如果不存在,则创建此字符串并放入池中,并返回其引用。
静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中。
static、final、Class、常量池。
但是 实例变量存在堆内存中。
JDK1.7 及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一
块区域存放运行时常量池。
JDK1.8开始,取消了Java方法区,取而代之的是位于直接内存的元空间(metaSpace)。
13、Object常用方法有哪些?
Object常用方法有: toString() 、 equals() 、 hashCode() 、 clone() 、 getClass() 等。
toString:默认输出对象地址。可以重写toString方法,按照重写逻辑输出对象值。
equals:默认比较两个引用变量是否指向同一个对象(内存地址)。
hashCode:将与对象相关的信息映射成一个哈希值,默认的实现hashCode值是根据内存地址换算出
来。
clone:可以实现对对象中各个属性的复制。
getClass:返回此 Object 的运行时类,常用于java反射机制。
剩余52页未读,继续阅读
资源评论
一枚爱吃大蒜的程序员
- 粉丝: 9801
- 资源: 83
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功