文章目录

  • 01 Java概述
    • 1、JAVA安装
    • 2、HelloWorld
    • 3、JAVA概述
      • 3.1 JAVA的发展
      • 3.2JAVA可以做什么
        • 3.2.1 JAVA SE
        • 3.2.2 JAVA ME
        • 3.2.3 JAVA EE
        • 3.2.4 总结
    • 4、JAVA跨平台的原理
    • 5、JDK与JRE
      • 5.1 JDK
      • 5.2 JRE
      • 5.3 Other
  • 02 基础语法
    • 1、注释
    • 2、关键字
    • 3、字面量
    • 4、变量
    • 5、计算机中的数据存储
      • 5.1 进制
      • 5.2 计算机为什么用二进制
      • 5.3 进制转换
        • 5.3.1 任意进制转十进制
        • 5.3.2 十进制转其他进制
      • 5.4 计算机的存储规则
        • 5.4.1 文字:数字、英文、汉字
        • 5.4.2 图片
        • 5.4.3 声音
    • 6、数据类型
    • 7、标识符
    • 8、键盘录入
    • 9、关于IDEA
      • 9.1 安装
      • 9.2 IDEA项目结构介绍
    • 10、运算符
      • 10.1 算数运算符
        • 10.1.1 隐式转换和强制转换
          • 10.1.1.1 隐式转换
          • 10.1.1.2 强制转换
        • 10.1.2 字符串和字符的加操作
      • 10.2 自增自减运算符
        • 10.2.1 单独使用时
        • 10.2.2 参与计算时
      • 10.3 赋值运算符
      • 10.4 关系运算符
      • 10.5 四种逻辑运算符 与 短路逻辑运算符
        • 10.5.1 四种逻辑运算符号
        • 10.5.2 短路逻辑运算符号
      • 10.6 三元运算符号
      • 10.7 运算符优先级
      • 10.8 其他运算符
    • 11、原码、反码、补码
      • 11.1 原码
      • 11.2 反码
      • 11.3 补码
    • 12、流程控制语句
      • 12.1 顺序结构
      • 12.2 分支结构
        • 12.2.1 if
        • 12.2.2 switch
      • 12.3 循环结构
    • 13、数组
      • 13.1 数组的概述及静态初始化
      • 13.2 数组的地址值和元素访问
      • 13.3 数组遍历
        • 13.3.1 基于for循环遍历
        • 13.3.2 基于for each遍历
        • 12.3.3 基于Arrays.toString()
      • 13.4 数组动态初始化
      • 13.5 数组常见问题
      • 13.6 数组的内存图
        • 13.6.1 Java的内存分配
        • 13.6.2 数组的内存图
        • 13.6.3 两个数组指向同一个空间的内存图
      • 13.7 二维数组
    • 14、方法
      • 14.1 方法的格式
        • 14.1.1 最简单的方法定义与调用
        • 14.1.2 带参数的方法定义和调用
        • 14.1.3 带返回值的方法的定义和调用
        • 14.1.4 小结
      • 14.2 方法的重载
      • 14.3 方法的内存
        • 14.3.1 方法调用的基本内存原理
        • 14.3.2 方法传递基本数据类型、引用数据类型的内存原理
      • 14.4 方法中值传递时的内存
    • 15、综合练习
      • 15.1 卖飞机
      • 15.2 找质数
      • 15.3 开发验证码
      • 15.4 数组元素的复制
      • 15.5 评委打分
  • 03 字符串
    • 1、String
      • 1.1 API
      • 1.2 String概述
      • 1.3 创建String对象的两种方式
      • 1.4 创建String对象时的内存变化
      • 1.5 字符串的比较
        • 1.5.1 情况一
        • 1.5.2 情况二
      • 1.6 小练习
        • 1.6.1 用户登录
        • 1.6.2 遍历字符串、统计字符次数、字符串拼接和反转
        • 1.6.3 金额转换
        • 1.6.4 手机号屏蔽
        • 1.6.5 敏感词替换
        • 1.6.6 身份证信息查看
    • 2、StringBuilder
      • 2.1 概述
      • 2.2 链式编程
      • 2.3 练习
    • 3、StringJoiner
      • 3.1 概述
      • 3.2 示例代码
    • 4、字符串原理
      • 4.1 字符串拼接的底层原理
        • 4.1.1 等号右边没有变量
        • 4.1.2 等号右边有变量
        • 4.1.3 JDK8字符串拼接的底层原理
      • 4.2 StringBuilder提高效率的原理图
      • 4.3 StringBuilder源码分析
    • 5、综合练习
  • 04 集合
    • 1、集合和数组的对比
    • 2、集合的基本使用
    • 3、集合练习

视频链接:Java入门-01-Java学习介绍

阿玮老师讲的是真的详细!!!

01 Java概述

1、JAVA安装

(此部分不做详细介绍)三步走:

  • 下载
  • 安装
  • 环境变量

1、下载

官网:Java Downloads | Oracle

2、安装

下载好exe文件,直接安装,无脑点击下一步即可。

之后验证是否安装成功,打开cmd,输入java -version进行测试

3、配置环境变量

  • 新建JAVA_HOME变量:用于说明JDK的安装目录
  • 修改系统环境变量Path,追加%JAVA_HOME%\bin

备注:如果不行的话,可以考虑直接用绝对路径

知识补充:

  • 了解JDK的安装目录

2、HelloWorld

  • javac:编译。javac是JDK提供的编译工具

  • java:运行。java是JDK提供的工具

public class HelloWorld {public static void main(String[] args) {System.out.println("Hello World!");}
}

3、JAVA概述

3.1 JAVA的发展

java版本更新比较快,其版本分为两种:

  • 过度版本
  • LST:长期支持版本,如JAVA8和JAVA11

3.2JAVA可以做什么

JAVA三大使用平台(JAVA的三大类)

  • JAVA SE
  • JAVA ME
  • JAVA EE

3.2.1 JAVA SE

3.2.2 JAVA ME

JAVA ME 已经没落了,但华为鸿蒙系统等还是可以用JAVA开发。

3.2.3 JAVA EE

服务器开发,JAVA就是天。

3.2.4 总结

4、JAVA跨平台的原理

5、JDK与JRE

5.1 JDK

JDK(Java Development kit,java开发工具包)由一下几部分构成

  • JVM:Java虚拟机,真正运行Java程序的地方
  • 核心类库
  • 开发工具

5.2 JRE

JRE是Java运行环境。

当我们已经写完代码编译好了,需要传给别人时,我们并不需要完整的JDK。

5.3 Other

临时拓展:06 Python面向对象与JAVA面向对象

说到面向对象(OOP:Object Oriented Programming)就要先说面向过程(Procedure-Oriented Programming)

  • 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

  • 面向对象是把整个需求按照特点、功能划分,将这些存在共性的部分封装成对象,创建对象不是为了完成某一个步骤,而是描述某个事物在解决问题的步骤中的行为。

编程的思想是非常重要的,编程只是一个工具。

02 基础语法

大纲:

  • JAVA入门
  • 小概念
  • Idea和运算符
  • 判断和循环
  • 方法
  • 数组
  • 斯坦福大学练习题

1、注释

注释内容不参与编译和运行

2、关键字

关键字:被Java赋予了特殊涵义的单词

总结:

3、字面量

4、变量

小练习:

题意:公交车问题,每一站会上下乘客,用变量去计算,并输出最后在终点站剩余的乘客

public class BusProblem{public static void main(String[] args){int count = 0;count = count + 1;System.out.println(count);count = count + 2 - 1;count = count + 1;System.out.println(count);}
}

输出展示:

1
3

5、计算机中的数据存储

本节通过了解文字、图片、声音在计算机中的存储形式,进而学习计算机中的数据存储

5.1 进制

示例代码:

public class PrintSystem{public static void main(String[] args){System.out.println(0b101);System.out.println(17);System.out.println(0761);System.out.println(0xabc);}
}

输出展示:

5
17
497
2748

补充:Java中print 和 println区别

区别是:print()输出完毕后不换行,而println()输出完毕后会换行,因此println()不输出任何东西时,就输出一个换行符。

5.2 计算机为什么用二进制

以前计算机采用打孔的形式(左图),只有有孔和无孔两个状态。这个形式现在依旧存在,当前常用的5V电路板中,我们将大于3.3V定义为1,小于3.3V定义为0。

5.3 进制转换

5.3.1 任意进制转十进制

任意进制转十进制公式:系数 * 基础的权次幂,相加

二进制转十进制有个快速转换法:8421快速转换法

  • 每一位二进制的1都代表一个固定值,那把每一位的1代表的十进制数加起来即可,示例如下:

5.3.2 十进制转其他进制

5.4 计算机的存储规则

计算机中,任何数据都是以二进制的形式存储的

5.4.1 文字:数字、英文、汉字

一、一个数字是怎么存储的?

以二进制的形式在计算机中存储。

二、那英文或者字符怎么存储呢?

三、那汉字怎么存储呢?

Unicode编码,万国码

5.4.2 图片

常见的三类图片:黑白图、灰度图、彩色图。

这里直接说彩色图了,如1080p的分辨率就是1920×1080,也就是显示1920×1080个像素点,而每个像素点可以基于光学三原色,也就是RGB值表示,R、G、B三个数值对应0~255的其中一个整数,进而我们可以用数字表示图片。

5.4.3 声音

声音数据可以用波形图表示,进而用数据表示

6、数据类型

JAVA语言的数据类型分为:基本数据类型、引用数据类型。本节我们只讲述前者。

基本数据类型:四类八种

定义bool类型数据时,用关键词boolean

注意事项:

1、long

定义long类型时需注意:

不加的话,终端会报错。

2、float与double

float需要加后缀,double不用

小结:

练习:输出老师信息

public class TeacherIntroduce{public static void main(String[] args){String name = "黑马程序员";System.out.println(name);int age = 18;System.out.println(age);char sex = '男';System.out.println(sex);double height = 180.1;System.out.println(height);boolean single = true;System.out.println(single);}
}

错误: 编码GBK的不可映射字符

javac 默认按照本机语言(GBK) 编译代码,而我们的代码是 utf-8 编码,所以会报错

这里提供三种解决方法:

  • 方法一:运行是指定编码格式 javac -encoding UTF-8 xxx.java
  • 方法二:更改java源文件编码格式
  • 方法三:删除中文

7、标识符

标识符:就是给类、方法、变量等起的名字

8、键盘录入

示例代码:

// 1、导包
import java.util.Scanner;public class ScannerDemo{public static void main(String[] args){// 2、创建对象,表示我们准备要用Scanner这个类Scanner port = new Scanner(System.in);System.out.print("请输入数字:");// 3、接收数据int i = port.nextInt();System.out.println(i);}
}

后续编程时需注意:我们定义的变量是int型,此时只能输入数字,其他的会报错

请输入数字:afsf
Exception in thread "main" java.util.InputMismatchExceptionat java.util.Scanner.throwFor(Unknown Source)at java.util.Scanner.next(Unknown Source)at java.util.Scanner.nextInt(Unknown Source)at java.util.Scanner.nextInt(Unknown Source)at ScannerDemo.main(ScannerDemo.java:10)

补充:

9、关于IDEA

9.1 安装

官网链接:https://www.jetbrains.com/idea/download/

视频教程:Java基础概念-12-idea的概述和下载安装

9.2 IDEA项目结构介绍

  • project:项目
  • module:模块
  • package:包
  • class:类

IDEA用法:Java基础概念-13-idea中的第一个代码

示例代码:

package day1.code;public class Hello {public static void main(String[] args){System.out.println("HelloWorld");}
}

10、运算符

什么是运算符?什么是表达式?

运算符种类:

  • 算数运算符
  • 自增自减运算符
  • 赋值运算符
  • 关系运算符
  • 逻辑运算符
  • 三元运算符
  • 运算符优先级

10.1 算数运算符

  • /

    • 注意,想得到小数,必须有浮点数参与运算
    • System.out.println(10 / 3); // 3
    • System.out.println(10.0 / 3); // 3.3333333333333335
    • System.out.println(10.0 / 3.0); // 3.3333333333333335
  • % 取余、取模

10.1.1 隐式转换和强制转换

数字进行运算时,数据类型不一样是不能运算的

类型转换分类

  • 隐式转换(自动类型提升):取值范围小 --> 取值范围大
  • 强制转换:取值范围大 --> 取值范围小
10.1.1.1 隐式转换

示例代码:

public class ArithmeticOperator01 {public static void main(String[] args) {int a = 10;double b = 10.1;double c = a + b;System.out.println(a + b);  // 20.1System.out.println(c);  // 20.1}
}

小练习:

小结:

10.1.1.2 强制转换

注意,超过范围结果会错误:

  • 程序不报错,但结果是错误的
int d = 300;
byte e = (byte) d;
System.out.println(e);  // 44

小练习:

注意,细节决定成败:

byte a1 = 10;byte a2 = 20;byte result1 = (byte) (a1 + a2); // 错误写法:byte result3 = (byte) a1 + (byte) a2;System.out.println(result1);  // 30byte b1 = 100;byte b2 = 100;byte result2 = (byte) (b1 + b2);  System.out.println(result2);  // -56 超出范围,结果错误

10.1.2 字符串和字符的加操作

一、字符串的加操作

小练习:

二、字符 + 数字

示例代码:

System.out.println(1 + 'a');  // 98

10.2 自增自减运算符

  • ++

10.2.1 单独使用时

无论放变量前面还是后面,结果一样,示例代码如下:

// 单独使用时,无论放变量前面还是后面,结果一样int temp = 10;temp++;System.out.println(temp);  // 11++temp;System.out.println(temp);  // 12// 不是单独使用时int temp2 = 10;System.out.println(temp2++);  // 10System.out.println(++temp2);  // 12

10.2.2 参与计算时

这里一定要小心,多观察下面的示例代码及结果,示例代码如下:

int t1 = 100;
int t2 = t1++;
System.out.println(t2);  // 100
System.out.println(t1);  // 101 注意t1自身也发生了变化int t3 = 100;
int t4 = ++t3;
System.out.println(t4);  // 101
System.out.println(t3);  // 101

10.3 赋值运算符

注意:

10.4 关系运算符

练习

输入两个整数(范围为1~10),分别代表1号和2号两个人的时髦程度,若1号大于2号则输出true,反之输出false。

import java.util.Scanner;public class ArithmeticOperator02 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入1号的时髦度: ");int fashion1 = sc.nextInt();System.out.println("请输入2号的时髦度: ");int fashion2 = sc.nextInt();boolean result = fashion1 > fashion2;System.out.println(result);}
}

示例结果:

请输入1号的时髦度:
4
请输入2号的时髦度:
3
true

10.5 四种逻辑运算符 与 短路逻辑运算符

10.5.1 四种逻辑运算符号

10.5.2 短路逻辑运算符号

应用:

  • 典型应用场景如我们登录QQ时,账号和密码均输入正确才能登录
  • 我们需要做两个判断,但如果账号已经错了,就不需要再去验证密码是否正确了
  • 这时候就可以用短路逻辑运算符。

10.6 三元运算符号

作用:可以进行判断,根据判断的结果得到不同的内容。

练习

利用三元运算符比较两个整数,相同则输出”相同“,不同则输出”不同“

import java.util.Scanner;public class ArithmeticOperator03 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int num1 = sc.nextInt();int num2 = sc.nextInt();System.out.println(num1 == num2 ? "相同" : "不同");}
}

10.7 运算符优先级

比较多,关键点:小括号优先所有。

10.8 其他运算符

例子:

11、原码、反码、补码

视频教程:运算符-12-多学一招原码反码补码

  • 原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负
  • 反码:正数的补码和反码是其本身,负数的反码是符号位保持不变,其余位置取反
  • 补码:正数的补码和反码是其本身,负数的补码是其在反码的基础上+1

11.1 原码

原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负

P: 为什么是8位数呢?

A:计算机中一个0或者一个1为一个比特位(bit),但一个bit表示的数太小了,所以我们将8个bit分成一组,称为一个字节(byte)。

这一点可能会有点晕,且看下文。

11.2 反码

下图中,-4 -1 = -5,如果你用原码,就回变成-3,与预期结果相反,如果用反码就没问题。

总结:

11.3 补码

12、流程控制语句

  • 循序结构
  • 分支结构
  • 循环结构

12.1 顺序结构

12.2 分支结构

12.2.1 if

if的三种格式:

12.2.2 switch

示例:

public class Main {public static void main(String[] args) {int option = 1;switch (option) {case 1:System.out.println("Selected 1");break;case 2:System.out.println("Selected 2");break;case 3:System.out.println("Selected 3");break;}}
}

switch语句还可以匹配字符串。字符串匹配时,是比较“内容相等”。例如:

public class Main {public static void main(String[] args) {String fruit = "apple";switch (fruit) {case "apple":System.out.println("Selected apple");break;case "pear":System.out.println("Selected pear");break;case "mango":System.out.println("Selected mango");break;default:System.out.println("No fruit selected");break;}}
}

switch其他知识点:

  • default的位置和省略
  • case穿透
  • switch新特性
  • switch和if第三种格式各自的使用场景

一、default的位置和省略

二、case穿透

三、switch新特性

特性一:JDK12及之后,switch可以简化写法,不用写那么多break了

特性二:switch的结果可以赋值给变量。此特性暂不详述。

12.3 循环结构

分类:

  • for
  • while
  • do…while

其他:

  • 无限循环
  • 跳转控制语句

13、数组

  • 数组介绍
  • 数组的定义与静态初始化
  • 数组元素访问
  • 数组遍历
  • 数组动态初始化
  • 数组内存图
  • 数组常见问题
  • 数组常见操作

13.1 数组的概述及静态初始化

什么是数组?

数组的定义:

  • 格式一:数据类型[] 数组名 ,例如:int[] array
  • 格式二:数据类型 数组名[] ,例如:int array[]

静态初始化:

13.2 数组的地址值和元素访问

地址值:

元素访问:利用索引对数组中的元素进行访问

13.3 数组遍历

三种方式:

  • 遍历数组可以使用for循环,for循环可以访问数组索引
  • for each循环直接迭代每个数组元素,但无法获取索引;
  • 使用Arrays.toString()可以快速获取数组内容。

13.3.1 基于for循环遍历

通过for循环就可以遍历数组。因为数组的每个元素都可以通过索引来访问。

public class Main {public static void main(String[] args) {int[] ns = { 1, 4, 9, 16, 25 };for (int i=0; i<ns.length; i++) {int n = ns[i];System.out.println(n);}}
}

13.3.2 基于for each遍历

第二种方式是使用for each循环,直接迭代数组的每个元素:

public class Main {public static void main(String[] args) {int[] ns = { 1, 4, 9, 16, 25 };for (int n : ns) {System.out.println(n);}}
}

12.3.3 基于Arrays.toString()

Java标准库提供了Arrays.toString(),可以快速打印数组内容:

import java.util.Arrays;public class Main {public static void main(String[] args) {int[] ns = { 1, 1, 2, 3, 5, 8 };System.out.println(Arrays.toString(ns));}
}

13.4 数组动态初始化

动态初始化:初始化时只指定数组长度,由系统为数组分配初始值

  • 格式:数据类型[] 数组名 = new 数据类型[数组长度]
  • 范例: int[] arr = new int[5]

13.5 数组常见问题

索引越界异常

  • 原因:访问了不存在的索引

数组小练习:

一、求一个数组中的最大值并打印

示例代码:

public class ArrayExercise {public static void main(String[] args) {// int[] arr = new int[5]int[] arr = {14, 32, 12, 9, 15};int temp = arr[0];for(int a:arr){if(temp < a){temp = a;}}System.out.println("The maximum value in the array is : ");System.out.println(temp);}
}

13.6 数组的内存图

13.6.1 Java的内存分配

我们主要了解栈和堆两个概念:

13.6.2 数组的内存图

注意:arr2虽然没使用new关键字,但本质上是使用了的,他依旧会在堆内存中开辟空间

13.6.3 两个数组指向同一个空间的内存图

13.7 二维数组

14、方法

  • 什么是方法?
  • 方法的格式
  • 方法的重载
  • 方法的内存

方法(method)是程序中最小的执行单元

14.1 方法的格式

  • 最简单的方法定义与调用
  • 带参数的方法定义和调用
  • 带返回值的方法的定义和调用

总结:

  • 方法其实只有这一种格式
修饰符 返回值类型 方法名(参数类型 参数名){...方法体...return 返回值;
}

14.1.1 最简单的方法定义与调用

格式:

public static void 方法名(){方法体
}

示例代码:

public class MethodExercise1 {public static void main(String[] args) {HelloWorld();}public static void HelloWorld(){System.out.println("HelloWorld");}
}

14.1.2 带参数的方法定义和调用

示例代码:

public class MethodExercise2 {public static void main(String[] args) {Add(10, 20);}public static void Add(int a, int b) {System.out.println(a + b);}
}

14.1.3 带返回值的方法的定义和调用

格式:

修饰符 返回值类型 方法名(参数类型 参数名){...方法体...return 返回值;
}

示例代码:

public class MethodExercise3 {public static void main(String[] args) {int result;result = Add(10, 20);System.out.println(result);}public static int Add(int a, int b) {int c = a + b;return c;}
}

14.1.4 小结

方法其实只有这一种格式

修饰符 返回值类型 方法名(参数类型 参数名){...方法体...return 返回值;
}

注意:

14.2 方法的重载

看一个需求:

我们定义一个方法用于求变量之和,虽然功能相同,但由于参数不同,我们写了一堆函数,每个函数名不同,用于区分

这样非常不方便记忆,那么是否可以将这些函数都用一个名字呢

示例:

public class MethodExercise4 {public static void main(String[] args) {int result1 = GetSum(10, 20);System.out.println(result1);double result2 = GetSum(10.1, 20.2, 30.3);System.out.println(result2);byte result3 = GetSum((byte) 1, (byte) 2, (byte) 3, (byte) 4);System.out.println(result3);}public static int GetSum(int a, int b) {return a + b;}public static double GetSum(double a, double b, double c) {return a + b + c;}public static byte GetSum(byte a, byte b, byte c, byte d) {return (byte) (a + b + c + d);}
}

运行结果:

30
60.599999999999994
10

小练习:复制数组

  • 需求:定义一个方法copyOfRange(int[] arr, int form, int to)
  • 功能:将数组arr中从索引from(包含from)开始。到索引to结束(不包含to)的元素复制到新的数组中,将新数组返回。

示例代码:

import java.util.Arrays;public class MethodExercise5 {public static void main(String[] args) {int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};int[] result = copyOfRange(arr, 2, 4);System.out.println(Arrays.toString(result));}public static int[] copyOfRange(int[] arr, int form, int to) {int[] result = new int[to - form];for (int i = 0; form < to; i++) {result[i] = arr[form];form += 1;}return result;}
}

14.3 方法的内存

14.3.1 方法调用的基本内存原理

先进先出

14.3.2 方法传递基本数据类型、引用数据类型的内存原理

首先区别基本数据类型与引用数据类型:

  • 基本数据类型:整数类型、浮点数类型、布尔类型、字符类型
  • 引用数据类型:除了上述类型的其他所有类型

从深层次区别:

小结:

14.4 方法中值传递时的内存

直接看两段代码:

public class ArgsDemo01 {public static void main(String[] args) {int number = 100;change(number);System.out.println(number);  // 100}public static void change(int number){number = 200;}
}

number未发生变化,而下面一段代码:

public class ArgsDemo02 {public static void main(String[] args) {int[] number = {1, 2, 3, 4, 5};change(number);System.out.println(number[0]);  // 200}public static void change(int[] number) {number[0] = 200;}
}

number[0]发生了变化,引用数据类型在传递时传递的是地址值。

15、综合练习

15.1 卖飞机

示例代码:

import java.util.Scanner;public class Exercise01 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输出机票原价:");int original_cost = sc.nextInt();System.out.println("请输出当前月份(1~12):");int month = sc.nextInt();System.out.println("请输入机票类型:1、经济仓; 2、头等仓。");int ticket_type = sc.nextInt();System.out.println("您的机票价格为:");InquireAirFare(original_cost, month, ticket_type);}public static void InquireAirFare(int original_cost, int month, int ticket_type){if(month>=5 && month<=10){if(ticket_type == 1){System.out.println(original_cost * 0.85);}else {System.out.println(original_cost * 0.9);}}else if((month>=1 && month<=4) || (month>=11 && month<=12)) {if(ticket_type == 1){System.out.println(original_cost * 0.65);}else {System.out.println(original_cost * 0.7);}}else {System.out.println("输入月份不合法");}}
}

示例结果:

请输出机票原价:
200
请输出当前月份(1~12):
1
请输入机票类型:1、经济仓; 2、头等仓。
1
您的机票价格为:
130.0
请输出机票原价:
200
请输出当前月份(1~12):
13
请输入机票类型:1、经济仓; 2、头等仓。
1
您的机票价格为:
输入月份不合法

15.2 找质数

判断101 ~ 200 之间有多少个质数(及素数),并输出所有质数

示例代码:

public class Exercise02 {public static void main(String[] args) {int num = 0;System.out.println("101 ~ 200 之间的质数如下: ");for (int i = 101; i <= 200; i++) {// 判断是否为质数boolean prime_number = true;for (int j = 2; j < i; j++) {if (i % j == 0) {prime_number = false;break;}}if(prime_number){System.out.println(i);num++;}}System.out.println("101 ~ 200 之间的质数数量为:" + num);}
}

输出结果:

101 ~ 200 之间的质数如下:
101
103
107
109
113
127
131
137
139
149
151
157
163
167
173
179
181
191
193
197
199
101 ~ 200 之间的质数数量为:21

15.3 开发验证码

  • 实现一个随机产生一个5位的验证码,格式如下:

    • 长度为5
    • 前四位是大写字母 or 小写字母
    • 最后一位是数字

示例代码:

import java.util.Random;public class Exercise03 {public static void main(String[] args) {char[] letter = new char[52];  // 存储a~z和A~Z共52个数for (int i = 0; i < 52; i++) {// 基于ASCII码表// a:97if (i <= 25) {letter[i] = (char) (97 + i);}// A:65else {letter[i] = (char) (65 + i - 26);}}// 开始随机产生验证码int random_number;String result = "";// 前4位为字母for(int i =0 ;i<4;i++){random_number = new Random().nextInt(letter.length);result += letter[random_number];}// 最后一位为 0~9 的一个数字result += new Random().nextInt(10);System.out.println(result);}
}

15.4 数组元素的复制

把一个数组中的元素复制到另一个新数组中

示例代码:

import java.util.Arrays;public class Exercise04 {public static void main(String[] args) {int[] old_arr = {1, 2, 3, 4, 5};int[] new_arr = new int[old_arr.length];for(int i=0;i<old_arr.length;i++){new_arr[i] = old_arr[i];}System.out.println(Arrays.toString(new_arr));}
}

15.5 评委打分

示例代码:

import java.util.Scanner;public class Exercise05 {public static void main(String[] args) {int[] mark = getMark(6);int max = getMax(mark);int min = getMin(mark);int ave = (getSum(mark) - max - min) / (mark.length - 2);System.out.println("平均分为:" + ave);}public static int[] getMark(int num) {int[] mark = new int[num];Scanner sc = new Scanner(System.in);for (int i = 0; i < num; i++) {System.out.println("请输出评分:");mark[i] = sc.nextInt();while (mark[i] < 0 || mark[i] > 100) {System.out.println("评分格式错误,请重新输入:");mark[i] = sc.nextInt();}}return mark;}public static int getMax(int arr[]) {int max = arr[0];if (arr.length == 1) {return arr[0];}for (int i = 1; i < arr.length; i++) {if (max < arr[i]) {max = arr[i];}}System.out.println("最大值为:" + max);return max;}public static int getMin(int arr[]) {int min = arr[0];if (arr.length == 1) {return arr[0];}for (int i = 1; i < arr.length; i++) {if (min > arr[i]) {min = arr[i];}}System.out.println("最小值为:" + min);return min;}public static int getSum(int arr[]) {int sum = 0;for (int i = 0; i < arr.length; i++) {sum += arr[i];}return sum;}
}

结果展示:

请输出评分:
10
请输出评分:
110
评分格式错误,请重新输入:
20
请输出评分:
30
请输出评分:
40
请输出评分:
50
请输出评分:
120
评分格式错误,请重新输入:
60
最大值为:60
最小值为:10
平均分为:35

03 字符串

1、String

1.1 API

API:应用程序编程接口

一些不懂的API可以查阅Java的API帮助文档

1.2 String概述

String的注意点:

小结:

1.3 创建String对象的两种方式

示例代码:

String创建对象的两种方式:

  • 直接赋值:最常使用,简单且节约内存
  • new
    • 空参构造
    • 有参构造

1.4 创建String对象时的内存变化

方式一、直接赋值:

方式二、new

较费内存

1.5 字符串的比较

1.5.1 情况一

先看一段代码:

String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);  // trueString s3 = new String("abc");
System.out.println(s1 == s3);  // false

我靠,为什么直接赋值出来的abc和new出来的abc不相等?

这就需要我们了解==号到底比的时什么。

  • 基本数据类型:比较数据值
  • 引用数据类型:比较地址值

那么问题来了,如果我想只比较字符串的内容,不考虑地址值怎么办?

基于两个API:

示例代码:

String s1 = "abc";
String s2 = new String("Abc");boolean result1 = s1.equals(s2);
System.out.println(result1);  // falseboolean result2 = s1.equalsIgnoreCase(s2);
System.out.println(result2);  // true

备注:equalsIgnoreCase中的忽略大小写只适用与英文,中文的”一“和”壹“是不行的

1.5.2 情况二

键盘录入的abc和直接赋值的abc用==号比较不相等

String s1 = "abc";Scanner sc = new Scanner(System.in);
String s2 = sc.next();  // 输入 abcSystem.out.println(s1 == s2);  // false

通过观察sc.next()源码可知,本质上还是用了new。

总结:

  • 以后只要是想比较字符串的内容,就用那俩API

1.6 小练习

1.6.1 用户登录

示例代码:

import java.util.Scanner;public class StringExcise1 {public static void main(String[] args) {String name = "Abc";String password = "123456";for (int i = 0; i < 3; i++) {Scanner sc = new Scanner(System.in);System.out.println("请输入您的账号:");String n = sc.next();System.out.println("请输入您的密码:");String p = sc.next();if (n.equals(name) && p.equals(password)) {System.out.println("登录成功!");break;} else {System.out.println("用户名或者密码错误,您还有" + (2 - i) + "次机会,请重新输入。");}}}
}

结果展示:

请输入您的账号:
abc
请输入您的密码:
132
用户名或者密码错误,您还有2次机会,请重新输入。
请输入您的账号:
Abc
请输入您的密码:
314
用户名或者密码错误,您还有1次机会,请重新输入。
请输入您的账号:
Abc
请输入您的密码:
123456
登录成功!

1.6.2 遍历字符串、统计字符次数、字符串拼接和反转

需求:键盘录入字符串,使用程序实现遍历该字符串。

示例代码:

import java.util.Scanner;public class StringExcise2 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串:");String s = sc.next();for (int i = 0; i < s.length(); i++) {System.out.println(s.charAt(i));}}
}

结果展示:

请输入一个字符串:
dasf
d
a
s
f

统计字符次数:键盘录入字符串,统计其中大写字母、小写字母、数字、其他字符的个数

示例代码:

import java.util.Scanner;public class StringExcise3 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串:");String s = sc.next();int capitalLetter = 0;  // 大写字母int smallLetter = 0;  // 小写字母int figure = 0;  // 数字int other = 0;  // 其他字符for (int i = 0; i < s.length(); i++) {if(s.charAt(i) >= 'a' && s.charAt(i) <= 'z'){smallLetter += 1;}else if(s.charAt(i) >= 'A' && s.charAt(i) <= 'Z'){capitalLetter += 1;}else if(s.charAt(i) >= '0' && s.charAt(i) <= '9'){figure += 1;}else {other += 1;}}System.out.println("大写字母个数为:" + capitalLetter);System.out.println("小写字母个数为:" + smallLetter);System.out.println("数字个数为:" + figure);System.out.println("其他字符个数为:" + other);}
}

结果展示:

请输入一个字符串:
aAbc1230,,
大写字母个数为:1
小写字母个数为:3
数字个数为:4
其他字符个数为:2

拼接字符串

示例代码:

public class StringExcise4 {public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5};String result = StringSplicing(arr);System.out.println(result);  // [1,2,3,4,5]}public static String StringSplicing(int arr[]) {if (arr == null) {return "";} else if (arr.length == 0) {return "[]";}String result = "[";for (int i = 0; i < arr.length; i++) {if (i == arr.length - 1) {result = result + arr[i] + "]";return result;}result = result + arr[i] + ',';}return result;}
}

字符串反转

示例代码:

import java.util.Scanner;public class StringExcise5 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输出需要反转的字符串:");String str = sc.next();String result = ReverseString(str);System.out.println(result);}public static String ReverseString(String str) {String result = "";for (int i = 0; i < str.length(); i++) {result += str.charAt(str.length() - i -1);}return result;}
}

结果展示:

请输出需要反转的字符串:
adc
cda

1.6.3 金额转换

思路:

示例代码:

import java.util.Scanner;public class StringDemo9 {public static void main(String[] args) {//1.键盘录入一个金额Scanner sc = new Scanner(System.in);int money;while (true) {System.out.println("请录入一个金额");money = sc.nextInt();if (money >= 0 && money <= 9999999) {break;} else {System.out.println("金额无效");}}//定义一个变量用来表示钱的大写String moneyStr = "";//2.得到money里面的每一位数字,再转成中文while (true) {//2135//从右往左获取数据,因为右侧是数据的个位int ge = money % 10;String capitalNumber = getCapitalNumber(ge);//把转换之后的大写拼接到moneyStr当中moneyStr = capitalNumber + moneyStr;//第一次循环 : "伍" + "" = "伍"//第二次循环 : "叁" + "伍" = "叁伍"//去掉刚刚获取的数据money = money / 10;//如果数字上的每一位全部获取到了,那么money记录的就是0,此时循环结束if (money == 0) {break;}}//3.在前面补0,补齐7位int count = 7 - moneyStr.length();for (int i = 0; i < count; i++) {moneyStr = "零" + moneyStr;}System.out.println(moneyStr);//零零零贰壹叁伍//4.插入单位//定义一个数组表示单位String[] arr = {"佰","拾","万","仟","佰","拾","元"};//               零    零   零   贰   壹   叁   伍//遍历moneyStr,依次得到 零    零   零   贰   壹   叁   伍//然后把arr的单位插入进去String result = "";for (int i = 0; i < moneyStr.length(); i++) {char c = moneyStr.charAt(i);//把大写数字和单位拼接到result当中result = result + c + arr[i];}//5.打印最终结果System.out.println(result);}//定义一个方法把数字变成大写的中文//1 -- 壹public static String getCapitalNumber(int number) {//定义数组,让数字跟大写的中文产生一个对应关系String[] arr = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};//返回结果return arr[number];}}

1.6.4 手机号屏蔽

需求:以字符串的形式从键盘接受一个手机号,将中间四位号码屏蔽

最终效果为:131****9468

示例代码:

public class Test8手机号屏蔽 {public static void main(String[] args) {/*以字符串的形式从键盘接受一个手机号,将中间四位号码屏蔽最终效果为:131****9468*///1.键盘录入一个手机号码Scanner sc = new Scanner(System.in);System.out.println("请输入手机号码");String phoneNumber = sc.next();//13112349408//2.截取手机号码中的前三位String star = phoneNumber.substring(0, 3);//3.截取手机号码中的最后四位//此时我用substring方法,是用1个参数的,还是两个参数的?1个参数的会更好//因为现在我要截取到最后,所以建议使用1个参数的。String end = phoneNumber.substring(7);//4.拼接String result = star + "****" + end;System.out.println(result);}
}

1.6.5 敏感词替换

需求1:键盘录入一个 字符串,如果字符串中包含(TMD),则使用***替换

public class Test9敏感词替换 {public static void main(String[] args) {//1.定义一个变量表示骂人的话String talk = "后裔你玩什么啊,TMD";//2.把这句话中的敏感词进行替换String result = talk.replace("TMD", "***");//3.打印System.out.println(talk);System.out.println(result);}
}

需求2:如果要替换的敏感词比较多怎么办?

public class Test10多个敏感词替换 {public static void main(String[] args) {//实际开发中,敏感词会有很多很多//1.先键盘录入要说的话Scanner sc = new Scanner(System.in);System.out.println("请输入要说的话");String talk = sc.next();//后裔你玩什么啊,TMD,GDX,ctmd,ZZ//2.定义一个数组用来存多个敏感词String[] arr = {"TMD","GDX","ctmd","ZZ","lj","FW","nt"};//3.把说的话中所有的敏感词都替换为***for (int i = 0; i < arr.length; i++) {//i 索引//arr[i] 元素 --- 敏感词talk = talk.replace(arr[i],"***");}//4.打印结果System.out.println(talk);//后裔你玩什么啊,***,***,***,***}
}

1.6.6 身份证信息查看

​ 身份证的每一位都是有固定的含义:

  • 1、2位:省份
  • 3、4位:城市
  • 5、6位:区县
  • 7-14位:出生年、月、日
  • 15、16位:所在地派出所
  • 17位:性别(奇数男性,偶数女性)
  • 18位:个人信息码(随机产生)

要求打印内容方式如下:

​ 人物信息为:

​ 出生年月日:XXXX年X月X日

​ 性别为:男/女

package com.itheima.stringdemo;public class StringDemo11 {public static void main(String[] args) {//1.定义一个字符串记录身份证号码String id = "321281202001011234";//2.获取出生年月日String year = id.substring(6, 10);String month = id.substring(10, 12);String day = id.substring(12, 14);System.out.println("人物信息为:");System.out.println("出生年月日:" + year + "年" + month + "月" + day + "日");//3.获取性别char gender = id.charAt(16);//'3'  ---> 3//利用ASCII码表进行转换//'0' --->  48//'1' --->  49//'2' --->  50//'3' --->  51//'4' --->  52//'5' --->  53//'6' --->  54//'7' --->  55//'8' --->  56//'9' --->  57int num = gender - 48;if(num % 2 == 0){System.out.println("性别为:女");}else{System.out.println("性别为:男");}}
}

2、StringBuilder

2.1 概述

构造函数:

常用方法;

示例代码:

public class StringBuilderDemo1 {public static void main(String[] args) {// 1、创建对象StringBuilder sb = new StringBuilder("abc");// StringBuilder在内部已做过处理,打印出的不是地址值而是属性值System.out.println(sb);  // abc// 2、添加元素 append()sb.append(1);sb.append(2.1);sb.append(true);System.out.println(sb); // abc12.1true// 3、反转 reverse()System.out.println(sb.reverse());  // eurt1.21cba// 4、获取长度 length()int len = sb.length();System.out.println(len);  // 11// 5、将StringBuilder变回字符串 toString()String str = sb.toString();System.out.println(str);  // eurt1.21cba}
}

应用场景:

  • 字符串的拼接
  • 字符串的反转

2.2 链式编程

链式编程:当我们在调用一个方法的时候,不需要用变量接收他的结果,可以继续调用其他方法。

示例代码:

StringBuilder str = new StringBuilder("abc");
int len = str.append(123).reverse().append("adc").length();
System.out.println(len);  // 9

2.3 练习

反转字符串:键盘输入一个字符串,控制台输出其是否为反转字符串

示例代码:

Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String str1 = sc.next();String str2 = new StringBuilder().append(str1).reverse().toString();System.out.println(str1.equals(str2));

结果展示:

请输入一个字符串:
abc
false
请输入一个字符串:
abcba
true

拼接字符串

示例代码:

public class StringBuilderDemo4 {public static void main(String[] args) {int[] arr = {1,2,3,4,5,6};String result = ConcatenationString(arr);System.out.println(result);  // [1,2,3,4,5,6]}public static String ConcatenationString(int arr[]) {StringBuilder sb = new StringBuilder();sb.append("[");for (int i = 0; i < arr.length; i++) {if(i == arr.length -1){sb.append(arr[i]).append("]");break;}sb.append(arr[i]).append(",");}String result = sb.toString();return result;}
}

3、StringJoiner

3.1 概述

3.2 示例代码

示例代码一:

import java.util.StringJoiner;public class StringJoinerDemo1 {public static void main(String[] args) {// 1、创建对象,并设置间隔符StringJoiner sj = new StringJoiner("***");// 2、添加元素sj.add("aaa").add("bbb").add("ccc");// 3.打印结果System.out.println(sj);  // aaa***bbb***cccSystem.out.println(sj.length());  // 15}
}

示例代码二:

import java.util.StringJoiner;public class StringJoinerDemo2 {public static void main(String[] args) {// 1、创建对象StringJoiner sj = new StringJoiner(",","[","]");// 2、添加元素sj.add("aaa").add("bbb").add("ccc");// 3.打印结果System.out.println(sj);  // [aaa,bbb,ccc]System.out.println(sj.length());  // 13}
}

4、字符串原理

前两个在前文已讲述。

4.1 字符串拼接的底层原理

两种情况:

  • 等号右边没有变量
  • 等号右边有变量

4.1.1 等号右边没有变量

4.1.2 等号右边有变量

通过看StringBuilder中toString()的源码可知,在变回字符串时还是使用了new,也就是创建了一个新的对象

4.1.3 JDK8字符串拼接的底层原理

JDK8之前

s1+s2,先拼,后toString,至少创建了俩对象;然后再s3,又调用toString方法。

JDK8优化了,但还是很浪费资源

  • JDK8会预估数组长度,如下面创建s4时,JDK8会预估出创建一个长为3的数组

总结:

所以遇到拼接,不要直接+,用StringBuilder和StringJoiner

4.2 StringBuilder提高效率的原理图

我们通过两道面试题理解一下:

4.3 StringBuilder源码分析

示例代码:

package day5.code;public class StringBuilderDemo5 {public static void main(String[] args) {StringBuilder sb1 = new StringBuilder();// StringBuilder的两个概念// 1、容量 capacity()// 2、长度 length()sb1.append("abc");  // 3System.out.println(sb1.capacity());  // 16System.out.println(sb1.length());  // 2StringBuilder sb2 = new StringBuilder();sb2.append("abcdefghijklmnopqrstuvwxyz");  // 26System.out.println(sb2.capacity());  // 34System.out.println(sb2.length());  // 26StringBuilder sb3 = new StringBuilder();sb3.append("abcdefghijklmnopqrstuvwxyz0123456789");  // 36System.out.println(sb3.capacity());  // 36System.out.println(sb3.length());  // 36StringBuilder sb4 = new StringBuilder();sb4.append("abcdefghijklmnopqrstuvwxyz0123456789abcd");  // 40System.out.println(sb4.capacity());  // 40System.out.println(sb4.length());  // 40}
}

5、综合练习

总结:

练习:转换罗马数字

示例代码:

import java.util.Scanner;public class StringTest1 {public static void main(String[] args) {// 1、输入字符串Scanner sc = new Scanner(System.in);System.out.println("请输入:");String str = sc.next();// 2、判断是否符合要求if (!checkStr(str)) {System.out.println("字符串不符合要求");return;}// 3、转换为罗马数字StringBuilder result = new StringBuilder();for (int i = 0; i < str.length(); i++) {// 基于ascii码表,将字符的0~9变为数字// 忘记ascii表,可以基于System.out.println('0' + 0);得到0对应48int num = str.charAt(i) - 48;result.append(changeLuoMa(num));}System.out.println(result);}public static boolean checkStr(String str) {// 1、长度为小于等于9if (str.length() > 9) {return false;}// 2、只能是数字for (int i = 0; i < str.length(); i++) {if (str.charAt(i) > '9' || str.charAt(i) < '0') {return false;}}return true;}// 将一个0~9的整数转换为一个字符(其对应的罗马数字)public static String changeLuoMa(int number) {//定义一个数组,让索引跟罗马数字产生一个对应关系String[] arr = {"", "Ⅰ", "Ⅱ", "Ⅲ", "Ⅳ", "Ⅴ", "Ⅵ", "Ⅶ", "Ⅷ", "Ⅸ"};return arr[number];}
}

结果展示:

请输入:
123456789
ⅠⅡⅢⅣⅤⅥⅦⅧⅨ

调整字符串

解题思路:

示例代码:

package day5.code;public class StringTest2 {public static void main(String[] args) {String str1 = "abcd";String str2 = "cdab";  // true// String str2 = "cdaa";  // falseboolean result = checkStr(str1, str2);System.out.println(result);}public static boolean checkStr(String str1, String str2){for(int i=0;i<str1.length();i++){str1 = rotateStr(str1);if(str1.equals(str2)){return true;}}return false;}public static String rotateStr(String str){char first = str.charAt(0);String end = str.substring(1);return end + first;}
}

04 集合

1、集合和数组的对比

为什么要有集合?

集合和数组的对比:

  • 长度

    • 数组:长度固定
    • 集合:长度可变,自动扩容
  • 存储类型:
    • 数组:基本数据类型、引用数据类型
    • 集合:基本数据类型(需要包装类,详情见下文练习第二题)、引用数据类型

2、集合的基本使用

示例代码:

import java.util.ArrayList;public class ArrayListDemo1 {public static void main(String[] args) {// 1.创建集合:JDK7之后的创建方式ArrayList<String> list = new ArrayList<>();System.out.println(list);  // []// 2.添加元素boolean result1 = list.add("aaa");System.out.println(result1);  // truelist.add("bbb");list.add("ccc");list.add("ddd");list.add("eee");System.out.println(list);  // [aaa, bbb, ccc, ddd, eee]// 3.删除元素:删除指定元素 or 索引boolean result2 = list.remove("aaa");System.out.println(result2);  // trueString result3 = list.remove(0);System.out.println(result3);  // bbb// 4.修改元素System.out.println(list);  // [ccc, ddd, eee]list.set(0, "aaa");System.out.println(list);  // [aaa, ddd, eee]// 5.查String temp = list.get(1);System.out.println(temp);  // dddint len = list.size();System.out.println(len);  // 3}
}

3、集合练习

集合的遍历方式

示例代码:

import java.util.ArrayList;public class ArrayListDemo2 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("hello");list.add("world");String result = "[";for (int i = 0; i < list.size(); i++) {if (i == list.size() - 1) {result = result + list.get(i) + "]";break;}result = result + list.get(i) + ",";}System.out.println(result);  // [hello,world]}
}

添加数字并遍历

关于基本数据类型对应的包装类:

示例代码:

在练习一的基础上改一下集合的创建和添加的元素即可。

import java.util.ArrayList;public class ArrayListDemo3 {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(0);list.add(1);list.add(2);String result = "[";for (int i = 0; i < list.size(); i++) {if (i == list.size() - 1) {result = result + list.get(i) + "]";break;}result = result + list.get(i) + ",";}System.out.println(result);  // [0,1,2]}
}

添加学生对象并遍历

  • 需求:定义一个集合,添加一些学生对象并遍历

    • 学生类的属性:姓名、年龄。

示例代码:

import java.util.ArrayList;public class ArrayListDemo4 {public static void main(String[] args) {ArrayList<Student> list = new ArrayList<>();Student s1 = new Student("a", 18);Student s2 = new Student("b", 19);Student s3 = new Student("c", 20);list.add(s1);list.add(s2);list.add(s3);for (int i = 0; i < list.size(); i++) {Student stu = list.get(i);System.out.println(stu.getName() + "," + stu.getAge());}}
}

结果展示:

a,18
b,19
c,20

添加学生对象并遍历 - 升级版

  • 需求:定义一个集合,添加一些学生对象并遍历

    • 学生类的属性:姓名、年龄。
  • 需求2:对象的数据来自键盘录入

示例代码:

package day6.code;import java.util.ArrayList;
import java.util.Scanner;public class ArrayListDemo5 {public static void main(String[] args) {ArrayList<Student> list = new ArrayList<>();Scanner sc = new Scanner(System.in);System.out.println("请输入需要录入的学员数量: ");int num = sc.nextInt();for(int i=0;i<num;i++){Student s = new Student();System.out.println("请输入学员姓名:");String name = sc.next();System.out.println("请输入学员年龄:");int age = sc.nextInt();s.setName(name);s.setAge(age);list.add(s);}for (int i = 0; i < list.size(); i++) {Student stu = list.get(i);System.out.println(stu.getName() + "," + stu.getAge());}}
}

结果展示:

请输入需要录入的学员数量:
3
请输入学员姓名:
a
请输入学员年龄:
12
请输入学员姓名:
b
请输入学员年龄:
18
请输入学员姓名:
c
请输入学员年龄:
20
a,12
b,18
c,20

返回多个数据

示例代码:

package day6.code;import java.util.ArrayList;public class ArrayListDemo6 {public static void main(String[] args) {ArrayList<Phone> list = new ArrayList<>();Phone p1 = new Phone("小米", 1000);Phone p2 = new Phone("苹果", 8000);Phone p3 = new Phone("锤子", 2999);list.add(p1);list.add(p2);list.add(p3);ArrayList<Phone> result = new ArrayList<>();result = getPhoneInfo(list);for (int i = 0; i < result.size(); i++) {Phone p = result.get(i);System.out.println(p.getBrand() + "," + p.getPrice());}}public static ArrayList<Phone> getPhoneInfo(ArrayList<Phone> list){ArrayList<Phone> result = new ArrayList<>();for(int i = 0; i < list.size(); i++) {if(list.get(i).getPrice() < 3000){Phone p = list.get(i);result.add(p);}}return result;}
}

结果展示:

小米,1000.0
锤子,2999.0

Java基础01 基础语法相关推荐

  1. 【Java】01基础-14集合03

    1.Map集合 1.1Map集合概述和特点[理解] Map集合概述 interface Map<K,V> K:键的类型:V:值的类型 Map集合的特点 双列集合,一个键对应一个值 键不可以 ...

  2. C语言基础-01 基础知识

    一.C语言的特点 二.最简单的C语言程序 1.基础知识 (1)scanf: 输入,从命令行将用户输入的值,保存到变量中. int x = 0: scanf("%d" ,&x ...

  3. Java 基础-01 Java语言入门

    文章目录 Java 基础-01 Java语言入门 1.计算机基本概念 1.1 计算机概述 1.2 计算机组成 1.3 CPU.内存与硬盘 2.软件基本概念 2.1 软件概述 2.2 人机交互方式 2. ...

  4. Java基础01 注释

    JAVA基础01 注释 注释 平时我们编写代码,在代码量比较少的时候,我们还是可以看懂自己写的,但是当项目结构一旦复杂起来,我们就需要用到注释了. 注释并不会被执行,是给我们写代码的人看的 书写注释是 ...

  5. 【重难点】【Java基础 01】一致性哈希算法、sleep() 和wait() 的区别、强软弱虚引用

    [重难点][Java基础 01]一致性哈希算法.sleep() 和wait() 的区别.强软弱虚引用 文章目录 [重难点][Java基础 01]一致性哈希算法.sleep() 和wait() 的区别. ...

  6. Java程序设计语言基础01:绪论

    目录 1. 初探HelloWorld程序 1.1 类(Class)语法元素 1.2 main方法(main method)语法元素 1.3 System.out.println 1.4 字符串 2. ...

  7. 二-Java基础-作业-基础语法

    文章目录 前言 二-Java基础-环境搭建-Eclipse下载步骤和安装步骤2 二-Java基础-环境搭建-创建工程3 Java-环境搭建 总结 前言 # 二-Java基础-环境搭建-JDK-11.0 ...

  8. java 01 02_Java知识系统回顾整理01基础02面向对象01类和对象

    一.面向对象实例--设计英雄这个类 LOL有很多英雄,比如盲僧,团战可以输,提莫必须死,盖伦,琴女 所有这些英雄,都有一些共同的状态 比如,他们都有名字,hp,护甲,移动速度等等 这样我们就可以设计一 ...

  9. java 响铃 bel 使用_Java基础01

    JAVA基础01 一.注释 1. 当项目结构一旦复杂起来,我们就要使用注释. 2. 注释不被执行,提高可读性,方便团队开发. 3. 多写注释是一个非常好的习惯 4. 单行注释 // 内容 5. 多行注 ...

最新文章

  1. CDN和Web Cache领域相关的经典书籍推荐
  2. mysql 锁机制 mvcc_轻松理解MYSQL MVCC 实现机制
  3. JaveWeb学习之Servlet(二):ServletConfig和ServletContext
  4. 【leetcode】16 3Sum Closest
  5. opencv java 去干扰_java - OpenCV Java修补图像格式要求 - 堆栈内存溢出
  6. C++学习系列笔记(四)
  7. hdu 1907John博弈
  8. 普林斯顿陈丹琦:如何让「大模型」变小
  9. win10隐藏任务栏_让你的 Windows 任务栏智能化起来
  10. excel复习-数据透视表
  11. Altium Designer 打印PCB板元件位置图
  12. 多个物体模型快速制作爆炸图?试一试ThingJS
  13. JZOJ. 5421【NOIP2017提高A组集训10.25】嘟嘟噜
  14. Windows中如何修改Intel网卡的注册表使Wireshark可以抓取802.1q tag包
  15. 谈谈 跨境劳工的噩梦深坑。
  16. 小白如何学3D建模?从零开始变大神
  17. 如何固化zynq程序
  18. 帮师妹写的裁判文书内容提取程序:可做进一步提取模板
  19. WIN10系统下运行地下管线数据处理系统
  20. 如何解析Plist文件?

热门文章

  1. 富士通FRAM技术和工作原理
  2. elasticsearch搭建遇到的问题整理合集2
  3. 万数藏:国内首家影视IP艺术数藏平台今日上线
  4. 爬虫学习笔记---BeautifulSoup4库的使用
  5. 关于mdm9206 threadx_os的I2c操作相关的API,
  6. 如何创建虚拟机以及安装linux操作系统
  7. 光威战将T300 SM2256K-AB +PFB66(镁光B95A)4贴开卡量产
  8. Nand Flash的同步、异步、ONFI、Toggle
  9. 基于SpringBoot优选社区电商平台
  10. 【附源码】计算机毕业设计java野生动物保护资讯管理系统设计与实现