logo资料库

黑马程序员入学视频学习笔记.doc

第1页 / 共473页
第2页 / 共473页
第3页 / 共473页
第4页 / 共473页
第5页 / 共473页
第6页 / 共473页
第7页 / 共473页
第8页 / 共473页
资料共473页,剩余部分请下载后查看
第1天 配置开发环境
1.1 配置JAVA_HOME环境变量
1.2 配置PATH环境变量
第2天 JDK新特性
2.1 JDK1.5新特性
第4天 数组
4.1
4.1.1 数组定义的几种方式
4.1.2 操作数组常见的几种异常
4.1.3 打印数组例子
4.1.4 数组地址说明
4.4选择排序
4.5冒泡排序
4.7 折半查找
4.7.1 获取某个值在数组的位置(即下标)
4.7.2 折半查找算法
4.7.3 扩展
4.8 十进制转换成二进制
4.9 十进制转换成十六进制
4.10 查表法处理10进制转换成16进制
4.11 查表法实现十进制到二进制的转换
4.12 进制转换的优化
4.13 二维数组
4.13.1 定义
4.13.2定义数组的另一种方法
4.13.3 遍历二维数组
第5天
5.4 成员变量和局部变量
5.5 匿名对象
5.5.1 匿名对象例子
5.5.2 非匿名对象内存分配图
5.5.3 匿名对象分配图
5.8 构造函数
5.8.1 构造函数定义
5.8.2 构造函数使用方法
5.9 构造代码块
5.9.1作用
5.9.2 构造代码块和构造函数的区别
5.10 this关键字
5.11 this的应用
5.12 this关键字在构造函数间调用
第6天
6.1 static(静态)关键字
6.1.1 static修饰成员变量
6.1.3 调用static成员变量和成员方法的两种方式
6.1.4 static的特点
6.1.5 实例变量和类变量的区别
6.1.6 static关键字使用注意事项
6.2 main函数
6.2.1 main方法各个关键字说明
6.2.2如何向main方法传递参数
6.3 什么时候使用static
6.4 static的应用-工具类
6.5 制作java帮助文档
6.6 静态代码块
6.6.1 静态代码块的格式
6.6.2 静态代码块例子
6.6.3 静态代码块的小知识点
6.6.4构造代码块和静态代码块哪个先执行
6.6.5 静态代码块和构造代码块的区别
6.7 对象的创建过程
6.8 对象调用成员的过程
6.9 单例设计模式
6.10 单例设计模式方式二
第7天 面向对象-继承
7.1 继承概述
7.2 聚集关系
7.3 子父类中变量的特点
7.4 覆盖
7.5 子父类构造函数的特点
7.6 final关键字
7.8 抽象类
7.8.1 抽象类的特点
7.8.2 抽象类练习
7.9 模版方法模式
7.10接口
7.10.1 接口特点
7.10.2 接口可以被类多实现
7.10.3 接口与接口之间的关系
7.10.4 接口实现多继承
7.11 接口的特点
7.12 接口举例体现
第8天 多态
8.1 多态的概念
8.2 多态的扩展性
8.2.1 例子
8.2.2 父类做函数参数
8.3 多态-转型
8.4 多态事例
8.5多态中成员特点
8.5.1在多态中成员函数的特点
8.5.2 多态中成员变量的特点
8.6 多态的主板示例
8.7 多态的扩展示例
8.8 Object的equals方法
8.8.1 例子
8.8.2 覆写equals方法
8.8.3 instanceof判断子父类关系
8.9 Object类toString()方法
8.9.1 例子
8.9.2 如何获取类名
第9天 内部类与异常处理
9.1 内部类访问规则
9.2 静态内部类
9.3 内部类定义原则
9.4 匿名内部类
9.5 异常概述
9.6 try-catch处理异常
9.6.1 例子
9.6.2 常见的异常方法操作
9.7 异常声明throws
9.8 多异常处理
9.9 自定义异常
9.10 throw和throws的区别
9.11 RuntimeException
9.12 异常练习
第10天
10.1 异常-finally
10.2 异常处理语句三种格式
10.3 覆盖时异常的特点
10.4异常练习
10.5 异常的总结
10.5.1 异常体系
10.5.2 throw和throw的用法
10.5.3 异常有两种
10.5.4 异常处理语句格式
10.5.5 异常处理语句3种格式
10.5.6 自定义异常
10.5.7 异常的好处与处理原则
10.5.8 异常注意事项
第11天 多线程
11.1 多线程概述
11.2 创建线程
11.3 run和start的特点
11.4 线程练习
11.5 线程状态
11.6 获取线程对象及名称
11.7 多线程售票例子
11.8 创建线程实现Runnable接口
11.9 多线程安全问题
11.10 多线程同步代码块
11.11 多线程的同步函数
11.12 同步函数是锁是this
11.13 静态同步函数的锁的Class对象
11.14 多线程单例设计模式-懒汉式
11.15 多线程-死锁
第12天 多线程-线程间通信
12.1 线程间通信
12.2 线程间通信-等待唤醒机制
12.3 线程间通信-代码优化
12.4 线程间通信-生产者消费者
12.5 生产者-消费者JDK5.0升级版
12.6 多线程-停止线程
12.7 多线程-守护线程
12.8 Join方法
12.9 优先级&yield方法
12.9.1 优先级
12.9.2 yield方法
12.9.3 线程扩展
第13天 JavaAPI
13.1 String概述
13.2 String参加功能-获取和判断
13.2.1获取
13.2.2 判断
13.3常见功能-转换
13.4切割和替换
13.5比较和去除空格
13.6 练习1-自定义去除前导与尾部空格
13.7练习2-字符串反转
13.7.1 反转所有字符串
13.7.2 对指定位置字符串反转
13.8练习3-获取字符串在另一个字符串中出现次数
方式一
方式二
13.9练习-获取两个字符串的最大相同子串
13.10 StringBuffer-添加
13.11 StringBuffer-删除和修改
13.11.1 删除
13.11.2 清空缓冲区
13.11.3 获取
13.11.4 替换
13.11.5 反转
13.11.5 存储到字符数组
13.12 StringBuilder
13.13 基本数据类型对象包装类
13.13.1 数据表
13.13.2 Integer
13.14 对象包装类新特性
第14天 集合
3.1集合框架体系结构
3.2集合共性方法
3.2.1添加元素
14.2.2 删除元素
3.3迭代器
3.4List集合共性方法
方法表
添加元素例子
删除指定位置元素例子
修改元素
获取元素
迭代器
3.5ListIterator
定义与说明
迭代时添加元素例子
迭代时修改元素例子
逆向遍历元素
3.6List具体对象特点
3.7Vector中的枚举
3.8LinkedList
方法表
添加元素例子
获取元素例子
删除元素例子
JDK1.6新特性-替代添加获取和删除方法
3.9LinkedList练习-模拟队列和堆栈
14.10 ArrayList练习1-去除重复元素
14.11 ArrayList练习2
14.12HashSet
14.13HashSet存储自定义对象
例子
分析例子
14.14HashSet判断和删除依据
第15天
15.1 TreeSet
15.2 TreeSet存储自定义对象
15.2.1 重要说明
15.2.2 错误的例子
15.2.3 正确的例子
15.2.4 解决15.2.3例子问题
15.3 二叉树
15.3.1 二叉树结构图
15.3.2 如何让TreeSet按照输入数据顺序输出数据
15.4 实现Comparator方式排序
15.4.1 排序原理
15.4.2 只排序姓名的例子
15.4.3 排序姓名后排序年龄例子
15.5 TreeSet练习
15.6 泛型概述
15.6.1 概述
15.6.2泛型例子
15.7 泛型使用
15.8 泛型类
15.8.1 未使用泛型类的例子
15.8.2 使用泛型类的例子
15.8.3 泛型类定义
15.9 泛型方法
15.10 静态方法泛型
15.11 泛型接口
15.11.1 实现类确定操作的引用类型
15.11.2 实现类确定操作的引用类型
15.12 泛型限定1
15.12.1 引例
15.12.2 泛型限定例子
15.13 泛型限定2
15.13.1 需求
15.13.2 两个比较器的例子
15.13.3 一个比较器的例子
第16天
16.1 集合Map概述
16.2 Map子类特点
16.3 Map共性方法
16.3.1 添加
16.3.2 判断
16.3.3 获取
16.3.4 删除
16.4 Map的keySet
16.5 Map的entrySet
16.5.1 Map.Entry在内存中的关系图
16.5.2 entrySet例子
16.6 Map练习
16.7 TreeMap练习
16.7.1 需求分析
16.7.2 例子
16.8 TreeMap练习-字母出现次数
16.8.1 分析
16.8.2 例子
16.8.3 例子优化
16.8.4问题与解答
16.9 Map扩展
16.9.1 功能分析
16.9.2 例子
16.9.3 扩展-由学校和班级打印信息
16.9.4 扩展-键值定义在Student类中
第17天
17.1 Collections-sort
17.1.1 sort()方法中的泛型解析
17.1.2 sort排序List集合中的字符串
17.1.3 sort()对字符串长度排序
17.2 Collections的max方法
17.2.1 max方法获取最大的字符串
17.2.2 max()方法获取长度最长的字符串
17.3 Collections的binarySearch方法
17.3.1 binarySearch方法说明与例子
17.3.2 有比较器的binarySearch方法
17.4 Collections的替换反转
17.4.1 fill方法替换所有元素
17.4.2 replaceAll方法替换元素
17.4.3 reverse方法反转元素顺序
17.5 reverseOrder方法
17.5.1 引例
17.5.2 通过比较器逆序输出元素
17.5.3 通过reverseOrder方法倒序元素
17.5.4 reverseOrder重载方法-强行逆转现有比较器
17.6 Collections-SynList
17.6.1 同步方法
17.6.2 Collections的swap方法
17.6.3 Collections的shuffle方法
17.7 Arrays
17.7.1 Arrays方法简介
17.7.2 toString方法例子
17.7.3 asList方法例子
17.8 集合变成数组
17.8.1 方法说明及例子
17.8.2集合变成数组的原因
17.9 增强for循环
17.9.1 说明及例子
17.9.2 局限性
17.9.3 遍历Map集合例子1
17.9.4遍历Map集合例子2
17.10 可变参数
17.10.1 重载方法产生的问题
17.10.2 数组初步解决问题
17.10.3 可变参数解决上述问题
17.10.4可变参数使用注意事项
17.11 静态导入
17.11.1 问题由来
17.11.2 静态导入解决问题
第18天 IO流1-输入与输出
18.1 System
18.1.1 getProperties获取所有属性信息
18.1.2 getProperty获取单个属性信息
18.1.3 setProperty设置信息
18.2 Runtime类
18.2.1 exec方法打开QQ
18.2.2 exec方法打开记事本
18.3 Date类
18.3.1 Date与SimpleDateFormat格式化日期
18.4 Calendar
18.4.1 问题由来-SimpleDateFormat格式化Date年份
18.4.2 Calendar类获取日期方法
18.4.3 Calendar的set方法设置时间
18.4.4 add方法增减时间
18.4.5 练习
18.5 Math类的方法
18.5.1 ceil方法
18.5.2 floor方法
15.5.3 round方法四舍五入
15.5.4 pow方法实现幂运算
15.5.5 random方法
15.5.6 Random类中的随机数方法
15.5.7 练习-保留小数位数
18.6 IO流
18.6.1 IO流分类
18.6.2 IO流常用基类
18.7 FileWriter
18.7.1 write方法写入数据
18.7.2 flush方法刷新缓冲区
18.7.3 close方法关闭流资源
18.8 IO异常处理
18.9 文件的续写
18.10 文本文件读取方式一
18.11 文本文件读取方式二
18.12 文本文件读取练习
18.13 拷贝文件
18.13.1 原理和步骤说明
18.13.2 拷贝例子-没有catch异常
18.13.3 拷贝例子-catch异常
18.14 拷贝文本图例
第19天 IO流2
19.1 BufferedWriter
19.2 BufferedReader
19.2.1 说明
19.2.2 例子1:一次读取一行
19.2.3 例子2:保存到字符数组
19.3 通过缓冲区复制文本文件
19.3.1 抛出异常的例子
19.3.2 catch异常的例子
19.4 readLine原理图
19.5 MyBufferedReader
19.6 装饰设计模式
19.6.1 没有使用增强类的例子
19.6.2 使用增强类的例子
19.6.3 知识点
19.7 装饰和继承的区别
19.8 自定义装饰类
19.9 LineNumberReader
19.9.1 getLineNumber方法例子
19.9.2 setLineNumber方法例子
19.10 MyLineNumberReader
19.10.1带行号输出的例子
19.10.2 设置行号的例子
19.10.3 代码优化-提高复用性
19.10.3.1 已经存在的MyBufferedReader类
19.10.3.2 复用MyBufferedReader
19.11 字节流File操作
19.11.1 读与写的例子
19.11.2 读取时存储到字节数组例子
19.11.3 available方法
19.12 拷贝图片
19.13 字节流缓冲区
19.14 自定义字节流缓冲区-read和writer的特点
19.14.1 BufferedInputStream原理
19.14.2 出现问题的例子
19.14.3 分析BufferedInputStream的read方法
19.15 读取键盘录入
19.15.1 例子
19.15.2 指定停止录入的条件
19.16 读取转换流
19.17 写入转换流
19.18 流操作规律1
19.18.1 把控制台输入的数据输出到文件
19.18.2 把文件中的数据输出到控制台
19.18.3 流操作的基本规律
19.18.4 流操作规律练习
19.19 流操作规律2
19.19.1 流操作规律分析
19.19.3 扩展-指定编码表将数据输出到文件
19.20 改变标准输入输出设备
19.20.1 setIn方法改变标准输入设备
19.20.2 setOut方法改变标准输出设备
19.21 异常的日志信息
19.22 系统信息
第20天 IO流3
20.1 File概述
20.2 File对象功能-创建和删除
20.2.1 创建文件
20.2.2 删除文件夹
20.3 File对象功能-判断
20.3.1 方法说明与例子
20.3.2 判断是否为文件和目录的方法
20.4 File对象功能-获取
20.4.1 方法说明与例子
20.4.2 renameTo方法
20.5 File对象功能-文件列表1
20.5.1 listRoots方法获取有效盘符
20.5.2 list方法获取文件即文件夹名称
20.6 File对象功能-文件列表2
20.7 列出目录下所有内容-递归
20.7.1 例子
20.7.2 递归分析图
20.7.3 扩展-批量修改文件名
20.8 列出目录下的所有内容-带层次
20.9 删除带内容的目录
20.10 创建Java文件列表
20.11 Properties简述
20.12 Properties存取
20.13 Properties存取配置文件
20.13.1 例子1
20.13.2 例子2-load方法优化代码
20.13.3 例子3-store方法修改信息并保存到文件中
20.14 Properties练习
20.15 PrintWriter
20.15.1 打印流说明
20.15.2 例子
20.15.3 例子-自动刷新缓冲区
20.15.4 数据保存到文件中
20.15.5 数据保存文件并自动刷新
20.16 合并流
20.17 切割文件
20.17.1 切割文件原理
20.17.2 分割文件例子
20.17.3 合并分割文件
第21天 IO流4
21.1 对象的系列化
21.1.1 系列化说明
21.1.2 对象存储到文件中
21.1.3 读取文件中存储的对象信息
21.1.4 问题-修改类后无法读取原来的对象文件
21.1.5 解决方案-创建序列号
21.1.6 静态成员不能序列号
21.1.7 transient关键字
21.2 管道流
21.3 RandomAccessFile
21.3.1 说明
21.3.2 写数据例子
21.3.3 读数据例子
21.3.4 seek方法设置指针
21.3.5 skipBytes方法跳过指定的字节数
21.3.6 seek方法设置随机写入数据
21.3.7 seek方法修改数据
21.3.8 RandomAccessFile分段数据的好处
21.4 DataStream流对象操作基本数据类型
21.4.1 存储数据到文件
21.4.2 读取数据
21.4.3 writeUTF方法
21.4.4 readUTF方法
21.5 ByteArrayStream
21.5.1 说明
21.5.2 例子
21.5.3 知识点
21.6 转换流的字符编码
21.6.1 编码表说明
21.6.2 转换流例子-写入文件
21.6.3 流转换例子-读取文件
21.6.4 注意
21.7 字符编码
21.7.1 说明
21.7.2 编码和解码例子
21.7.3 编码表不同导致的问题
21.7.4 解决乱码问题
21.8 字符编码-联通
21.8.1 问题出现
21.8.2 GBK和UTF-8编码识别原理
21.8.3 UTF-8编码格式
21.8.4 UTF-8编码格式例子分析
21.9 练习
21.9.1 需求分析
21.9.2 实现代码
1学生类代码
2学生信息工具类代码
3main方法
21.9.3 逆转原来的顺序
第22天 图形用户界面-GUI
22.1 GUI概述
22.2 GUI布局
22.3 Frame
22.4 事件监听机制
22.4.1 事件监听机制说明
22.4.2 事件监听机制例子
22.5 窗体事件
22.5.1 关闭窗体例子
22.5.2 匿名内部类关闭窗体的例子
22.5.3 其他方法
22.6 Action事件
22.6.1 组件和事件分离
22.6.2 给按钮添加事件
22.7 鼠标事件
22.7.1 鼠标事件例子1
22.7.2 如何识别双击鼠标等事件
22.8 键盘事件
22.8.1 键盘事件例子
22.8.2 判断按键
22.8.3 文本框只允许输入数字
22.9 列出指定目录内容
22.10 对话框Dialog
22.11 菜单
22.12 练习-打开文件
22.13 练习-保存文件
22.14 jar包双击执行
第23天 网络编程1
23.1 网络编程概述1
23.2 网络编程概述2
23.3 网络模型
23.4 IP地址
23.5 TCP和UDP
23.6 Socket
23.7 UDP发送端
23.8 UDP接收端
23.9 UDP键盘录入方式数据
23.9.1 优化上一节代码
23.9.2 UDP键盘录入数据
23.10 UDP聊天
23.11 TCP传输1
23.12 TCP输出2
23.13 TCP练习
23.13.1 分析和代码
23.13.2 代码优化
23.14 TCP复制文件
第24天 网络编程2
24.1 TCP上传图片
24.2 TCP客户端并发上传图片
24.2.1 一次服务一个客户端问题
24.2.2 多线程实现并发上传图片
24.2.2.1 代码1
24.2.2.2 代码2-限制上传图片格式和大小
24.3 TCP客户端并发登录
24.4 浏览器客户端-自定义服务端
24.4.1 例子1
24.4.2 例子2-服务端返回带格式的数据
24.5 Tomcat服务端
24.6 自定义浏览器Tomcat服务端
24.6.1 浏览器给服务端发送什么数据
24.6.2 自定义客户端服务端发送数据
24.7 自定义图形用户界面浏览器-Tomcat服务器
24.8 URL-URLConnection
24.8.1 URL对象常用方法
24.8.2 URLConnection
24.8.3 使用URLConnection修改24.7代码
24.9 小知识点
24.10 域名解析
第25天 高新技术1
25.1课程价值与目标介绍
25.2 Eclipse及IDE开发工具介绍
25.3 Eclipse工程管理与快捷键配置
25.4 Eclipse视图管理与程序调试
25.5 配置Eclipse编译与运行环境
25.6 Eclipse中配置java模板代码
25.7 在Eclipse中导入已有工程
25.8 静态导入与编译器语法设置
25.9 可变参数与OverLoad相关面试题分析
25.10 增强for循环
25.11 基本数据类型的自动拆装箱与享元设计模式
25.12 枚举的作用介绍
25.13 用普通类模拟枚举的实现原理
25.14 枚举的基本应用
25.15 带有构造方法的枚举
25.16 实现带有构抽象方法的枚举
25.17 分析反射的基础_Class
25.18 理解反射概念
25.19 构造方法的反射应用
25.20 成员变量的反射
25.21 成员变量反射综合案例
25.22 成员方法的反射
25.23 对接收数组参数的成员方法进行反射
25.24 数组与Object的关系及其反射类型
25.25 数组的反射应用
25.26 ArrayList和HashSet的比较及Hashcode分析
25.26.1 ArrayList
25.26.2 HashSet
25.26.3 HashCode
25.27 框架的概念及用反射技术开发框架的原理
25.28 用类加载器的方式管理资源和配置文件
25.29 由内省引出JavaBean的讲解
第26天 高新技术2
26.1 JavaBean的简单内省操作
26.1.1 Person类代码
26.1.2 JavaBean的简单内省操作
26.1.3 代码重构
26.2 JavaBean复杂的内省操作
26.3 BeanUtils工具包操作JavaBean
26.3.1 BeanUtils工具包操作JavaBean类
26.3.2 BeanUtils-自动转型和级联操作
26.4 注释的应用
26.5 注解定义与反射调用
26.5.1 注解分析
26.5.2 创建注解
26.5.3 Target注解
26.6 为注解增加各种属性
26.6.1 为注解增加基本属性
26.6.2 为注解增加高级属性
26.6.2.1 数组类型属性
26.6.2.2 枚举类型属性
26.6.2.3 注解类型的属性
26.7 泛型的基本应用
26.8 泛型的内部原理及更深应用
26.8.1 泛型运行时消失性特点
26.8.2 了解泛型
26.9 泛型的通配符扩展应用
26.9.1 泛型中的问号?通配符
26.9.2 限定通配符
26.10 泛型集合的综合应用案例
26.11 自定义泛型方法及其应用
26.12 自定义泛型方法的练习与类型推断总结
26.13 自定义泛型类的应用
26.13.1 问题-方法泛型不统一
26.13.2 定义泛型类型
26.14 通过反射获得泛型的实际参数
26.15 类加载器及其委托机制的深入分析
26.15.1 例子分析类加载器
26.15.2 类加载器结构分析
26.15.3 类加载器委托机制
26.16 自定义类加载器的编写原理分析
26.16.1 编写步骤及原理分析
26.16.2 模板方法设计模式
26.17 编写对class文件进行加密的工具类
26.18 编写和测试自己编写的解密类加载器
26.19 加载器的一个高级文件的实验分析
26.19.1 创建Servlet并在浏览器中访问
26.19.2 分析问题
26.19.3 解决问题
26.20 分析代理类的作用与原理及AOP概念
26.20.1 代理类原理
26.20.2 AOP
26.20.3 动态代理技术
26.21 创建动态类及查看其方法列表信息
26.22 创建动态类的实例对象及调用其方法
26.23 完成InvocationHandler对象的内部功能
26.23.1 匿名内部类实现动态类
26.23.2 创建动态类和创建实例对象合二为一
26.24 分析InvocationHandler对象的运行原理
26.24.1 原理分析
26.24.2 空指针异常和getClass没有返回目标类的原因
26.25 总结分析动态代理类的设计原理与结构
26.26 编写可生成代理和插入通告的通用方法
26.26.1 抽取目标
26.26.2 系统功能抽取
26.27 实现类似spring的可配置的AOP框架
第29天7K月薪面试题破解-交通灯管理系统
29.4 交通灯管理系统项目需求
29.5 精通面向对象的分析和设计秘诀
29.5.1 面向对象思想剖析
29.5.2 面向对象面试题分析
29.6 交通灯控制系统的类的实现分析
29.7 编写Road类中模拟汽车上路的代码
29.8 定时器与Road类中模拟汽车穿过路口
29.9 编写表示交通灯的Lamp类的代码
29.10 编写交通灯控制器的类和总成测试
29.10.1 交通灯控制器
29.10.2 总测试类
第30天 7K月薪面试题破解-银行业务调度系统
30.2 银行业务调度系统需求说明
30.3 银行业务调度系统面向对象分析设计
30.4 编写表示号码管理器的类
30.5 编写表示号码机器的类
30.6 编写表示业务窗口的类的骨架代码
30.7 完成表示业务窗口的类的细节代码
30.8 编写程序的主类和完成客户取号功能
黑马程序员视频—学习笔记 作者:吉友良 院校:天津科技大学 计算机科学与信息工程学院 专业:软件工程 时间:2013 年 5 月 第 1 天 配置开发环境 JDK 安装完成后,要配置环境变量,配置过程如下。 1.1 配置 JAVA_HOME 环境变量 JAVA_HOME 配置位 jdk 安装路径,假如 jdk 安装路径为 C: \Java\jdk1.7.0_05,那么 JAVA_HOME 配置如下: 1.2 配置 PATH 环境变量 配置 path 就是将将 JDK 的 bin 目录添加到 PATH 变量中。在系统变量中找到“PATH” 变量,双击 PATH,在原 PATH 变量后添加 ;%JAVA_HOME%\bin 注意:前面的分号不能少(为了和其他 PATH 变量值分开)。 这样,Java 开发环境就算搭建完成了,classpath 不需要配置。
说明 请看 26.4 节 请看 26.7 节 第 2 天 JDK 新特性 2.1 JDK1.5 新特性 JDK1.5 新特性: 新特性 静态导入 可变参数 增强 for 循环 基本数据类型的自动拆箱与自动装箱 枚举 注解 泛型 第 4 天 数组 延伸:编译时,只检查语法错误。 4.1 4.1.1 数组定义的几种方式 //1.指定数组长度 int[] arr1 = new int[4]; //2.静态初始化, 不建议指定长度, 系统会自动计算长度 int[] arr2 = new int[] {1, 2, 3, 4, 5}; //上一行定义方式也可以如下 int[] arr3 = {1, 2, 3, 4, 5}; 4.1.2 操作数组常见的几种异常 1. 下标越界: ArrayIndexOutOfBoundsException int[] arr = new int[3]; System.out.println(arr[3]);//数组越界 2. 空指针异常:
NullPointerException int[] arr = new int[3]; arr = null;// arr这个引用已不在指向任何数组实体 System.out.println(arr[1]); 4.1.3 打印数组例子 public class ArrayTest { public static void main(String[] args) { int[] arr = new int[] {1,2,3,4,5}; printArr(arr); } //打印数组元素, 元素间用逗号隔开, 且最后一个元素末尾不能有逗号 public static void printArr(int[] arr) { for(int i = 0; i < arr.length; i++) { if(i != arr.length-1) System.out.print(arr[i]+","); else System.out.println(arr[i]); } } } 4.1.4 数组地址说明 int[] arr = new int[] {1,2,3,4,5}; System.out.println(arr); //此次定义输出:[I@507d811a //该值表示:int 类型数组,该数组地址为(16 进制):507d811a 4.4 选择排序 //选择排序 public static void selectSort(int[] arr) { int temp; for(int i = 0; i < arr.length-1; i++) { for(int j = i+1; j < arr.length; j++) { if (arr[j] < arr[i]) { //第i个元素和其他后面的的元素比
较,第一次比较完毕后, temp = arr[j]; arr[j] = arr[i]; arr[i] = temp; //第一个位置取得最小值 } } } } 其实 Java 提供了数字排序的功能,在实际开发中使用该功能,如下: Arrays.sort(arr);//系统通过的排序 4.5 冒泡排序 /* * 冒泡排序: * 第一次比较完毕后,最值出现在数组末尾 */ public class Day4_5 { public static void bubbleSort(int[] arr) { for(int i = 0; i < arr.length-1; i++) { //arr.length-i:每一趟比较次数, -1:防止数组越界 for(int j = 0; j < arr.length-i-1; j++) { if(arr[j] > arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } //打印数组 public static void printArray(int[] arr) { for(int i = 0; i < arr.length; i++) { if(i != (arr.length-1)) System.out.print(arr[i]+","); else System.out.println(arr[i]); } } public static void main(String[] args) {
int[] arr = {10,2,1,9,8,6,7,5,4,3}; printArray(arr); bubbleSort(arr); printArray(arr); } }
优化代码: public static void bubbleSort(int[] arr) { for(int i = 0; i < arr.length-1; i++) { //arr.length-i:每一趟比较次数, -1:防止数组越界 for(int j = 0; j < arr.length-i-1; j++) { if(arr[j] > arr[j+1]) { /*int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp;*/ swap(arr, j, j+1); } } } } //位置置换方法:无论哪个排序,都有位置置换的代码,可以将这部分相同的代 码抽取出来封装成一个方法,如下: public static void swap(int[] arr,int a,int b) { int temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; } 4.7 折半查找 4.7.1 获取某个值在数组的位置(即下标) 折半查找的前提:该数组是有序的 //返回key第一次出现在数组中的位置,如果返回-1,则说明数组中不存在key值 public static int getIndex(int[] arr,int key) { for (int i = 0; i < arr.length; i++) { if (key == arr[i]) return i; } return -1; } public static void main(String[] args) { int[] arr = {10,2,1,9,8,6,7,5,4,3}; int key = 11; int index = getIndex(arr, key);
System.out.println(index); } 4.7.2 折半查找算法 方法 1: public static void main(String[] args) { int[] arr = {1,4,8,10,12,35}; int key = 14; int index = binarySearch(arr, key); System.out.println(index); } //折半查找 public static int binarySearch(int[] arr, int key) { int min, mid, max; min = 0; max = arr.length-1; mid = (min+max)/2; //第一个角标 //尾角标 //中间角标 while (arr[mid] != key) { //当key不等于中间元素时 if (key > arr[mid]) min = mid+1; else if (key < arr[mid]) max = mid -1; if (min > max)//查找的元素不存在 return -1; mid = (min+max)/2; } return mid; } 方法 2: public static void main(String[] args) { int[] arr = {1,4,8,10,12,35}; int key = 10; int index = binarySearch_2(arr, key); System.out.println(index); } //折半查找方法2:
public static int binarySearch_2(int[] arr, int key) { int min = 0, max = arr.length-1, mid; while (min <= max) { mid = (min + max)/2; if(key > arr[mid])//如果查找元素大于中间元素 min = mid+1; //则查找后半部分 else if(key < arr[mid])//如果查找元素小于中间元素 max = mid-1; //则查找前半部分 else return mid; } return -1; } 4.7.3 扩展 向一个有序数组插入新元素,使得该数组还是有序的,求插入的位置,算法如下: public static void main(String[] args) { int[] arr = {1,4,8,10,12,35}; int key = 2; System.out.println(getIndex(arr, key)); } //返回向有序数组插入新元素的数组位置,即新的元素插入在哪个位置使得数组还是 有序的 public static int getIndex(int[] arr, int key) { int min = 0, max = arr.length-1, mid; while (min <= max) { mid = (min + max)/2; if(key > arr[mid])//如果查找元素大于中间元素 min = mid+1; //则查找后半部分 else if(key < arr[mid])//如果查找元素小于中间元素 max = mid-1; //则查找前半部分 else return mid; } return min;//当max < min时,说明查找的元素位于 min }
分享到:
收藏