文章目录
JavaProject-IP归属地查询
1 中小型Java应用项目开发标准流程
1.1、项目概述
准确宏观上描述清楚项目要做什么
1.2、项目分析
确定项目的可行性-能干不能干
1.3、技术方案和开发计划
技术方案:将重难点需求的技术解决方法罗列清楚。
开发计划:什么人、什么时间、做什么事情
1.4、细节开发
coding
1.5、测试Bug修改与系统优化
用TestCase来测试系统问题,并修复
并针对关键环节进行必要的优化提升执行效率。
1.6、项目标准化
将项目的命名、包结构、运维规范等进行公司统一规范化管理。
1.7、正式上线
正式发布,对外提供相应的服务或是Jar包
2 IP归属地查询项目-标准开发流程落地
2.1、项目概述
给定一个IP地址,查询出其所在的归属地信息,即国家、省、市、区、具体位置等信息。
2.2、项目分析
将项目的开发步骤进行详细推敲罗列
1、读取IP地址库的数据
2、将文本数据转化成IP对象型数据,并加入相应的集合。
3、对IP对象集合排序,形成增序集合。
4、编写针对增序集合的二分查找算法,使之给定一个IP地址可以拿到对应的查询结果。
5、对查询结果进行个性化处理,比如打印、存到文件、存储到数据库等均可。
6、测试调优与Bug修复
2.3、技术方案和开发计划
技术方案:
1、读取IP地址库的数据(Java IO)
2、将文本数据转化成IP对象型数据,并加入相应的集合。(Java面向对象、集合操作)
3、对IP对象集合排序,形成增序集合。(Java集合、比较器)
4、编写针对增序集合的二分查找算法,使之给定一个IP地址可以拿到对应的查询结果。(对象二分查找算法实现)
5、对查询结果进行个性化处理,比如打印、存到文件、存储到数据库等均可。(Java IO-System.out)
6、测试调优与Bug修复
测试用例-TestCase
调优分类
计算调优
存储调优
以空间换时间,或是以时间换空间。
开发计划:什么人、什么时间、做什么事情
2.4、细节开发
1、读取IP地址库的数据,形成一个文本行集合。(Java IO)
File
FileInputStream
InputStreamReader
BufferedReader
List
ArrayList
2、将文本数据转化成IP对象型数据,并加入相应的集合。(Java面向对象、集合操作)
3、对IP对象集合排序,形成升序集合。(Java集合、比较器)
业务问题转化成技术问题
先技术解决,后业务应用
冒泡排序
时间时杂度:
计算次数的量级
O(1)
O(log2N)
O(n)
O(nlog2n)
O(n2)
空间复杂度:
O(1)
4、编写针对升序集合的二分查找算法,使之给定一个IP地址可以拿到对应的查询结果。(对象二分查找算法实现)
基本数据类型的二分查找
对象数据类型的二分查找
IPPojo对象类型的二分查找
5、对查询结果进行个性化处理,比如打印、存到文件、存储到数据库等均可。(Java IO-System.out)
6、测试调优与Bug修复
测试用例-TestCase
调优分类
计算调优
存储调优
以空间换时间,或是以时间换空间。
2.5、测试Bug修改与系统优化
用TestCase来测试系统问题,并修复
并针对关键环节进行必要的优化提升执行效率。
2.6、项目标准化
将项目的命名、包结构、运维规范等进行公司统一规范化管理。
2.7、正式上线
正式发布,对外提供相应的服务或是Jar包
3 开发项目注意事项
3.1 数据开发注意事项
数据敏感性
数据洞察:抽样检查和数据统计分析
例如:将文件数据读入集合中时,注意检查是否按照预期正确读入,是否有少读,多读,错读等问题
3.2 硬编码能力
硬编码就是放弃很多的技巧,甚至不讲究技巧,通过自己过硬的编码能力,完全还原自己对一个问题的解决方法
3.3 比较大小的效率
最高的一定是二进制
其次应该是数值型
最后就是非数值型
3.4 测试用例基本原则
边界外测试
边界测试
边界内测试
3.5 数据初始化的时机
系统启动完成前:
static方法块
系统启动完成后
static还是成员方法均可
3.6 遇到陌生的业务问题的通用解决方法
先解决技术问题
后解决业务问题
4 IP归属地查询开发中的具体问题和解决方法
4.1 在文件操作时文件不存在问题
在文件操作时,必须判断文件是否存在以及是否是文件,否则输入文件路径不存在时就会出现异常
File file = new File(pathString);
// 判断是否是文件以及文件是否存在
if (file.isFile() && file.exists())
4.2 导入数据编解码格式不一致的问题
在编写IO流的时候加上转换流,指定指定的编解码格式
// 创建转换流,统一设置编码格式
InputStreamReader isr = new InputStreamReader(
new FileInputStream(file), "utf-8");
// 创建缓冲流
BufferedReader br = new BufferedReader(isr);
4.3 文件操作按行读取文件时空行问题
在用readLine()方法按行读取文本文件时,最好进行边界检验,防止出现读入空行或者出现异常
while ((lineText = br.readLine()) != null) {
// 边界检验
if (lineText == null || lineText.trim().length() == 0) {
continue;}
4.4 流操作中文件已打开问题
在流操作过程中,如果完成流操作不把流关闭,那么此时再操作文件就会出现异常
// 关闭所有流
br.close();
4.5 存储的数据结构选择问题
因为此次项目重点是运用查找和排序快,想要实现方便而且查找效率高的话,建议选择数组或ArrayList集合,其中数组的内存是连续的,查找效率高,且ArrayList和数组有下标,为使用二分法查找和冒泡排序提供遍历
4.6 Object集合排序实现问题
必须让Object类对象实现comparable接口或者实现comparator的继承类,重写compareTo方法即可调用Collections.sort(List)方法进行排序
//实现comparable接口
public class IP implements Comparable<IP>
// 重写compareTo方法实现排序
@Override
public int compareTo(IP ip) {
long temp = this.longIPStart - ip.longIPStart;
return temp > 0 ? 1 : (temp < 0 ? -1 : 0);
}
// 调用方法将文本集合转换为对象集合
ArrayList<IP> IPList = textListToipList(textList);
// 对对象集合进行排序
Collections.sort(IPList);
4.7 集合转换为数组问题
在集合转换为数组的时候,强制转换会导致出现异常,所以我认为最好的方法是运用集合的toArray方法进行转换
IP[] IPArr = new IP[0];
// 将集合转换为数组
IPArr = IPList.toArray(IPArr);
注意:
在使用toArray方法前,必须先定义一个相关的数组传入,否则会出现转换失败,在创建数组时,容量低于集合的容量会自动扩充,容量高于集合的容量时会从前往后填充数据,剩余的空间填充null
4.8 递归查找问题
在进行递归的时候必须明确终止条件和递归条件,否则递归就会出现问题
4.9 switch(OP)键盘获取OP输入错误问题
在定义OP的类型时,最好定义为字符串类型,如果定义为基本数据类型,那么输入小数或者字符串时会直接报错,如果是字符串类型那么可以在switch中再进行判断处理
5 项目优化
5.1 如何对项目进行优化
包括计算性能和存储性能
性能优化一般是指响应时间优化,也就是计算性能优化,即如何响应的又快又好。
5.2 优化思路
1、找到系统计算性能瓶颈
对系统运行进行解耦操作,分析出几个重要的核心计算模块以及其当下的运行时间。
本系统步骤:
(1、读文件
(2、转成对象集合
(3、排序
(4、转换成数组
(5、查找
2、针对具体瓶颈问题,进行具体分析和解决方案制定
3、需要对瓶颈问题进行迭代发现和处理
4、进行性能优化总结
5.3 性能优化技巧
直接优化
算法层面硬优化
间接优化
预计算
缓存计算结果
序列化环节优化
减少文件大小
提高IO效率
编解码优化
采用base64等等
用户体验优化
相关参数配置文件化
相关资源链接: https://download.csdn.net/download/simplelove0519/20214867