----》正射 知道创建什么对象,一路调用下去
----》反射 而反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用 new 关键字来创建对象了。
就好比idea 你输入一段文字,idea编译器会出现多个-10多个提示,调用你想要的调用方法的过程。
举个例子
我们发的卷子出的题都是一样的 相当于一个类 ,而每个同学做的都相当于对象了
造汽车的图纸相当于类,而造出来的汽车相当于对象了
每个学校的老师是一个类,但是具体到每个老师就是对象了
类和对象的区别
1,类是一个抽象的概念,它不存在于现实中的时间/空间里,类只是为所有的对象定义了抽象的属性与行为。就好像“Person(人)”这个类,它虽然可以包含很多个体,但它本身不存在于现实世界上。
2,对象是类的一个具体。它是一个实实在在存在的东西。
3,类是一个静态的概念,类本身不携带任何数据。当没有为类创建任何对象时,类本身不存在于内存空间中。
4,对象是一个动态的概念。每一个对象都存在着有别于其它对象的属于自己的独特的属性和行为。对象的属性可以随着它自己的行为而发生改变。
Spring 框架中用到了哪些设计模式?
工厂设计模式 : Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
代理设计模式 : Spring AOP 功能的实现。
单例设计模式 : Spring 中的 Bean 默认都是单例的。
模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。
流只能运行(调用中间或终端流操作)一次。 这排除了例如“分叉”流,其中相同的源提供两条或多条流水线,或同一流的多遍。 如果流实现可能会丢失IllegalStateException,如果它检测到该流被重用。 然而,由于一些流操作可能返回其接收器而不是新的流对象,所以在所有情况下可能无法检测到重用。
可以在建一个新的流
或者
用这转换处理一下
intStream =Arrays.stream(intArr);
本文对于初学者建议
最简洁的代码实现最强的逻辑
永远记住这一点
这有利于你不断优化代码
代码复用不复用要看情况
没有绝对的好处,没有绝对的坏处
就是有的时候不得不时间和空间做一个选择一样!
并且代码必须要规范,这很大程度可以好理解,好维护!
业务之上请务必追求技术
资源不能过度浪费,没有必要打日志,和捕获异常的一般不要去做
Java规范建议越早养成越好,后面可能越来越不想改变。Java规范其实不难,写代码的时候多花几分钟解决的事情。
可参考百度 阿里Java代码规范pdf
因为需求一直在变,所以要考虑程序的可维护性、可扩展性,许多东西不要写死
错误信息怎么传递?
在发生错误的时候,调用系统或远程的api,通常有返回值提示。当然有些api也会用全局变量告诉你错误信息
然后就是最常见的一种try catch,这种就是有的时候会影响一点点性能
为了让自家代码质量越来越高,建议写完后理一下思路,从头到尾看一遍,可能自己都有优化的想法
程序自测bug也是一种能力。
未采点位思路
信息要 点位 店铺地址 所属省市 完成期限
user用户、完成期限 task点位 店铺地址 project所属省市
是否采集过了
detail表里面和采集表shop_id关联采集表
所以要连接四张表 user task project detail
主表
采集表 task
去连接其他三个表
还要连接collection_shop表
加起来四个表
地方从项目进去
需要的资源连接
1、数据响应结构设计
2、代码性能优化
=====功能实现了
明天处理一下小细节
shop_name相同做个校验
明天自己插一个已采数据去
select * from survey_shop_user where
survey_id in
#{item}
and user_id = #{userId}
可能返回多个值,很明显,点位分析有多个在那里,所以特殊性解决一下。
快速处理项目点位的多个细节问题。
圆和多边形:
首页进入即可
无判断,直接添加,survey_id插入为null;
新址,竞争,协同其中一个加一
点位:
从点位列表进入,携带projectId。
新址。
user新址加一
====》
save接口
做个采集id判定
1 采集id为null
survey_id插入为null;
2 采集id为null直接插入
surveyShopUser里面的getFinishNewShop怎么表现
surveyShopUser这个表怎么去更新,过去用userId和surveyId去更新,是因为圆和多边形的是时候这样可以判定是唯一的。
更新考察点任务已完成要到列表去完成
总结:app要有原型图更快速开发。
一、Java优化不要轻易的新增接口
新接口替代老接口,会使得程序看起来杂乱无章
回头来看,这弃用的接口到底用来干嘛的
然后
我们也要首先查询是否有相应的枚举类,接口类常量去使用
而不是直接创建
合理的利用资源,这样更高效
新接口是为了实现新的功能,往往不是为了优化,仅仅而已。
一切规范为了个人成长以及后续代码维护有益
二、代码的严谨好处
减少各类错误的出现,常见的空指针异常,一对多,多对一滥用
提高代码性能,比如你只得到User对象id字段就可以了(后续维护的概率不高的情况下),返回User对象往往显得繁杂。还有查询的时候可适当加些条件,以防本来只需要limit 1条数据,查出一大堆对象来,对程序来说没有好处。
捕获异常应该综合考虑
过多了明显影响性能,造成资源的浪费
过少了,各类异常影响线上环境,加的一段代码是否会影响到整体
日志也是如此,太多的日志没人看,浪费时间
日志关键打出来
错误报错可能使得不得不多些日志已达快速解决问题
基本介绍 Java对象用来解决数组存在的一些问题
1》》ArrayList
排列有序、可重复------》有序的,所以访问速度快
底层用的是数组----》ArrayList 在小于扩容容量的情况下其实增加操作效率是非常高的,在涉及扩容的情况下添加操作效率确实低,删除操作需要移位拷贝,效率是低点。(主要就是扩容麻烦)
线程不安全
2》》Vector(最早出来的)
排列有序、可重复------》有序的,所以访问速度快
底层用的是数组----》ArrayList 在小于扩容容量的情况下其实增加操作效率是非常高的,在涉及扩容的情况下添加操作效率确实低,删除操作需要移位拷贝,效率是低点。(主要就是扩容麻烦)
线程安全、效率低
3》》LinkedList
排列有序、可重复------》有序的,所以访问速度快
底层使用的事双向循环链表数据结构
使用上:随机访问速度慢,增删块
线程不安全
1》》HashSet
排列无序,不可重复
底层用的是Hash表实现
存储速度快
内部是HashMap
2》》TreeSet
有序,不可重复
底层用二叉树实现
排序存储
内部是TreeMap的
Map
键值对的形式展示出来
HashMap运行速度快
TreeMap排序
HashLinkedMap在HashMap、TreeMap之间,具备两者的优点