我们知道程序员都必须用大屏显示器,而且还要竖起来,才能看全一个方法!只要一提到长函数:被迫理解一个长函数在一个长函数中,小心翼翼地找出需要的逻辑,按需求微调几乎所有程序员都会有类似经历。没人喜欢长函数,但你却要一直和各种长函数打交道。几百上千行的函数肯定是不足以称霸的。多长的函数才算“长”?100 行?对于函数长度容忍度太高了!这是导致长函数产生的关键点。
不管是日本人设计的 Ruby还是巴西人设计的 Lua,各种语法采用的全都是英语。所以,想要成为一个优秀的程序员,会用英语写代码是必要的。你肯定听说过,国内有一些程序员用汉语拼音写代码,这就是一种典型坏味道。而且程序设计语言已支持 UTF-8,用汉语拼音写代码,还不如用汉字直接写代码。这场景太低级了,不过多讨论。违反语
目标精通 Spring Data Redis 操作流程。Spring Data提供了对市场上主流数据库支持:Spring Data CommonsSpring Data JPASpring Data KeyValueSpring Data LDAPSpring Data MongoDBSpring Data RedisSpring Data RESTSpring
刚开始工作时,总有人开玩笑说,编程实际上就是 CV,调侃很多程序员写程序依靠的是复制粘贴。至今,很多初级甚至高级程序员写代码依旧是复制粘贴,就是把其他项目里的一段代码复制过来,稍加改动,然后,跑一下没有大问题就完事。这就是在给子孙后代挖坑。通常只要这些复制代码其中有一点逻辑要修改,就意味着所有复制粘贴的地方都要修改。所以实际项目中
每个程序员一想到,一个方法坐拥几十上百个参数,内心就不再平静了。方法为何要有参数?不同函数间需共享信息,于是有了参数传递。函数间共享信息的方式不止一种,除了参数列表,还有全局变量。但全局变量总能带来意外惊喜,所以,取消全局变量也是各大语言的趋势。但函数之间还是要传递信息的,不能用全局变量,那参数就成了最佳选择,于是,只要你想到有什么信息要传给一个
Spring Bean 的初始化过程及销毁过程中的一些问题。有些bug可在 Spring 异常提示下快速解决,但却不理解背后原理一些错误,不易在开发环境下被发现,从而在产线上造成较为严重后果1 构造器内抛NPE构建宿舍管理系统时
1 基本概念 1.1 并发同时拥有两个或者多个线程,如果程序在单核处理器上运行多个线程将交替地换入或者换出内存,这些线程是同时“存在"的,每个线程都处于执行过程中的某个状态,如果运行在多核处理器上,此时,程序中的每个线程都将分配到一个处理器核上,因此可以同时运行. 1.2 高并发( High Concurrency)互联网分布式系统架构设计中必须考虑的因
修改文件 CompilerConventionsPlugin.java,将-Werror屏蔽掉即可屏蔽后重新编译,依然会有警告,但是不会当做错误处理,能正常编译完
在高并发大流量下,数据库层的演进过程以及库表设计上的考虑点。电商系统在完成DB主从分离和分库分表后,可支撑十几万DAU,系统架构如下:DB分了主库和从库,数据也被切分到多个DB节点。
Spring AOP则利用CGlib和JDK动态代理等方式来实现运行期动态方法增强,为的是抽离出业务无关代码,使其不与业务代码耦合,从而降低系统的耦合性,提高程序的可重用性和开发效率。
对系统增加MQ对峰值写流量做削峰填谷,对次要业务逻辑做异步,对不同系统模块做解耦。因为业务逻辑从同步代码中移除了,所以也要有相应队列处理程序处理消息、执行业务逻辑,这时系统架构:随着业务逻辑复杂,会引入更多外部系统和服务,就会越来越多使用MQ与外部系统解耦合以及提升系统性能。
Spring AOP则利用CGlib和JDK动态代理等方式来实现运行期动态方法增强,为的是抽离出业务无关代码,使其不与业务代码耦合,从而降低系统的耦合性,提高程序的可重用性和开发效率。所以AOP广泛应用在日志记录、监控管理、性能统计、异常处理、权限管理、统一认证等各个方面被广泛使用的技术。
有读者看到标题就开始敲键盘了,我知道,命名不就是不能用 abc、123 命名,名字要有意义嘛,这有什么好讲的?然而,即便懂得了名字要有意义,很多程序员依然无法逃离命名沼泽。
1 泛型与类型擦除泛型,JDK 1.5新特性,本质是参数化类型(Parametersized Type) 的应用,即所操作的数据类型被指定为一个参数。这种参数类型可用在:类接口方法的创建中, 分别称为:泛型类泛型接口泛型方法在Java还没有泛型的版本时。
集合类型的自动注入是Spring提供的另外一个强大功能。我们在方便的使用依赖注入的特性时,必须要思考对象从哪里注入、怎么创建、为什么是注入这一个对象的。
Java与线程。
LinkedHashMap维护插入的顺序。元素存储关系红黄箭头:元素添加顺序蓝箭头:单链表各个元素的存储顺序head:链表头部tail:链表尾部继承体系继承自 HashMap ,因此 HashMap 拥有的荣耀它也都有.2 属性双向链表的头(最老)双链表的末尾(最小)HashMap.Node的子类:常规 LinkedHashMap 节点,增加了 before 和 after
有时我们会使用@Value自动注入,同时也存在注入到集合、数组等复杂类型的场景。这都是方便写 bug 的场景。1 @Value没有注入预期值在字段或方法/构造函数参数级别使用,指示带注释元素的默认值表达式。通常用于表达式驱动或属性驱动的依赖注入。 还支持处理程序方法参数的动态解析——例如,在 Spring
当年某站被黑客攻击,超过百万用户的邮箱和密码明文被泄露,很多网友对该站明文保存用户密码行为产生了不满。如果是你,会如何存储用户密码这种重要
基本概念树,一种非线性表数据结构:节点“树”里面的每个元素父子关系连线相邻节点之间的关系兄弟节点节点的父节点是同一个节点根节点没有父节点的节
约定大于配置,convention over configuration,也称按约定编程,一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。本质是说,开发人员仅需规定应用中不符约定的部分。例如,如果模型中有个名为Sale的类,那么数据库中对应的表就会默认命名为sales。只有在偏离这一约定时,例如将该表命名为"products_sold",才需写有关这个名字的配置。如果所用工具的约定与期待相符,便可省去配置;反之,可以配置来达到所期待的方式。动机设计不好的框架通常
您应该将客户端选项添加到 MySQL 连接器中,allowPublicKeyRetrieval=true以允许客户端自动从服务器请求公钥。AllowPublicKeyRetrieval=True允许恶意代理执行 MITM 攻击以获取纯文本密码,因此默认情况下它是false!必须显式开启。也可以使用如下配置:useSSL=false所以,最终修改 db 配置如下即可:
链表实现的LRU缓存淘汰算法的时间复杂度是O(n),当时我也提到了,通过散列表可以将这个时间复杂度降低到O(1)。Redis的有序集合是使用跳表来实现的,跳表可以看作一种改进版的链表。Redis有序集合不仅使用了跳表,还用到了散列表。LinkedHashMap也用到了散列表和链表两种数据结构。散列表和链表都是如何组合起来使用的,以及为什么散列表和链表会经常放到一块使用。LRU缓存淘汰算法链表实现LRU需要维护一个按照访问时间从大到小有序排列的链表结构。因为缓存大小有限,当缓存空间不够,需要淘汰一个
mybatis会自动映射字段,在mapper.xml文件中,可以不写jdbcType显式指定数据类型,它会自动解析成相对应的Java数据类型,但是今天写代码就遇到了问题:业务场景是需要根据不同权限的用户查询不同数据,又因为一些历史原因,所以就直接将用户ID当字符串类型的参数传递进来。List<String> getOwnAssignedOrderNo(@Param("backendId") String backendId, @Param("userId") String userId);
知道跳表(Skip List)是在看关于Redis的书的时候,Redis中的有序集合使用了跳表数据结构。接着就查了一些博客,来学习一下跳表。后面会使用Java代码来简单实现跳表。什么是跳表跳表由William Pugh发明,他在论文《Skip lists: a probabilistic alternative to balanced trees》中详细介绍了跳表的数据结构和插入删除等操作,论文是这么介绍跳表的:Skip lists are a data structure that can be
sidebarDepth: 3条件构造器说明以下出现的第一个入参boolean condition表示该条件是否加入最后生成的SQL中,例如:query.like(StringUtils.isNotBlank(name), Entity::getName, name) .eq(age!=null && age >= 0, Entity::getAge, age)以下代码块内的多个方法均为从上往下补全个别boolean类型的入参,默认为true,如:以下出现的泛型.
1 常规去重碰到List去重的问题,除了遍历去重,我们常常想到利用Set集合不允许重复元素的特点,通过List和Set互转,来去掉重复元素。// 遍历后判断赋给另一个List集合,保持原来顺序public static void ridRepeat1(List<String> list) { System.out.println("list = [" + list + "]"); List<String> listNew = new ArrayList<S
使用Java反射,可以在运行时检查一个方法的信息以及在运行期调用这个方法,通过使用java.lang.reflect.Method类就可以实现上述功能。获取Method对象可以通过Class对象获取Method对象,如下例:Class aClass = ...//获取Class对象Method[] methods = aClass.getMethods();返回的Method对象数组包含了指定类中声明为公有的(public)的所有变量集合。如果你知道你要调用方法的具体参数类型,你就可以直接通过
类图案例1:@startumlabstract class AbstractListabstract AbstractCollectioninterface Listinterface CollectionList <|-- AbstractListCollection <|-- AbstractCollectionCollection <|- ListAbstractCollection <|- AbstractListAbstractList <
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号