发表于: 2020-11-20 23:10:16

1 1425


今天完成的事情:
增强的 for 循环和普通 for 循环的区别

今天我们来比较一下两种for循环对ArrayList和LinkList集合的循环性能比较。首先简单的了解一下ArrayList和LinkList的区别:

ArrayList是采用数组的形式保存对象的,这种方式将对象放在连续的内存块中,所以插入和删除时比较麻烦,查询比较方便。

内存块展示不知道,直接得出结论吧,增删慢,查询快

LinkList是将对象放在独立的空间中,而且每个空间中还保存下一个空间的索引,也就是数据结构中的链表结构,插入和删除比较方便,但是查找很麻烦,要从第一个开始遍历。

数据结构中的链表结构,不知道,结论:增删快,查询man
一.ArrayList 底层维护的是一个Object数组,默认的元素个数为10,ArrayList的特点是增删慢查询快
1.增加慢的原因:是因为在添加数据的时候,有可能会导致ArrayList底层维护的数组的元素个数不够用,这时候就会调用数组的grow方法进行扩容,而扩容的方法是创建一个新的数组,然后把老数组中的信息复制到新的数组当中,这个拷贝的过程很浪费时间和内存
2.删除慢的原因:因为删除某一个元素,会导致该元素后面的元素进行整体前移,也是一个拷贝的过程,这个拷贝过程非常的浪费时间
3.查询快的原因:ArrayList底层维护的是一个数组,可以通过数组的下标直接查询到数组中的内容,这种方式非常的快。
二.LinkList底层维护的是一个链表,所以LinkList的特点是增删快,查询慢
1.增删快的原因:因为LinkList底层维护的是一个链表,在增删的时候可以直接添加到要添加的位置或者直接删除要删除的部分,对其他部分没有影响,速度非常的快。
2.查询慢的原因:因为LinkList底层维护的是一个链表,查询的时候必须一个一个的进行查询,知道找到匹配的数据为止,这个过程非常的浪费时间。

将ArrayList和LinkList分别插入10万条记录

测试代码:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class Foreach {
public static void main(String[] args){
//这里可以用int测试一下,会报错,Type argument cannot be of primitive type(类型参数不能是基本类型)
List<Integer> arrayList = new ArrayList<Integer>();//创建arrayList对象,参数为Integer
List<Integer> linkList = new LinkedList<Integer>();
//每个集合插入10万条数据
for (int i = 0i < 100000i++){
arrayList.add(i);
linkList.add(i);
}
int arry = 0;
System.out.println("==========遍历arrayList=========");
//for循环arrayList
long forStartTime = System.currentTimeMillis();//获取当前时间的毫秒数,可以通过毫秒数进行时间比较,时间转化以及时间格式化等。
for (int i = 0i < arrayList.size()i++){//size() 方法用于返回动态数组中元素的数量
arry = arrayList.get(i);//arrayList.get(i)获取在索引值为i处的元素,i赋值给arry,遍历arrayList集合
}
long forEndTime = System.currentTimeMillis();
System.out.println("for遍历需要:+(forEndTime-forStartTime)+ "毫秒");
System.out.println(arry);
//用增强for循环arrayList
long forUpStartTime = System.currentTimeMillis();
for (Integer in : arrayList){
arry = in;
}
long forUpEndTime = System.currentTimeMillis();
System.out.println(arry);
System.out.println("增强for遍历需要:+ (forUpEndTime - forUpStartTime) + "毫秒");
System.out.println("=======linklist=======");
//for循环linkList
long linkForStartTime = System.currentTimeMillis();
int link = 0;
for(int i = 0i < linkList.size() ;i++){
link = linkList.get(i);
}
long linkForEndTime = System.currentTimeMillis();
System.out.println("for遍历需要:"+(linkForEndTime - linkForStartTime)+"毫秒");
//用增强for循环linkList
long linkForUpStartTime = System.currentTimeMillis();
for (Integer in : arrayList){
link = in;
}
long linkForUpEndTime = System.currentTimeMillis();
System.out.println("增强for遍历需要:+ (linkForUpEndTime - linkForUpStartTime) + "毫秒");
}
}

运行结果:

数据为100万的时候



可以看出遍历arrayList,for循环比增强for循环快2毫秒,遍历linklist的时候,数据为10万条,差距很大,数据为100万条,等了6分钟,依旧没出现结果。


结论:
使用arrayList,使用普通for循环,因为for循环采用下标访问(增强的for循环不能访问下标值),对于数组结构的数据来说,采用下标访问比较好

使用linklist,应该使用增强for循环,不能使用普通for循环,数据量大的时候,会直接跑不通,跑很久出现不了结果。



下午看了 b站编程基础课程,果冻公开课
了解什么是编程,从大来讲,手机上的app或者电脑软件都是从无到有创造出来的,这个过程就编程。
从小来讲编程就是几百行和几百万行代码的集合,每行代码都是一条指令,每条指令都有特别的用处,都是用来控制CPU的,这种叫汇编语言。

由于汇编语言比较复杂,所以创造了高级语言(C,JAVA,JS,PYTHON等)。编程就是把高级语言通过编译器,变成指令(汇编语言),去控制CPU,去做自己想做出来的东西。



顺序  分支  循环
学好编程,JAVA,api,伪代码思路(程序的运行逻辑,各种类之间一一对应关系)
伪代码=逻辑,一般运用的这三个顺序  分支  循环

伪代码:做事的顺序,逻辑要清晰,重点,需要知道自己写的代码是个什么东西,比如mybatis,你需要知道它是怎么运行的,其实可以看DEBUG,知道先从数据库连接池中获取对象,然后通过JDBC连接数据库,运行测试的代码,目的是将SQL语句传到数据库中去,传入参数,根据参数在数据库中查询,然后将结果返回,在控制台打印输出。然后关闭数据库连接,将对象放回到连接池中。结束了。



基本概念,

基本数据类型(number数字型 int  float,string文本型 char string byte),对0101组合的定义,
高级数据类型,图片,音乐,视频。       
表达式(int i = o;)
函数( i = i+1)
变量  常量  表达式(int i = 0;)  属性  对象  实例  类  函数  参数  返回值
变量,类由变量构成,给变量赋值,让类变成实例,变量在对象里面,称为对象的属性
常量,设置了,在其他位置就不能更改,在一个Java程序运行过程中,
根据类创建对象,赋值之后就是实例了
函数,输入一个值,中间的就是函数,会给你返回一个值

方法,,调用这个方法,输入值  参数    返回值  数据  只有一个



使用什么编程,从文本编辑器到脚本编辑器 (notepad++),这两个都没用过,
最后到IDE(就是现在使用的IDEA),集成了代码编写功能、分析功能、编译功能、调试功能。

源码的管理(多人协作时很方便管理,上传代码到同一台服务器),git分布式,svn集中式



复用  轮子  公共包,三方库,想到用到mybatis,spring这些都是框架,里面封装了很多类和包,比如JDBC连接,事务管理,和数据库交互的各种方法等等,我们不用自己多写程序,直接调用就行了。



看到这副图,真是看起来简单,做起来相当的困难啊。

想到目前用到的知识,MySQL,JDBC,mybatis,spring,springmvc,tomcat,jsp,服务器。



整理mybatis

1. jdbc.properties中的    jdbc.url=jdbc:mysql://localhost:3306/db4   ,一直没了解localhost:3306,把这个当成了固定的用法,现在知道这个是映射到本地接口:3306,localhost:可以修改成网址。



2.    <mappers>
        <package name="resources"></package>
    </mappers>

使用包路径会报错,因为resources在这里不是一个包,你可以创建一个包然后把Mapper.xml文件放进去,就可以找到了。



3.在mybatis中第一次采用这个方式,之前在一直在写重复代码,标记下来
private InputStream in;
private SqlSession sqlSession;
private StudentDao studentDao;
@Before//用于在测试方法执行之前执行
public void init()throws Exception{
//1.读取配置文件,生成字节输入流
in = Resources.getResourceAsStream("Mybatis-config.xml");
//2.获取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.获取SqlSession对象
sqlSession = factory.openSession(true);
//4.获取dao的代理对象
studentDao sqlSession.getMapper(StudentDao.class);
}
@After//用于在测试方法执行之后执行
public void destroy()throws Exception{
//提交事务
sqlSession.commit();
//6.释放资源
sqlSession.close();
in.close();
// 记录debug级别的信息
logger.debug("This is debug message.");
// 记录info级别的信息
logger.info("This is info message.");
// 记录error级别的信息
logger.error("This is error message.");
}




明天计划的事情:

查看接口定义格式,分别给出CRUD的接口文档格式


 根据接口文档,使用Spring Rest 编写对应的Controller,日志记录接收参数后,暂时不用写业务逻辑,直接返回JSP,直接用Json Tag-lib 生成假数据


遇到的问题:


学到linklist和增强for循环时,看到需要用到Iterator接口,十分纠结要不要学,纠结了一会,还是决定不往深处了解了。



收获:焦虑满满,日报很水,下品见





返回列表 返回列表
评论

    分享到