
java
文章平均质量分 53
鸭梨山大哎
life hard take it easy
展开
-
Python文件操作
Python 的文件操作非常灵活,能够满足大多数文件处理需求。通过open()函数可以打开文件,使用read()write()等方法可以读写文件内容,使用with语句可以确保文件正确关闭。此外,os和shutil模块提供了更多的文件操作功能。原创 2025-02-11 22:57:20 · 272 阅读 · 0 评论 -
Python动态特性详解
特性Python(动态特性)Java(静态特性)类型系统动态类型,变量类型可随时改变静态类型,变量类型在编译时确定属性和方法可在运行时动态添加类的结构在编译时固定模块导入支持运行时动态导入必须在编译时导入代码执行支持动态执行字符串代码不支持直接动态执行代码反射语法简洁,支持运行时操作对象支持反射,但语法复杂动态生成类支持动态生成类不支持直接动态生成类Python 的动态特性使其非常灵活,适合快速开发和原型设计,但也可能带来运行时错误和维护难度。原创 2025-02-11 00:00:47 · 948 阅读 · 1 评论 -
Python与Java函数嵌套对比
Python 和 Java 都支持函数嵌套(即在函数内部定义函数),但它们的实现方式、语法和使用场景有所不同。原创 2025-02-10 23:51:52 · 843 阅读 · 0 评论 -
对比下java scala python的lambda
需要注意的是,Java、Scala 和 Python 中的 Lambda 表达式都有一些限制,例如不能访问非 final 变量、不能使用 break 或 continue 语句等。在上面的代码中,Lambda 表达式 lambda name: print(name) 接受一个名为 name 的参数,并将其打印到控制台上。在上面的代码中,Lambda 表达式 name => println(name) 接受一个名为 name 的参数,并将其打印到控制台上。在上面的代码中,Lambda 表达式。原创 2023-05-06 22:42:11 · 172 阅读 · 0 评论 -
对比下java scala python js 对不可变变量的处理
所以总体来说,Scala对不可变变量和不可变对象的支持最好,Java和JavaScript的支持较弱,Python不支持。选择语言时,如果需要线程安全和理想的不可变性,Scala会是更好的选择。如果需要灵活性和易变性,Python会更合适。Python和ES6: 不支持定义不可变对象。原创 2023-05-05 22:35:36 · 145 阅读 · 0 评论 -
heap和stack有什么区别
【代码】heap和stack有什么区别。原创 2023-05-03 09:18:00 · 184 阅读 · 0 评论 -
Object类的equals方法
equals方法很多面试题都会问equals方法和 == 运算符的区别,== 运算符用于比较基本类型的值是否相同,或者比较两个对象的引用是否相等,而equals用于比较两个对象是否相等,这样说可能比较宽泛,两个对象如何才是相等的呢?这个标尺该如何界定?首先来看Object类中的equals方法:public boolean equals(Object obj) { return (this == obj); }可以看到,在Object类中,==运算符和equals方法是等价的原创 2021-07-01 21:26:49 · 1662 阅读 · 0 评论 -
为什么java.lang包下的类不需要手动导入
在使用诸如Date类时,需要手动导入import java. util. Date,再比如使用File类时,也需要手动导入import java. io. File。但是在使用Object类、String类和Integer类等时不需要手动导入,而能直接使用,这是为什么呢?这里先告诉读者一个结论:使用java. lang包下的所有类,都不需要手动导入。另外介绍一下Java中的两种导包形式:1)单类型导入(single-type-import),例如import java. util. Date。2)按需原创 2021-07-01 21:16:04 · 5162 阅读 · 6 评论 -
Spring Boot pom文件
Spring Boot项目下的pom.xml文件主要用来存放依赖信息,具体代码如下(部分代码已省略):<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.or原创 2021-06-30 21:55:58 · 680 阅读 · 0 评论 -
Spring Boot入口类
入口类的代码很简单,代码如下:package com.example.demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class DemoApplication { public static void main(String[]原创 2021-06-30 21:50:31 · 728 阅读 · 0 评论 -
Spring Boot文件目录介绍
创建Spring Boot项目后,会产生一个工程目录,该工程目录存放了工程项目的各种文件,对于Spring Boot开发人员来说,了解该工程目录非常必要。• /src/main/java:目录下放置所有的Java文件(源代码文件)。• /src/main/resources:用于存放所有的资源文件,包括静态资源文件、配置文件、页面文件等。• /src/main/resources/static:用于存放各类静态资源。• /src/main/resources/templates:用于存放模板文件,原创 2021-06-30 21:46:43 · 2443 阅读 · 1 评论 -
Spring Boot的优点入门
谈到Spring Boot,就让我们先来了解它的优点。依据官方的文档,Spring Boot的优点如下:•创建独立的Spring应用程序;•嵌入的Tomcat、Jetty或者Undertow,无须部署WAR文件;•允许通过Maven来根据需要获取starter;•尽可能地自动配置Spring;•提供生产就绪型功能,如指标、健康检查和外部配置;•绝对没有代码生成,对XML没有要求配置。这段描述告诉我们,首先Spring Boot是一个基于Spring框架搭建起来的应用,其次它会嵌入Tomcat原创 2021-06-30 21:36:10 · 315 阅读 · 0 评论 -
注解与XML
只是在Spring早期的1.x版本中,由于当时的JDK并不能支持注解,因此只能使用XML。而很快随着JDK升级到JDK5,它加入了注解的新特性,这样注解就被广泛地使用起来,于是Spring的内部也分为了两派,一派是使用XML的赞同派,一派是使用注解的赞同派。为了简化开发,在Spring 2.x之后的版本也引入了注解,不过只是少量的注解,如@Component、@Service等,但是功能还不够强大,因此对于Spring的开发,绝大部分的情况下还是以使用XML为主,注解为辅。到了Spring 3.0后,引入原创 2021-06-30 21:32:02 · 223 阅读 · 0 评论 -
Java EE服务技术
Java EE容器为组件提供了各种服务,这些服务是企业应用经常用到但开发人员难以实现的,例如命名服务、数据库连接、上下文和依赖注入、事务、安全和连接框架等。现在这些服务已经由容器实现,因此Java EE组件只要调用这些服务就可以了。1.命名服务企业应用中通常包含大量的组件,为了完成功能需求,组件间通常要相互调用。JND(I Java Naming and Directory Interface, Java命名和目录服务接口)简化了企业应用组件之间的查找调用。它提供了应用的命名环境(namingenvir原创 2021-06-30 21:28:03 · 344 阅读 · 0 评论 -
Java EE组件技术
组件是Java EE应用的基本单元。Java EE 6提供的组件主要包括三类:客户端组件、Web组件和业务组件。1.客户端组件用户通过客户端组件与企业应用进行交互。Java EE客户端既可以是一个Web浏览器、一个Applet,也可以是一个应用程序。(1)Web浏览器。Web浏览器又称为瘦客户。它通常只进行简单的人机交互,不执行如查询数据库、业务逻辑计算等复杂操作。(2)Applet。Applet是一个用Java语言编写的小程序,运行在浏览器上的虚拟机里,通过HTTP等协议和服务器进行通信。(3)原创 2021-06-30 21:22:56 · 1005 阅读 · 0 评论 -
Java EE设计思想
为了更好地学习Java EE,首先要领会Java EE的设计思想。社会要想发展进步,其根本在于每个社会成员都“各司其职,各尽其责”,对于一个复杂的企业级应用系统也是如此。本着这种合理分工的思想,Java EE将企业级应用分为两部分:实现基础支撑功能的容器和实现特定业务逻辑的组件。容器容器提供的底层基础功能被称为服务。这些服务主要用来实现企业级应用的共性需求,如事务、安全、可扩展性和远程连接等。组件通过调用容器提供的标准服务来与外界交互。为满足企业级应用灵活部署,组件与容器之间必须既松散耦合,又能够强有力原创 2021-06-30 21:16:46 · 229 阅读 · 0 评论 -
JVM的内存划分
JVM的内存区域分为线程私有区域(程序计数器、虚拟机栈、本地方法区)、线程共享区域(堆、方法区)和直接内存,如图1-2所示。线程私有区域的生命周期与线程相同,随线程的启动而创建,随线程的结束而销毁。在JVM内,每个线程都与操作系统的本地线程直接映射,因此这部分内存区域的存在与否和本地线程的启动和销毁对应。线程共享区域随虚拟机的启动而创建,随虚拟机的关闭而销毁。直接内存也叫作堆外内存,它并不是JVM运行时数据区的一部分,但在并发编程中被频繁使用。JDK的NIO模块提供的基于Channel与Buffer原创 2021-06-24 09:44:36 · 733 阅读 · 0 评论 -
Java为何能一次编写,到处运行
如果计算机的CPU指令集只有x86一种,操作系统也只有Windows一种,那也许Java语言就不会出现。Java在刚刚诞生之时曾经提出过一个非常著名的宣传口号:“一次编写,到处运行(Write Once,Run Anywhere)”,这句话充分表达了软件开发人员对冲破平台界限的渴求。在无时无刻不充满竞争的IT领域,不可能只有Wintel存在,我们也不希望只有Wintel存在,各种不同的硬件体系结构和不同的操作系统肯定会长期并存发展。“与平台无关”的理想最终实现在操作系统的应用层上:Sun公司以及其他虚拟机提原创 2021-06-10 23:55:25 · 1562 阅读 · 1 评论 -
java对象创建的细节
Java是一门面向对象的编程语言,在Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象(例如克隆、反序列化)通常仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样一个过程呢?虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。在类加载检查通过后,接下来虚拟机将为新生对原创 2021-06-10 23:34:39 · 119 阅读 · 0 评论 -
策略模式入门
策略模式,英文全称是 Strategy Design Pattern。在 GoF 的《设计模式》一书中,它是这样定义的:Define a family of algorithms, encapsulate each one, and make theminterchangeable. Strategy lets the algorithm vary independently fromclients that use it.翻译成中文就是:定义一族算法类,将每个算法分别封装起来,让它们可以互相替原创 2021-06-07 22:30:51 · 180 阅读 · 0 评论 -
模板方法模式入门
模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。这里的“算法”,我们可以理解为广义上的“业务逻辑”,并不特指数据结构和算法中的“算法”。这里的算法骨架就是“.原创 2021-06-07 22:20:18 · 111 阅读 · 0 评论 -
备忘录模式入门
备忘录模式,也叫快照(Snapshot)模式,英文翻译是 Memento Design Pattern。在 GoF 的《设计模式》一书中,备忘录模式是这么定义的:Captures and externalizes an object’s internal state so that it can berestored later, all without violating encapsulation.翻译成中文就是:在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以原创 2021-06-07 22:05:44 · 222 阅读 · 0 评论 -
观察者模式入门
观察者模式(Observer Design Pattern)也被称为发布订阅模式(Publish-Subscribe Design Pattern)。在 GoF 的《设计模式》一书中,它的定义是这样的:Define a one-to-many dependency between objects so that when oneobject changes state, all its dependents are notified and updatedautomatically.翻译成中文就原创 2021-06-06 17:52:28 · 109 阅读 · 0 评论 -
享元模式在 Java String 中的应用
享元模式在 Java String 类中的应用。同样,我们还是先来看一段代码,你觉得这段代码输出的结果是什么呢?String s1 = "小争哥";String s2 = "小争哥";String s3 = new String("小争哥");System.out.println(s1 == s2);System.out.println(s1 == s3);上面代码的运行结果是:一个 true,一个 false。跟 Integer 类的设计思路相似,String 类利用享元模式来复用相同的原创 2021-06-06 16:21:52 · 374 阅读 · 0 评论 -
享元模式在 Java Integer 中的应用
我们先来看下面这样一段代码。你可以先思考下,这段代码会输出什么样的结果。Integer i1 = 56;Integer i2 = 56;Integer i3 = 129;Integer i4 = 129;System.out.println(i1 == i2);System.out.println(i3 == i4);如果不熟悉 Java 语言,你可能会觉得,i1 和 i2 值都是 56,i3 和 i4 值都是 129,i1 跟 i2 值相等,i3 跟 i4 值相等,所以输出结果应该是两个原创 2021-06-06 16:17:40 · 232 阅读 · 0 评论 -
适配器模式的原理与实现
适配器模式的英文翻译是 Adapter Design Pattern。顾名思义,这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。对于这个模式,有一个经常被拿来解释它的例子,就是 USB 转接头充当适配器,把两种不兼容的接口,通过转接变得可以一起工作。原理很简单,我们再来看下它的代码实现。适配器模式有两种实现方式:类适配器和对象适配器。其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现。具体的代码实现如下所示。其中,ITar原创 2021-06-06 09:03:41 · 655 阅读 · 0 评论 -
门面模式入门
如果你平时的工作涉及接口开发,不知道你有没有遇到关于接口粒度的问题呢?为了保证接口的可复用性(或者叫通用性),我们需要将接口尽量设计得细粒度一点,职责单一一点。但是,如果接口的粒度过小,在接口的使用者开发一个业务功能时,就会导致需要调用 n 多细粒度的接口才能完成。调用者肯定会抱怨接口不好用。相反,如果接口粒度设计得太大,一个接口返回 n 多数据,要做 n 多事情,就会导致接口不够通用、可复用性不好。接口不可复用,那针对不同的调用者的业务需求,我们就需要开发不同的接口来满足,这就会导致系统的接口无限膨胀。原创 2021-06-06 08:48:53 · 389 阅读 · 0 评论 -
为什么java IO类不用基于继承的设计方案?
在我初学 Java 的时候,曾经对 Java IO 的一些用法产生过很大疑惑,比如下面这样一段代码。我们打开文件 test.txt,从中读取数据。其中,InputStream 是一个抽象类,FileInputStream 是专门用来读取文件流的子类。BufferedInputStream 是一个支持带缓存功能的数据读取类,可以提高数据读取的效率。InputStream in = new FileInputStream("/user/wangzheng/test.txt");InputStream bi原创 2021-06-05 10:36:15 · 127 阅读 · 0 评论 -
原型模式的原理与应用
如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型设计模式(Prototype Design Pattern),简称原型模式。那何为“对象的创建成本比较大”?实际上,创建对象包含的申请内存、给成员变量赋值这一过程,本身并不会花费太多时间,或者说对于大部分业务系统来说,这点时间完全是可以忽略的。应用一个复杂的模式,只得到一点点的原创 2021-06-05 10:20:09 · 520 阅读 · 0 评论 -
为什么需要建设者模式
在平时的开发中,创建一个对象最常用的方式是,使用 new 关键字调用类的构造函数来完成。我的问题是,什么情况下这种方式就不适用了,就需要采用建造者模式来创建对象呢?你可以先思考一下,下面我通过一个例子来带你看一下。假设有这样一道设计面试题:我们需要定义一个资源池配置类 ResourcePoolConfig。这里的资源池,你可以简单理解为线程池、连接池、对象池等。在这个资源池配置类中,有以下几个成员变量,也就是可配置项。现在,请你编写代码实现这个 ResourcePoolConfig 类。只要你稍微有点原创 2021-06-05 10:10:55 · 281 阅读 · 0 评论 -
简单工厂模式入门
首先,我们来看,什么是简单工厂模式。我们通过一个例子来解释一下。在下面这段代码中,我们根据配置文件的后缀(json、xml、yaml、properties),选择不同的解析器(JsonRuleConfigParser、XmlRuleConfigParser……),将存储在文件中的配置解析成内存对象 RuleConfig。public class RuleConfigSource { public RuleConfig load(String ruleConfigFilePath) { St原创 2021-06-05 09:40:45 · 136 阅读 · 0 评论 -
dry原则入门
DRY 原则。它的英文描述为:Don’t Repeat Yourself。中文直译为:不要重复自己。将它应用在编程中,可以理解为:不要写重复的代码。DRY 原则的定义非常简单,我就不再过度解读。今天,我们主要讲三种典型的代码重复情况,它们分别是:实现逻辑重复、功能语义重复和代码执行重复。这三种代码重复,有的看似违反 DRY,实际上并不违反;有的看似不违反,实际上却违反了。实现逻辑重复我们先来看下面这样一段代码是否违反了 DRY 原则。如果违反了,你觉得应该如何重构,才能让它满足 DRY 原则?如果没有原创 2021-06-01 22:47:22 · 391 阅读 · 0 评论 -
代码行数越少就越“简单”吗?
我们先一起看一个例子。下面这三段代码可以实现同样一个功能:检查输入的字符串 ipAddress 是否是合法的 IP 地址。一个合法的 IP 地址由四个数字组成,并且通过“.”来进行分割。每组数字的取值范围是 0~255。第一组数字比较特殊,不允许为 0。对比这三段代码,你觉得哪一段代码最符合 KISS 原则呢?如果让你来实现这个功能,你会选择用哪种实现方法呢?你可以先自己思考一下,然后再看我下面的讲解。// 第一种实现方式: 使用正则表达式public boolean isValidIpAddres原创 2021-06-01 22:35:01 · 334 阅读 · 0 评论 -
如何理解“KISS 原则”?
KISS 原则的英文描述有好几个版本,比如下面这几个。Keep It Simple and Stupid.Keep It Short and Simple.Keep It Simple and Straightforward.不过,仔细看你就会发现,它们要表达的意思其实差不多,翻译成中文就是:尽量保持简单。KISS 原则算是一个万金油类型的设计原则,可以应用在很多场景中。我们知道,代码的可读性和可维护性是衡量代码质量非常重要的两个标准。而 KISS 原则就是保持代码可读和可维护的重要手段。代码足原创 2021-06-01 22:31:05 · 662 阅读 · 0 评论 -
接口隔离原则有哪三种应用?
接口隔离原则的英文翻译是“ Interface Segregation Principle”,缩写为 ISP。Robert Martin 在 SOLID 原则中是这样定义它的:“Clients should not be forced to depend upon interfaces that they do not use。”直译成中文的话就是:客户端不应该被强迫依赖它不需要的接口。其中的“客户端”,可以理解为接口的调用者或者使用者。实际上,“接口”这个名词可以用在很多场合中。生活中我们可以用它来指插原创 2021-05-30 14:35:30 · 212 阅读 · 0 评论 -
里式替换(LSP)跟多态有何区别?
在上两节课中,我们学习了 SOLID 原则中的单一职责原则和开闭原则,这两个原则都比较重要,想要灵活应用也比较难,需要你在实践中多加练习、多加体会。今天,我们再来学习 SOLID 中的“L”对应的原则:里式替换原则。整体上来讲,这个设计原则是比较简单、容易理解和掌握的。今天我主要通过几个反例,带你看看,哪些代码是违反里式替换原则的?我们该如何将它们改造成满足里式替换原则?除此之外,这条原则从定义上看起来,跟我们之前讲过的“多态”有点类似。所以,我今天也会讲一下,它跟多态的区别。如何理解“里式替换原则”?原创 2021-05-30 14:05:31 · 451 阅读 · 0 评论 -
为何说要多用组合少用继承?
在面向对象编程中,有一条非常经典的设计原则,那就是:组合优于继承,多用组合少用继承。为什么不推荐使用继承?组合相比继承有哪些优势?如何判断该用组合还是继承?今天,我们就围绕着这三个问题,来详细讲解一下这条设计原则。为什么不推荐使用继承?继承是面向对象的四大特性之一,用来表示类之间的 is-a 关系,可以解决代码复用的问题。虽然继承有诸多作用,但继承层次过深、过复杂,也会影响到代码的可维护性。所以,对于是否应该在项目中使用继承,网上有很多争议。很多人觉得继承是一种反模式,应该尽量少用,甚至不用。为什么会有原创 2021-05-30 10:57:39 · 734 阅读 · 0 评论 -
为什么基于接口而非实现编程?
如何解读原则中的“接口”二字?“基于接口而非实现编程”这条原则的英文描述是:“Program to an interface, not an implementation”。我们理解这条原则的时候,千万不要一开始就与具体的编程语言挂钩,局限在编程语言的“接口”语法中(比如 Java 中的 interface 接口语法)。这条原则最早出现于 1994 年 GoF 的《设计模式》这本书,它先于很多编程语言而诞生(比如 Java 语言),是一条比较抽象、泛化的设计思想。实际上,理解这条原则的关键,就是理解其中原创 2021-05-30 10:35:25 · 147 阅读 · 0 评论 -
Java Collection框架入门
容器在Java语言开发中有着非常重要的作用,Java提供了多种类型的容器来满足开发的需要,容器不仅在面试笔试中也是非常重要的一个知识点,在实际开发的过程中也是经常会用到。因此,对容器的掌握是非常有必要也是非常重要的。Java中的容器可以被分为两类:(1)Collection用来存储独立的元素,其中包括List、Set和Queue。其中List是按照插入的顺序保存元素,Set中不能有重复的元素,而Queue按照排队规则来处理容器中的元素(2)Map用来存储<键,值>对,这个容器允许通过键原创 2021-05-20 22:17:25 · 99 阅读 · 0 评论 -
设计原则之单一职责原则
单一职责原则的定义单一职责原则的英文原话是:There should never be more than one reason for a class to change.意思是:一个类,应当只有一个引起它变化的原因;即一个类应该只有一个职责。就一个类而言,应该只专注于做一件事和仅有一个引起变化的原因,这就是所谓的单一职责原则。该原则提出了对对象职责的一种理想期望,对象不应该承担太多职责,正如人不应该一心分为二用。唯有专注,才能保证对象的高内聚;唯有单一,才能保证对象的细粒度。对象的高内原创 2021-05-20 21:37:47 · 178 阅读 · 0 评论