Java面试-基础与语法(1)

本文详细介绍了Java的跨平台原理,强调了Java的安全性,包括指针替换、垃圾回收、异常处理和类型转换等方面。此外,还讲解了JVM、JRE和JDK的概念以及它们之间的关系。内容涵盖Java的注释类型、基本数据类型、运算符、循环结构、异常处理、递归算法、排序算法以及可变参数的作用和特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java的跨平台原理

Java编程的原理
Java源程序(.java)->Java字节码文件(.class)->Java虚拟机(JVM)->Java运行程序
Java不同的虚拟机提供了相同的接口
Java具有一次编译,到处运行的特点

Java的安全性

语言层次的安全性主要体现在:
1.Java取消了强大但危险的指针,取而代之的是Java的引用机制。
由于指针可进行移运算,指针可以随便指向任意一个内存区域,而不用管这个区域是否可用,这样的情况是危险的。
原来的内存地址可能存储着重要数据或被其他程序运行所占用,同时指针也易于引起数组的越界。
2.Java的垃圾回收机制:
不需要程序员直接控制内存的回收,由垃圾回收机制来自动进行内存的回收。避免程序忘记及时回收,导致内存的泄露,避免程序错误回收重要的程序内存,导致系统崩溃。
3.异常处理机制:
Java的异常处理机制只要依赖于try,catch,finally,throw,throws五个关键字
4.Java的强制类型转换:
只有满足强制转换的规则的情况下才能强制转换成功
5.底层的安全:
Java在字节码的传输环节中使用了公共密钥加密机制(PKC)
在运行环境提供了四级安全性保障机制:
字节码校验器 -类装载器 -运行时内存布局 -文件访问限制

什么是JVM?什么是JRE? 什么是JDK?

JVM :JVM是Java Virtual Machine(Java虚拟机)的缩写。
它是整个java实现跨平台的最核心的部分。

JRE:JRE是java runtime environment(java运行环境)的缩写。

JDK:JDK是java development kit(java开发工具包)的缩写。

JDK,JRE,JVM三者关系概括如下:

JDK是JAVA程序开发时用的开发工具包,其内部也有JRE运行环境JRE。
JRE是JAVA程序运行时需要的运行环境,就是说如果你光是运行JAVA程序而不是去搞开发的话,只安装JRE就能运行已经存在的JAVA程序了。
JDk、JRE内部都包含JAVA虚拟机JVM,JAVA虚拟机内部包含许多应用程序的类的解释器和类加载器等等。

简单概括:
Java虚拟机是JVM(底层), java运行环境是JRE(环境),java开发工具包是JDK(开发)。

Java三种注释类型

单行注释,采用“//”方式.只能注释一行代码。
多行注释,采用“//”方式,可注释多行代码,其中不允许出现嵌套。如:
文档注释,采用“/**…*/”方式。

8种基本数据类型及其字节数

数据类型关键字字节数
数值型整数型byte1
short2
int4
long8
浮点型float4
double8
布尔型boolean1(位)
字符型char2

i++和++i的异同之处

共同点:
1、i++和++i都是变量自增1,都等价于i=i+1
2、如果i++,++i是一条单独的语句,两者没有任何区别
3、i++和++i的使用仅仅针对变量。 2++和++2会报错,因为2不是变量。

不同点:
如果i++,++i不是一条单独的语句,他们就有区别
i++ :先运算后增1。如:

int x=5;
int y=x++;
System.out.println("x="+x+", y="+y);
//以上代码运行后输出结果为:x=6, y=5

++i : 先增1后运算。如:

int x=5;
int y=++x;
System.out.println("x="+x+", y="+y);
//以上代码运行后输出结果为:x=6, y=6

&和&&的区别和联系,|和||的区别和联系

&和&&的联系(共同点):

&和&&都可以用作逻辑与运算符,但是要看使用时的具体条件来决定。

操作数1 & 操作数2,操作数1 && 操作数2,

表达式1 & 表达式2,表达式1 && 表达式2,

情况1:当上述的操作数是boolean类型变量时,&和&&都可以用作逻辑与运算符。

情况2:当上述的表达式结果是boolean类型变量时,&和&&都可以用作逻辑与运算符。

表示逻辑与(and),当运算符两边的表达式的结果或操作数都为true时,整个运算结果才为true,否则,只要有一方为false,结果都为false。

&和&&的区别(不同点):

(1)、&逻辑运算符称为逻辑与运算符,&&逻辑运算符称为短路与运算符,也可叫逻辑与运算符。

对于&:无论任何情况,&两边的操作数或表达式都会参与计算。

对于&&:当&&左边的操作数为false或左边表达式结果为false时,&&右边的操作数或表达式将不参与计算,此时最终结果都为false。

&还可以用作位运算符。当&两边操作数或两边表达式的结果不是boolean类型时,&用于按位与运算符的操作。

|和||的区别和联系与&和&&的区别和联系类似

用最有效率的方法算出2乘以8等于多少

使用位运算来实现效率最高。
位运算符是对操作数以二进制比特位为单位进行操作和运算,操作数和结果都是整型数。
对于位运算符“<<”, 是将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,位运算cpu直接支持的,效率最高。
所以,2乘以8等于几的最效率的方法是2 << 3

基本数据类型的类型转换规则

基本类型转换分为自动转换和强制转换。

自动转换规则:容量小的数据类型可以自动转换成容量大的数据类型

也可以说低级自动向高级转换。这儿的容量指的不是字节数,而是指类型表述的范围。
在这里插入图片描述

强制转换规则:高级变为低级需要强制转换。

如何转换:

(1)赋值运算符“=”右边的转换,先自动转换成表达式中级别最高的数据类型,再进行运算。

(2)赋值运算符“=”两侧的转换,若左边级别>右边级别,会自动转换;若左边级别 == 右边级别,不用转换;若左边级别 < 右边级别,需强制转换。

(3)可以将整型常量直接赋值给byte, short, char等类型变量,而不需要进行强制类型转换,前提是不超出其表述范围,否则必须进行强制转换。

if多分支语句和switch多分支语句的异同之处

相同之处:都是分支语句,多超过一种的情况进行判断处理。

不同之处:

switch更适合用于多分支情况,就是有很多种情况需要判断处理,判断条件类型单一,只有一个入口,在分支执行完后(如果没有break跳出),不加判断地执行下去;
而if—elseif—else多分枝主要适用于分支较少的分支结构,判断类型不是单一,只要一个分支被执行后,后边的分支不再执行。
switch为等值判断(不允许比如>= <=)
而if为等值和区间都可以,if的使用范围大

while和do-while循环的区别

while先判断后执行,第一次判断为false,循环体一次都不执行

do while先执行 后判断,最少执行1次。

如果while循环第一次判断为true, 则两种循环没有区别。

break和continue的作用

break: 结束当前循环并退出当前循环体。

break还可以退出switch语句

continue: 循环体中后续的语句不执行,但是循环没有结束,继续进行循环条件的判断(for循环还会i++)。continue只是结束本次循环。

请使用递归算法计算n!

public static Interage factorial(Interage n){
	if(n<0){
		return 0;
	}
	if(n==1){
		return 1;
	}
	return n * factorial(n-1);
}
public static void main(String[] args){
	//计算5的阶层factorial(阶乘)
	System.out.println(factorial(5));
}

递归的定义和优缺点

递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。

递归算法解决问题的特点:

(1) 递归就是在过程或函数里调用自身。

(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

(3) 递归算法解题通常显得很简洁,但运行效率较低。所以一般不提倡用递归算法设计程序。

(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。

数组的特征

数组是(相同类型数据)的(有序)(集合)

数组会在内存中开辟一块连续的空间,每个空间相当于之前的一个变量,称为数组的元素element

元素的表示 数组名[下标或者索引]: scores[7] ,scores[0] ,scores[9]

索引从0开始

每个数组元素有默认值: double 0.0 ,boolean false, int 0

数组元素有序的,不是大小顺序,是索引的顺序

数组中可以存储基本数据类型,可以存储引用数据类型;
但是对于一个数组而言,数组的类型是固定的,只能是一个length:数组的长度

数组的长度是固定的,一经定义,不能再发生变化(数组的扩容)

冒泡排序代码

思想:每一轮循环,前一个数和后一个数进行比较,小的数和大的数换位,大的在小的右边,直到循环不在发生改变时停止循环。

public class TestBubbleSort{
	public static void sort(int[] a){
		int temp = 0;
		// 外层循环,它决定一共走几趟
		for(int i=0;i<a.length-1;i++){
			//通过符号位可以减少无谓的比较,如果已经有序了,就退出循环
			int flag = 0;
			//内层循环,它决定每趟走一次
			for(int j=0;j<a.length-1-i;j++){
				//如果后一个大于前一个
				if(a[j+1]<a[j]){
					//换位
					temp = a[j];
					a[j] = a[j+1];
					a[j+1] = temp;
					flag = 1;
				}
			}
			if(flag == 0){
				break;
			}
		}
	}
}

选择排序的代码

思想:每轮循环,当前数和后面所有数进行比较,标记最小数的下标,找到最小值后,当前数和最小值交换,当前数下标+1,再和+1后当前数的后面所有数进行比较,直到循环结束。

public class TestSelectSort {
	public static void sort(int arr[]) {
		int temp = 0;
		for (int i = 0; i < arr.length - 1; i++) {
			// 认为目前的数就是最小的, 记录最小数的下标
			int minIndex = i;
			for (int j = i + 1; j < arr.length; j++) {
				if (arr[minIndex] > arr[j]) {
					// 修改最小值的下标
					minIndex = j;
				}
			}
			// 当退出for就找到这次的最小值
			if (i != minIndex) {
				temp = arr[i];
				arr[i] = arr[minIndex];
				arr[minIndex] = temp;
			}
		}
	}
}

插入排序的代码

思想:从第二个数开始,如果当前数小于前一个数,当前数和前一个数交换,直到循环结束。

public class TestInsertSort {
	public static void sort(int arr[]) {
		int i, j;
		for (i = 1; i < arr.length; i++) {
			int temp = arr[i];
			for (j = i; j > 0 && temp < arr[j - 1]; j--) {
				arr[j] = arr[j - 1];
			}
			arr[j] = temp;
	}
}

可变参数的作用和特点

总结1:可变参数

1.可变参数的形式 …

2.可变参数只能是方法的形参

3.可变参数对应的实参可以0,1,2…个,也可以是一个数组

4.在可变参数的方法中,将可变参数当做数组来处理

5.可变参数最多有一个,只能是最后一个

6.可变参数好处:方便 简单 减少重载方法的数量

7.如果定义了可变参数的方法,不允许同时定义相同类型数组参数的方法

总结2:数组做形参和可变参数做形参联系和区别

联系:

1.实参都可以是数组;2.方法体中,可变参数当做数组来处理

区别:

1.个数不同 可变参数只能有一个数组参数可以多个

2.位置不同 可变参数只能是最后一个数组参数,位置任意

3.实参不同 可变参数实参可以0,1,2…个,也可以是一个数组,数组的实参只能是数组

### 关于ArcGIS License Server无法启动的解决方案 当遇到ArcGIS License Server无法启动的情况,可以从以下几个方面排查并解决问题: #### 1. **检查网络配置** 确保License Server所在的计算机能够被其他客户端正常访问。如果是在局域网环境中部署了ArcGIS Server Local,则需要确认该环境下的网络设置是否允许远程连接AO组件[^1]。 #### 2. **验证服务状态** 检查ArcGIS Server Object Manager (SOM) 的运行情况。通常情况下,在Host SOM机器上需将此服务更改为由本地系统账户登录,并重启相关服务来恢复其正常工作流程[^2]。 #### 3. **审查日志文件** 查看ArcGIS License Manager的日志记录,寻找任何可能指示错误原因的信息。这些日志可以帮助识别具体是什么阻止了许可服务器的成功初始化。 #### 4. **权限问题** 确认用于启动ArcGIS License Server的服务账号具有足够的权限执行所需操作。这包括但不限于读取/写入特定目录的权利以及与其他必要进程通信的能力。 #### 5. **软件版本兼容性** 保证所使用的ArcGIS产品及其依赖项之间存在良好的版本匹配度。不一致可能会导致意外行为完全失败激活license server的功能。 #### 示例代码片段:修改服务登录身份 以下是更改Windows服务登录凭据的一个简单PowerShell脚本例子: ```powershell $serviceName = "ArcGISServerObjectManager" $newUsername = ".\LocalSystemUser" # 替换为实际用户名 $newPassword = ConvertTo-SecureString "" -AsPlainText -Force Set-Service -Name $serviceName -StartupType Automatic New-ServiceCredential -ServiceName $serviceName -Account $newUsername -Password $newPassword Restart-Service -Name $serviceName ``` 上述脚本仅作为示范用途,请依据实际情况调整参数值后再实施。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值