二、企业真题
1. 数组有没有length()这个方法? String有没有length()这个方法?(*蓝)
数组没有length(),是length属性。
String有length()
2. 有数组int[] arr,用Java代码将数组元素顺序颠倒(闪*购)
略
3. 为什么数组要从0开始编号,而不是1(中*支付)
数组的索引,表示了数组元素距离首地址的偏离量。因为第1个元素的地址与首地址相同,所以偏移量就是0。所以从0开始。
4. 数组有什么排序的方式,手写一下(平*保险)
冒泡。
快排。(讲完递归方法以后,大家就可以练习一下)
5. 常见排序算法,说下快排过程,时间复杂度?(5*到家)
见课件。
快排:O(nlogn)
6. 二分算法实现数组的查找(神舟*天软件)
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
// 循环条件
while(left <= right){
// 防止溢出, 等同于(left + right) / 2
int mid = left + (right - left) / 2;
if(nums[mid] > target) {
// target 在左区间[left mid - 1]
right = mid - 1;
} else if (nums[mid] < target) {
// target 在右区间[mid + 1, right]
left = mid + 1;
} else { // nums[mid] == target
return mid; // 在数组中找到target, 直接返回下标
}
}
return -1; // 没有找目标值
}
}
7. 怎么求数组的最大子序列和(携*)
/*
* 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
* 求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如:输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
* @author 尚硅谷-宋红康
*/
public class ArrDemo {
public static void main(String[] args) {
int[] arr = new int[]{1, -2, 3, 10, -4, 7, 2, -5};
int i = getGreatestSum(arr);
System.out.println(i);
}
public static int getGreatestSum(int[] arr){
int greatestSum = 0;
if(arr == null || arr.length == 0){
return 0;
}
int temp = greatestSum;
for(int i = 0;i < arr.length;i++){
temp += arr[i];
if(temp < 0){
temp = 0;
}
if(temp > greatestSum){
greatestSum = temp;
}
}
if(greatestSum == 0){
greatestSum = arr[0];
for(int i = 1;i < arr.length;i++){
if(greatestSum < arr[i]){
greatestSum = arr[i];
}
}
}
return greatestSum;
}
}
8. Arrays 类的排序方法是什么?如何实现排序的?(阿*、阿*校招)
sort方法用于对数组进行串行排序。它有多个重载的方法,可以根据排序需求选择不同的方法。
二、企业真题
2.1 类与对象
1. 面向对象,面向过程的理解?(平*金服、英**达)
“一切皆对象”,对象就是面向对象编程的核心
所有的事情都可以拆分成一系列要执行的计算步骤,通常采用自上而下、顺序执行的方式来实现
2. Java 的引用类型有哪几种(阿*校招)
类、数组、接口;枚举、注解、记录
3. 类和对象的区别(凡*科技、上*银行)
(一)类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起。对象是具有类类型的变量。类和对象是面向对象编程技术中的最基本的概念。
(二)范畴不同:类是一个抽象的概念,它不存在于现实中的时间、空间里。 对象是类的一个具体。它是一个实实在在存在的东西。
4. 面向对象,你解释一下,项目中哪些地方用到面向对象?(燕*金融)
“万事万物皆对象”。
2.2 Java内存结构
1. Java虚拟机中内存划分为哪些区域,详细介绍一下(神**岳、数*互融)
线程私有的:
- 程序计数器
- 虚拟机栈
- 本地方法栈
线程共享的:
- 堆
- 堆外内存(永久代或元空间、代码缓存也叫方法区,jdk8以后叫元空间)
2. 对象存在Java内存的哪块区域里面?(阿*)
堆空间。
2.3 权限修饰符(封装性)
1. private 、缺省、protected、public的表格化作用区域(爱*信、拓*思、中*瑞飞)
2. main方法的public能不能换成private?为什么?(凡*科技、顺*)
能。但是改以后就不能作为程序的入口了,就只是一个普通的方法。
2.4 构造器
1. 构造方法和普通方法的区别(凡*科技、软*动力、中*软)
编写代码的角度:没有共同点。声明格式、作用都不同。
字节码文件的角度:构造器会以<init>()方法
的形态呈现,用以初始化对象。
2. 构造器Constructor是否可被overload?(鸿*网络)
可以。
3. 无参构造器和有参构造器的的作用和应用(北京楚*龙)
作用:用来初始化 java 类,提供类的初始化和实例化,以便调用。
有参数的构造方法的主要目的是为类中的属性初始化的,而无参数的构造方法,可以控制new对象。
2.5 属性及属性赋值顺序
1. 成员变量与局部变量的区别(艾*软件)
6个点。
2. 变量赋值和构造方法加载的优先级问题(凡*科技、博*软件)
变量显式赋值先于构造器中的赋值。
如何证明?我看的字节码文件。