一、Java基础知识
一、概述
Java是1995年Sun公司发布,如今被Oracle收购
下载安装Java时从Oracle官网下载,最好下载LTS长期维护版本。
Java8,Java11,Java17
Java是一门半编译半解释的面向对象语言
由于Java虚拟机JVM的存在,可以全平台运行。
1、Java历史
Oak(橡树)语言,由Green开发团队开发,主要用于微型嵌入式设备编程,第一次提出了开源协议
Java之父 詹姆斯.高斯林
经历过Sun公司接手之后,最终由Oracle收购,1995年语言更名为Java,正式发布JDK1.0
2、Java的分类
1996年 Java(此时JDK1.2)应对发展需求,分为三个重要方向:
J2SE: Java标准语法(这是学习Java开发体系的必备基础)
J2ME: 微型嵌入式领域的编程(例如:塞班系统应用,但后来并没有普及)
J2EE: 企业级开发(使用Java语言开发服务器)
3、JDK安装
进入JDK的官网 :https://www.oracle.com/
搜索框输入java
![](https://img-blog.csdnimg.cn/img_convert/d4102aba1e7b428e3253931839309e31.png)
找到JDK11 的下载地址
![](https://img-blog.csdnimg.cn/img_convert/cd5eda7d32349270895d8f21792ea5b4.png)
![](https://img-blog.csdnimg.cn/img_convert/ddc7f9ad7b43e044578f4821b983170f.png)
选中对应的系统以及下载版本 (如果没有Oracle账户需要注册)
阿里云网盘下载:jdk-11.0.18_windows-x64_bin.exehttps://www.aliyundrive.com/s/FGCFrS1HeW3提取码: 5nl4
![](https://img-blog.csdnimg.cn/img_convert/ad28ae8eb70d5e3fb01114311553c7e8.png)
下载完成后直接安装
安装后,在控制台查看是否安装成功(不会安装的可以自行搜教程!)
WIN + R 键启动运行窗口
![](https://img-blog.csdnimg.cn/img_convert/567f9c2aa7e1befa36646462c7b7cbbf.png)
在命令提示符窗口中输入java -version
![](https://img-blog.csdnimg.cn/img_convert/00f2cd4ab2c9e66f2891ec9b6f758a3b.png)
说明已经安装成功了
4、JDK卸载
1、在windows搜索中,找到控制面板
![](https://img-blog.csdnimg.cn/img_convert/1897729a4ee3ca8d068b1fe43503a9d6.png)
双击打开控制面板,在右上角启用类别,选择程序中的卸载程序选项
![](https://img-blog.csdnimg.cn/img_convert/dc59c5afaad02f6c59cb6c9d4c86cf13.png)
3、在卸载程序页面中查看需要卸载的JDK文件,并双击
![](https://img-blog.csdnimg.cn/img_convert/46959935527c1b1b0863eabee10fbd00.png)
卸载完成后可以查看安装路径,是否卸载干净。
5、IDEA下载
6、认识JetBrains
2、目前在世界上的主流开发软件:IDEA、WebStorm、PyCharm
3、特点:
智能的代码提示功能(就像我们使用的输入法)
最新的开发支持(github、框架、辅助插件、代码测试...)
代码的自动保存(不需要程序员频繁Ctrl + S)
7、安装IDEA
1、下载最新版本的idea:IntelliJ IDEA – 领先的 Java 和 Kotlin IDE (jetbrains.com.cn)
2、下载完成后,直接安装IDEA即可。
IDEA环境认识
1、顶部
![](https://img-blog.csdnimg.cn/img_convert/ce620c428624b950a0dec66749917061.png)
File
点击File后会打开菜单
![](https://img-blog.csdnimg.cn/img_convert/a28c332c465cd9b54d66bbdab7d3581c.png)
New :新建内容(文件、文件夹、项目等)
Open :打开指定文件或者指定的目录
Open Recent:打开最近打开过的文件或者目录
Close Project:关闭当前项目窗口
Settings:设置整个IDEA的环境
Project Structure:设置项目
SaveAll:保存所有内容
Exit 退出IDEA
View
查看IDEA环境中的视图设置
Code
对Code进行分析和管理
Refactor
对文件进行重命名、移动、复制
Build
对文件进行构建
Run
运行文件 或者 开启DEBUG模式
Tools
内部或者外部工具的使用
Git
对代码进行git分布式管理
Window
窗口工具
Help
帮助
2、底部
![](https://img-blog.csdnimg.cn/img_convert/bff7cb6cf0ab8bbdb255f0b778e5c6ea.png)
TODO:展示需要去做的任务
Problems:项目中出现的问题
Git:分布式托管
Terminal:控制台
Profiler:性能测试平台
Run:运行后的结果展示
二、JDK
JDK 全称是 Java Development Kits 的缩写,翻译过来为Java开发工具包
在JDK中有运行.java文件的虚拟机(解释器)
知识点:
1、java的源文件 开发文件是以什么方式结尾 .java
2、虚拟机 解析.java文件
我们接下来一一解答以下问题:
1、什么是虚拟机
指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统
比如:我们在电脑中用的手机模拟器,就是一个由软件模拟的虚拟机
在Java中的虚拟机,是指的专门为了解析.java文件存在的一种软件
虚拟机,英文为 Virtual Machine,而Java虚拟机被人成为JVM(即Java Virtual Machine)
2、JDK中除了虚拟机还有哪些内容
JRE: Java Runtime Envirment (Java运行时环境 ,运行.java文件的核心内容)
JDK: 包含JRE,JRE中有JVM。
3、虚拟机运行.java文件的原理
Java11 之前
java命令:将.java文件编译成.class文件(这里的.class为字节码文件,机器是无法识别的)
javac命令:将.class文件解释成对应的二进制命令。
Java11 后
java命令:将.java文件直接解释成对应的二进制命令
所以我们既可以说Java是一门编译解释语言,也可以说是一门解释语言。
(区别与编译语言)
4、什么是解释型语言
首先要了解两个概念:编译语言、解释语言
1、编译语言是指定文件,编译到指定位置,生成指定的二进制文件,特点:效率高、速度快 (C语言)
2、解释语言是指定文件,解释到任何位置,生成指定的二进制文件,特点:跨平台性好
三、第一个Java程序
public class Main {
public static void main(String[] args) {
System.out.println("Hello world");
}
}
四、Java程序的运行流程
编辑.java源文件——javac命令编译——》生产.class文件——》java命令由JVM解释运行
![](https://img-blog.csdnimg.cn/img_convert/d9de9213af76101e0caef7762f810e6f.png)
五、Java程序中的注意事项
要写代码,必须想创建class,class称为类,是一个java程序的基本组成单位
每个能够运行的java程序,有且只有一个main方法,称为主方法/入口函数,是程序的启动
符号
Java中的符号全部都是英文状态下的符号,可以在输入法中设置中文状态使用英文标点
“{}”必须成对出现。用于定义类、定义方法和定义代码块
“[]”必须成对出现。用于定义数组、使用数组
“()”必须成对出现。用于表示方法的参数
“空格”用于分割关键字和代码。可以是一个空格,也可以是多个
“.”用于调用某个类或对象的属性和方法
“;”用于表示一句代码的结束,大括号后不需要加分号
换行和缩进
在每出现一次大括号时,就要进行一次缩进
六、Java程序中的注释
注释可以对代码进行解释说明或屏蔽不用的代码。 编译时无视注释,注释分为
单行注释 快捷键:ctrl + /
//Hello World
多行注释 快捷键:ctrl + shift + /
/*
Hello World
Hello World1
Hello World2
*/
文档注释
/**
* 文档注释
* 通常用于解释整个java类或某个方法或某个变量,
* 最终可以通过java命令自动生成文档
*/
七、IDEA快捷键
ctrl+X 删除一行
ctrl+shift+f10 运行
ctrl+shift+方向键 移动选中的代码块
变量.sout 回车 快捷输出
ctrl+alt+L 调格式
条件 . if 快速生成if
IDEA在粘贴多行字符时自动转义符换行加拼接
八、Java语言的命名规则
驼峰命名法
如果用多个单词描述一个内容,除首字母外,其他单纯首字母大写。
如studentsName、empId
帕斯卡命名法
使用单词首字母去全部大写
九、Java中的标识符
Java中的英文、方法名和变量名称统称为标识符。
类名使用帕斯卡命名法
方法名和变量名使用驼峰命名法
命名时做到“见名知意”
十、Java中标识符的命名规则
标识符使用字母、数字、下划线和$组成
不能以数字开头
不能使用Java中的关键字(保留字)
例如:
类名 Test Person Animal Cat UserController StudentService
变量名 age lastName firstName
方法名 login() findEmpById(int id)
常量 COUNTRY_NAME
十一、Java数据类型
1、基本数据类型
数值类型:byte short int long float double
字符类型:char
布尔值类型:boolean (true,false)
注:String不是基本数据类型,是引用数据类型
基本数据类型的表示方式
![](https://img-blog.csdnimg.cn/img_convert/c2030e36db1fc7de671333b689b93636.png)
2、引用数据类型
十二、转义字符
\t
\n 换行
\"
\'
\b 退格
\r 回车
\\ 字符“\”
\0 null
十三、运算符优先级
![](https://img-blog.csdnimg.cn/img_convert/8469675b3cb7e6f551e0a91623854c06.png)
十四、原始类型之间的数据类型转换
隐式类型转换(自动)
整型数据可以直接保存到浮点型中
占用字节小的数据类型的变量,可以直接保持到占用字节大数据类型的变量中
short s=123;
int i=s;
显示类型转换
占用字节大的数据类型的变量,默认无法保持到占用字节小的数据类型的变量中,
如果要强制保存,需要强制类型转换。
语法:(目标类型)带转换的变量
int number=123;
byte a=(byte)number;//未超出范围,结果无误
byte a=(byte)128;//超出范围,溢出-128
十五、引用类型
类
接口
数组
十六、变量
变量
在内存中的一块区域。由于这块区域终端数据可以发送变化,所以称为变量。
内存中的变量,相当于酒店中的房间。房间的类型就是变量的类型,房间的房号就是变量的名称,房间中住的人就是变量的值。
定义变量,就是在内存中申请一块想要数据类型的空间,并对其命名的过程。
定义变量
语法:数据类型 变量名;
如果要同时定义多个相同类型的变量,可以: 数据类型 变量名1, 变量名2.。。;
例如:
//年龄
int age=18;
//年月日
int year;
int month;
int day;
//利率
double interestRate;
//电话号码
String phoneNumber;
变量赋值
语法:变量名 = 值;
int i;
i=10;
变量初始化
语法:数据类型 变量名 = 值;
如果在定义变量的时候能确定其中保存的数据,可以直接在定义变量的时候赋值。
将定义变量和给变量赋值
int i =0;
变量注意事项
在一对大括号中变量只能出现一次
给变量赋值是,赋值符号“=”左边通常是一个变量名,右边可以是一个具体值也可以是另一个赋了值的变量名(不超出其范围),再可以是一个表达式(不超出其范围)。
如果同时定义多个类型系统的变量,可以只写一个数据类型
必须以字母、下划线、或者美元符$开头;以美元符$ 开头命名的变量虽然能够编译通过但是不建议使用;
中文也可以作为命名开头且编译也能通过,但是不建议使用。
除开头外后面的部分可以有字母、下划线、美元符$以及数字组成;
虽然变量名不限制长度,但能表达清楚命名的含义即可;
变量名不可以和java的关键字冲突;
再命名中大小写是又区别的,即使由同一个单词命名但是有个别字母的大小写的区别,产生的就是两个不同的变量。
int a=1,b=2,c=3;
十七、运算符
算术运算符
需要两个操作数参与,如果由浮点数参与运算,结果为浮点型。
符号 | 作用 | 说明 |
+ | 加 | 如果两个操作数都是数值型的数据,+用于计算。如果两个操作数有一端是字符串,+用于拼接字符串。 |
- | 减 | 只能用于数值型数据。 |
* | 乘 | 只能用于数值型数据。 |
/ | 除 | 只能用于数值型数据。如果两个整数相除,结果只保留整数部分(商)。 |
% | 模(取余) | 只能用于数值型数据。商一定是整数。 |
注意
如果同时多个符号一起使用,遵循数学中的四则运算规则,先乘除,后加减
运算时最终结果的数据类型,以所以参与运算的操作数中所占字节最大的类型为准
关系运算符
需要两个操作数参与
符号 | 作用 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
!= | 不等于 |
== | 等于 |
注意
==用于判断相等,=用于赋值
==用于比较两个原始类型的值或引用类型的内存地址
关系运算的结果为true/false
逻辑运算符
符号 | 作用 | 说明 |
&& | and与 | 符号两端需要两个表达式,判断如果都为true,整体结果则为true,如果有一段姐夫哦为false整体结果为false。 |
|| | or或 | 符号垄断需要两个表达式,判断如果都为false,整体结果则为false,如果有一端结果为true,整体结果为true。 |
! | not非 | 是一个弹幕运算符,只有一个表达式参与运算。“!表达式”不是对原表达式的结果取相反值。 |
补充:位运算符
符号 | 作用 |
& | 按位与。计算的结果与&&相同,但过程不同。符号两端的表示都会执行判断。 |
| | 按位或。计算的结果与||相同,但过程不同。符号两端的不是都会执行判断。 |
^ | 按位异或。将操作数转换为二进制后,按位比较,如果相同结果为0,不同结果为1,最终二进制结果转换为十进制。 |
>> | 按位右移。将第一个操作数转换为二进制后,向右移第二个这才是对于的位数,再将结果装换位十进制。 |
<< | 按位左移。 |
赋值和复合赋值运算符
符号 | 作用 |
= | 赋值运算符。将符号右侧的内容赋值给符号左侧的变量。 |
+= | 复合赋值运算符。i+=3;相当于i=i+3; |
-= | i-=1; == |
*= | |
/= | |
%= |
注意
复合赋值运算的流程是:
将符号两端的整体进行对应的算数运算后,将结果赋值给符号左侧的变量中。
自增自减运算符
只有一个操作数参与运算,称为单目运算符
符号 | 作用 |
++ | 将结果加一 |
– | 将结果减一 |
注意
a++或++a相当于a+=1或a=a+1。–同理
如果++或–独立成行使用,无论符号在前在后,都将结果+1或-1
如果++或–不是单独成行
符号在前,先+1或-1计算后在使用值
符号在后,先使用值后在+1或–1计算
条件运算符
三目运算符,有三个操作数参与。是一个简化版的双分支条件语句。
表达式1?表达式2:表达式3
首先运算表达式1,如果结果为true,执行问号后的表达式2; 如果结果为false,执行冒号后的表达式3。 整个表达式的最终结果为表达式2或表达3。
十八、条件语句
if语句
单分支if语句
如果一件事情满足则执行
if(判断条件){//布尔值
执行代码
}
双分支(if...else)
if(){
}else{
}
多分支if...else if....else
if(){
}else if(){
}else if(){
}else{
}
if嵌套
if(){
if(){
}
}
switch语句
如果一个变量的值能够列举出时,使用switch语句更为简洁。
switch(变量){
case 1:
break;
case 2:
break;
case 3:
break;
default:
break;
}
注意:
1、switch括号中一般是变量,变量需要指定特殊的数据类型(byte short int char String(Character))
2、switch不可以设置的类型有:long,double,float
3、有无break的情况(break 跳出(停止)switch语句),没有break情况,程序会继续往后执行。
4、关于if语句与switch的区别:switch不能判断范围条件.
5、default 除了case之外的其他条件,(default为了程序健壮性)
十九、循环
while
while(循环条件){//小括号中的条件结果为boolean值
满足循环条件时重复执行的代码
}
执行流程 先执行小括号中的内容,如果结果为true,执行大括号中的内容,再循环执行小括号中的内容,判断如 果为false则停止循环。
while循环有可能一次都不执行。
do-while
do{
满足循环条件时重复执行的代码
}while(循环条件);
执行流程 先执行一次do大括号中的内容,再判断while小括号中的内容,如果成立,再次执行do大括号中的内 容,如果不成立,停止循环。
do-while循环至少执行一次
for
//表达式1为定义循环变量
//表达式2为判断循环条件
//表达式3为更新循环变量
for(表达式1;表达式2;表达式3){
循环体
}
执行流程 首先执行表达式1,再执行表达式2,如果表达式2的结果为true,执行循环体,再执行表达式3,再执行 表达式2判断,如果表达式2的结果为false,结束循环
for循环特殊情况
//for循环特殊情况
//可以使用外部定义的循环变量
int i = 0;
for (;i<=10;i += 2) {
System.out.println(i);
}
//可以在循环体重更新循环变量
int i = 0;
for (;i<=10;) {
System.out.println(i);
i += 2;
}
//两个分号必不可少,如果都不写表达式,是一个死循环
int i = 0;
for (; ; ) {
if (i > 10) {
break;
}
System.out.println(i);
i += 2;
}
break
break是停止循环后,继续执行循环之外的内容。
continue
在循环语句中,使用continue,可以停止本次循环,不再执行continue之后的代码,直接进行下一次循环。
循环总结
如果已知循环次数,推荐使用for循环。如遍历数组、集合等。
如果未知循环次数,推荐使用while循环。 while循环和for循环可以相互转换
do-while循环至少执行一次,for循环和while循环有可能一次都不执行
循环嵌套
如果一个重复的过程还需要将其整体重复执行时,可以使用循环嵌套。
如循环判断密码是否输入正确,正确后循环打印功能菜单。
循环嵌套就是循环一个循环。
//用*打印矩形
//将循环一行这件事再循环5次
for (int n = 1; n <= 5; n++) {
//循环打印一行
for (int i = 1; i <= 10; i++) {
System.out.print("*");
}
System.out.println();
}
二十、数组
1、概念
一组类型相同的数据的有序集合。
2、定义
1、简单定:义将一类数据方到一个整体中
2、专业定义:将数据类型相同的数据,放到一个集合中
3、数组的定义方式
静态初始化 :在构建数组时就给予初始化的值
数组类型: 数据类型[]、变量[]
数组初始化 {数组元素,数组元素,....}
int[] a = {1,2,3};//1、数组有3个元素长度 2,里面的元素有哪些
int b[] = {1,2,3};
2.动态初始化:先构建数组的对象,然后在逐一赋值初始化
基本格式: 数据类型[] 变量名 = new 数据类型[数组的长度]
int[] c = new int[3];//1、数组有多长
注意:数组的类型决定了元素是什么样的类型
3.定义数组的同时初始化
语法:数据类型[] = new 数据类型[数据大小];
double[] = new double[10];
4、数组元素
int[] a = {1,2,3};
//取出指定的数组元素:
// 数组元素都具有下标值,下标值从0开始
// 例如:数组a下标为1的元素是”2“
// 通过”数组变量[下标值]“将数组元素取出
System.out.println(a[1]);
//取不到”下标不存在“的值,报运行错误.
System.out.println(a[4]);
可以通过循环给数组赋值和读取元素
//定义一个数组保存同学的姓名,循环接收后打印所有。
Scanner sc = new Scanner(System.in);
//定义数组
String[] stuName = new String[3];
//循环赋值
for (int i = 0; i < 3; i++) {
System.out.println("请输入第"+(i+1)+"位同学的姓名");
stuName[i] = sc.next();
}
//循环读取
System.out.println("当前学生列表");
for (int i = 0; i < stuName.length; i++) {//通过“数组名.length”获取数组的长度
System.out.print(stuName[i]+"\t");
}
//增强for循环 for(数据类型 变量名 : 数组或集合){}
for (String name : stuName) {
System.out.print(name + "\t");
}
System.out.println()
对指定下标的数组元素赋值,可以直接修改该数组
int[] a = {1,2,3};
a[1] = 4;
5、遍历数组
1、可以通过length这个属性(变量)获取数组的长度
int[] a = {1,2,3};
for(int i = 0; i < a.length; i++ ){//0~2
System.out.println(a[i]);
}
//取出数组中的最后一个元素
System.out.println(a[a.length - 1]);
2、将数组内容全部输出到打印语句
// 工具类 Arrays (java.util.Arrays)
System.out.println(Arrays.toString(a));
题目:
控制输入对应的n值,创建一个n长度的随机数数组
数组元素不能重复
public static void main(String[] args) {
int[] rands = new int[20];
for(int i = 1; i <= 20; i++){
rands[i - 1] = i;
}
int[] arr = new int[10];
for(int i = 0; i < arr.length; i++){
//随机下标
int n = (int)(Math.random() * rands.length);
if(rands[n] != 0){
arr[i] = rands[n];
rands[n] = 0;
}else{
i--;
}
}
System.out.println(Arrays.toString(arr));
}
}
6、数组复制
public static void main(String[] args) {
int[] a = {1,2,3,4,5,6};
//问:如实现数组复制 从哪里开始复制(start),到哪里停止复制(end)
// 数组 ===> 新的数组 (数组长度要确认) length = end - start + 1
int start = 2;
int end = 3;
int[] b = new int[end-start+1];
int m = 0;//b数组的下标
for(int i = 0; i < a.length; i++){
if(i >= start && i <= end){
b[m] = a[i];
m++;
}
}
System.out.println(Arrays.toString(b));
数组复制 System.arraycopy
System.arraycopy(src,srcPos,dest,destPos,length)
src : 被复制的数组(从哪个数组复制)
srcPos : 从src的哪个下标开始复制
dest : 粘贴到的数组
destPos : 从dest的哪个下标开始粘贴
length : 复制的数据元素的长度
int[] c = {7,8,9,10,11,12};
System.arraycopy(a,2,c,2,2);
System.out.println("c数组:" + Arrays.toString(c));
System.out.println("a数组:" + Arrays.toString(a));
问:如果要将一个数组完整的复制给另一个数组
public static void main(String[] args) {
int[] a = {1,2,3,4,5,6};
int[] c = {7,8,9,10,11,12};
System.arraycopy(a,0,c,0,a.length);
7、数组扩容
注意:数组本身在定义之后,不可以增减长度
public static void main(String[] args) {
//注意:数组本身在定义之后,不可以增减长度
int[] a = {1,2,3};
//在a数组中添加一个为4的元素
//System.arraycopy
int[] b = new int[a.length + 1];
System.arraycopy(a,0,b,0,a.length);
b[3] = 4;
System.out.println(Arrays.toString(b));
a = b; //引用地址的赋值。
//double[] c = new double[3];
//c = a;//数组能够赋值,是因为有相同的数组类型,类型不同就不能相互赋值。
System.out.println(Arrays.toString(a));
数组阔容的办法
Arrays.copyOf(src,length)
src:需要扩容的数组
length:扩容的长度
int[] c = {1,2,3};
c = Arrays.copyOf(c,4);
c = Arrays.copyOf(c,2);
System.out.println(Arrays.toString(c));
//比较地址是不是同一个
System.out.println(c == Arrays.copyOf(c,2));
8、冒泡排序
数组中每相邻的两个元素进行比较,如果不满足排序的规则,交换位置。
int[] num = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
//长度-1轮
for (int i = 0; i < num.length - 1; i++) {
//一轮交换12次
for (int i1 = 0; i1 < num.length - 1; i1++) {
//交换
int tem = 0;
if (num[i1] > num[i1 + 1]) {
tem = num[i1 + 1];
num[i1 + 1] = num[i1];
num[i1] = tem;
}
}
//输出
System.out.print((i + 1) + "轮");
for (int a : num) {
System.out.print(a + " ");
}
//每轮换行
System.out.println();
}
9、生成一个20长度的随机数数组 分成一个奇数数组 偶数数组
方式一:使用扩容方式实现奇偶数组分离
public static void main(String[] args) {
for(int i = 0; i < a.length; i++){
if(a[i] % 2 == 0){//偶数
even = Arrays.copyOf(even,even.length + 1);
even[even.length - 1] = a[i];
}else{//奇数
odd = Arrays.copyOf(odd,odd.length + 1);
odd[odd.length - 1] = a[i];
}
}
System.out.println("偶数数组:" + Arrays.toString(even));
System.out.println("奇数数组:" + Arrays.toString(odd));
方式二:特殊的排序方式
public static void main(String[] args) {
for(int j = 0; j < a.length - 1; j++){
for(int i = 0; i < a.length - 1; i++){
if(a[i] % 2 == 0 && a[i+1] % 2 == 1){
int tmp;
tmp = a[i];
a[i] = a[i+1];
a[i+1] = tmp;
}
}
}
System.out.println(Arrays.toString(a));
System.out.println("偶数数组:" + Arrays.toString(even));
System.out.println("奇数数组:" + Arrays.toString(odd));
10、排序函数
public static void main(String[] args) {
int[] a = {5,4,3,2,1};
Arrays.sort(a);//从小到大的排序
System.out.println(Arrays.toString(a));
}
11、问题 ["红","蓝","绿","蓝","红","绿"] 按照:' 绿 < 蓝 < 红 '的规则排序
public static void main(String[] args) {
//问题 ["红","蓝","绿","蓝","红","绿"]
// 按照:' 绿 < 蓝 < 红 '的规则排序
String[] b = {"红","蓝","绿","蓝","红","绿"};
for(int j = 0; j < b.length - 1; j++){
for(int i = 0; i < b.length - 1; i++){
if(b[i] == "蓝" && b[i+1] == "绿" || b[i] == "红" && b[i+1] == "蓝"|| b[i] == "红" && b[i+1] == "绿" ){
String tmp;
tmp = b[i];
b[i] = b[i+1];
b[i+1] = tmp;
}
}
}
System.out.println(Arrays.toString(b));
12、打印如下菜单
请选择功能:
1:注册
2:登录
3:退出
输入:1
进入注册功能
/**
* 请选择功能:
* 1:注册
* 2:登录
* 3:退出
* 输入:1
* 进入注册功能
*/
System.out.println("请选择功能:\n" +
"1:注册\n" +
"2:登录\n" +
"3:退出\n");
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
switch (a){
case 1:
System.out.println("进入注册界面");
break;
case 2:
System.out.println("进入登录页面");
break;
case 3:
System.out.println("您已退出");
break;
}
13、有一排学生,按照(1-100)分别给与编码.现在从1开始报数,叫到7的同学被踢出队列然后继续报数,直到最后一个同学(求最后一个同学的编号)
public static void main(String[] args) {
//对学生进行编号
int[] student = new int[100];
for (int i = 0; i < student.length; i++) {
student[i] = i + 1;
}
//System.out.println(Arrays.toString(student));
int num = 100;
int count = 1;
while (num > 1) {
for (int i = 0; i < 100; i++) {
if (student[i] == 0) {//3
continue;
}
//当遍历到7时,把7换成0,然后整个数num-1
if (count % 7 == 0) { //2
student[i] = 0;
num--;
}
count++;//1
}
}
for (int i = 0; i < student.length; i++) {
if (student[i] != 0) {
System.out.println("剩余的那个人原来的位置时" + student[i]);
System.out.println(Arrays.toString(student));
}
}
}
14、打印出杨辉三角
public static void main(String[] args) {
Scanner scann = new Scanner(System.in);
System.out.println("请输入杨辉三角的层数:");
int n = scann.nextInt();
int[][] arr = new int[n][n];
for (int i = 0;i < n;i++){
for (int j = 0;j <=i;j++){
if (j == 0 || j == i){
arr[i][j] = 1;
System.out.print(1+"\t");
}else{
arr[i][j] = arr[i-1][j] + arr[i-1][j+1];
System.out.print(arr[i][j] + "\t");
}
}
System.out.println();
}
}
15、实现数组的翻转{1,2,3,4}——>{4,3,2,1}
public static void main(String[] args) {
int[] a = {1,2,3,4};
int temp = 0;
for (int start = 0,end = a.length - 1;start < end;start++,end--){
temp = a[start];
a[start] = a[end];
a[end] = temp;
}
System.out.println(Arrays.toString(a));
}
16、分解质因数 (质数:只能被1或者自身整除的数)
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入一个数:");
int x = scan.nextInt();
System.out.print(x + " = ");
int i = 2; //1不是质数
while (true){
if (x == i){
System.out.println(i);//如果相等的话,就说明这个数没有因数,只有1和它本身
break;
} else if (x % i == 0) {
System.out.print(i + " x ");
x = x / i;
}else {
i++;
}
}
}
17、判断输入的数是不是回文数
public static void main(String[] args) {
// 2、回文数(1000以内的所有回文数)
// * 回文数:数值对称 11 121 131 11211
Scanner scan = new Scanner(System.in);
System.out.println("请输入一个需要判断是不是回文数的数:");
int x = scan.nextInt();
//定义临时变量存输入的数
int input_num = x;
//定义一个变量存倒转的数
int dao_num = 0;
while (x != 0){
int num = x % 10;//取输入的整数的个位、十位、百位......
x = x / 10; //更新x的值
dao_num = dao_num *10 + num; //记录倒转过来的数
}
if (dao_num == input_num){
System.out.println(input_num+"是一个回文数!");
}else {
System.out.println(input_num+"不是一个回文数!");
}
}
18、水仙花数(求1000以内的所有水仙花数)
public static void main(String[] args) {
//3、水仙花数(求1000以内的所有水仙花数)
int ge,shi,bai,count = 0;
for (int i = 100;i <1000;i++){
ge = i % 10;
shi = i /10 %10;
bai = i / 100 % 10;
if (ge*ge*ge+shi*shi*shi+bai*bai*bai==i){
System.out.println(i);
count++;
}
}
System.out.println("1000以内的所有水仙花总数为:"+count);
}
19、ATM机程序
public static void main(String[] args) {
// 4、ATM机程序
// * 要求:1)进入程序时,提示功能选项 取款 存款 查询 退出
// * 2)模拟完成存款、取款、查询功能
// * 3)用户只要不退出就能一直操作
Scanner scan = new Scanner(System.in);
int count = 0;//存款
boolean exit = true;
while (exit){
System.out.println("*************ATM************");
System.out.println("请输入要选择的功能序号");
System.out.println("1、取款 2、存款 3、查询 4、退出");
System.out.println("****************************");
int function = scan.nextInt();
switch (function){
case 1:
//取款
System.out.println("请输入取款金额:");
int Withdrawal = scan.nextInt();//取款
if (count<100){
System.out.println("账户余额不足!");
System.out.println("取款失败!!");
}else {
count = count - Withdrawal;
System.out.println("取款成功!");
}
break;
case 2:
System.out.println("请输入存放的金额数:");
int deposit = scan.nextInt();
if (deposit<100){
System.out.println("请存入面值最少100的人民币!");
System.out.println("存款失败!请重新存放");
}else {
count = count + deposit;
System.out.println("存款成功!");
}
break;
case 3:
System.out.println("账户余额为:"+count+"元");
break;
case 4:
exit = false;
System.out.println("谢谢您的使用!");
break;
default:
System.out.println("选择的功能序号错误!请重新输入!");
break;
}
}
}
20、抛小球
以一个高度抛出小球,小球弹起高度的一半后,再次下落 当小球弹了n次,它距离地面的距离为多少。
public static void main(String[] args) {
// 5、抛小球
// * 以一个高度抛出小球,小球弹起高度的一半后,再次下落
// * 当小球弹了n次,它距离地面的距离为多少。
Scanner scan = new Scanner(System.in);
System.out.println("请输入小球的初始下落高度(米):");
double height = scan.nextDouble();
System.out.println("请输入小球弹的次数:");
int n = scan.nextInt();
double sum = 0;
int count = n;
for (;n>0;n--){
sum += height;
sum += height = height /2;//解决历程问题
}
System.out.println("当小球弹了"+count+"次时,"+"它距离地面:"+height+"米"+"经过了"+sum+"米");
}
【本阶段企业常见面试题】
在JAVA中,如何跳出当前多重嵌套循环?
方式一:通过break标签跳出多重循环
Java定义的标签一定要紧跟在循环前
同时标签名后是冒号:
loop1:
for(int i = 0;i < 10;i++){
loop2:
for(int j = 0;j < 10;j++){
if(/*某些条件*/){
break loop1;
}
//其他代码
}
}
方式二:break跳出
for(int i = 0;i < 10;i++){
for(int j = 0;j < 10;j++){
if(/*某些条件*/){
break;
}
//其他代码
}
}
JDK和JRE有什么区别?
JRE是java运行时环境,而JDK是java开发工具包,JDK包含JRE,但是JRE可以独立安装。
JDK:java development kit (java开发工具),JDK 是用于开发 Java 程序的最小环境。
JRE:java runtime environment (java运行时环境),是提供给 Java 程序运行的最小环境。
JRE包含了java虚拟机、java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。JDK是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。运行java程序只需安装JRE。如果需要编写java程序,需要安装JDK。
=、==、和equls的区别
a、=和equals ==的区别
=表示的是赋值,即将=右边的值赋给左边的变量。equals和==是表示操作
b、==和equals ==的区别
1. ==是运算符
2. equals是String对象的方法
一般有两种类型的比较
1. 基本数据类型的比较
2. 引用对象的比较
1. 基本数据类型的比较
==和equals都比较的是值是否相等,相等则为true,否则为false
2. 引用对象的比较
==和equals都是比较是栈内存中的地址是否相等,相等则为true,否则为false
注意:
1. String是一个特殊的引用数据类型,==比较的是字符串对象的引用地址是否一样,equals比较的是栈中的内容是否一致。
string是基础数据类型吗?基础的数据类型有哪些?
String不是基本数据类型,是引用类型。
基本数据类型有:
整型:byte(8位)、short(16位)、int(32位)、long(64位)
浮点型:float(32位)、double(64位)
字符型:char(16位)
布尔型:boolean(1位)
5、如何实现数组和List之间的转换?
一、数组转 List
1、使用Arrays.asList()方法
String[] arr = {"中国","美国","日本","韩国","法国"};
List<String> List = Arrays.asList(arr);
2、使用Collections.addAll()方法
该方法没有第一种方法高效,但是更加灵活。同样也是新建一个ArrayList,将数组的内容复制进去。
String[] strArray = {"中国", "美国", "日本", "韩国","英国", "法国", "德国"};
List<String> list = new ArrayList<String>();
Collections.addAll(list, strArray);
3、使用集合的addAll()方法
List list = new Arraylist();
list.addAll(Arrays.asList(list));
4、使用Spring框架将数组转换为List
CollectionUtils.arrayToList();
二、Java中将List类型转换为数组的方法
使用List.toArray()方法:
1)创建List接口的引用list,使该引用指向ArrayList的实例;将字符串“a”、"b"、"c"放入集合list中。
2)将集合list转换为数组,并输出数组中的元素。
//首先,创建List接口的引用list,使该引用指向ArrayList的实例;将字符串“a”、"b"、"c"放入集合list中,代码如下所示:
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
//然后,使用List接口提供的toArray方法将集合list转换为数组,代码如下所示:
String[] strArr = list.toArray(new String[] {});
System.out.println(Arrays.toString(strArr)); // [a,b,c]
2. list.toArray(T[] a);
输出指定类型的数组,输出的数组类型与括号中参数类型一致;
必须是包装类(String、Integer、Character等),不能是基本数据类型了(string、int、char);
// 创建数组时: int [ ] arr = new int [ ] {}; 使用的是基本数据类型
Integer[] ans2 = list.toArray(new Integer[list.size()]);
案例
// 创建一个list,并且对list赋值
List<Integer> list = new ArrayList<>();
for (int i = 1; i < 11; i++) {
list.add(i);
}
//方法一:
Object[] ans1 = list.toArray();
System.out.println("1:" + Arrays.toString(ans1));
// 方法二:
Integer[] ans2 = list.toArray(new Integer[list.size()]);
System.out.println("2:" + Arrays.toString(ans2));
1:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]