jdk8-获取本机ip、判断ip范围、ip与long互转等

协议校验实战:8种核心模式与国密SM4兼容性设计 协议解析与校验是分布式系统和网络通信的基石,它确保数据在传输和交换过程中的完整性与安全性。其核心原理在于通过一系列预定义的规则,对数据包的格式、长度、内容及逻辑关系进行验证,从而在数据进入业务逻辑前识别并拦截异常。这项技术的价值不仅在于保障数据正确性,更是构建系统安全防线、实现快速失败定位和优雅版本兼容的关键。在金融交易、物联网设备对接等高要求场景中,健壮的协议校验层能有效抵御畸形报文攻击,并处理多版本兼容问题。本文聚焦于协议校验的工程实践,系统阐述了从基础结构校验到安全增强校验的8种核心模式,并深入探讨了 阅读详情

在配置nginx的ip白名单时候,会通过ip段进行配置(如 10.10.10.10/24),就在思考这种配置怎么通过代码解析并判断,故通过搜索网络内容,并通过java编写测试代码。代码及说明来源网络,并进行了部分调整。故有疑问请提出来,本人小白一枚,勿喷
代码内容:获取本机ip、判断ip范围、ip与long互转等
IP: 网络地址
掩码: 指明一个IP地址的哪些位标识的是主机所在的子网。
网段:网络中可通信的部分,一般用子网第一个地址表示。
广播地址:专门用于同时向网络中所有工作站进行发送的一个地址;一般用子网最后一个地址表示。
可用子网ip:一般指子网中去除网段、广播地址的地址范围

参考

处理ip,java判断ip是否在指定的ip段范围内,给定的ip地址是否在某个ip段范围内,将字符串形式IP地址转换long类型
ip地址与掩码、网段、广播地址、可用ip范围
java实现 IP/掩码位 转换 ip段范围
192.168.和10.0.开头的IP、内网IP段、IP简介、分类——IP观止
JDK8 Java 中遇到null 和为空的情况,使用Optional来解决
什么是ip地址

代码

demo

代码参考自 参考内,并进行了部分重构

import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Optional;

/**
 * Ip工具类
 *
 * @author z.y.l
 * @version v1.0
 * @date 2022/12/13
 */
public class IpUtil {
    private static final int I_32 = 32;
    /** ip 255.255.255.255 >>> 11111111111111111111111111111111 */
    private static final long VALIDATE_DATA = 4294967295L;
    private static final HashMap<Integer,String> NET_MASK = new HashMap<>();
    /** 1-255 正则 */
    private static final String REG_1_255 = "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])";
    /** 0-255 正则 */
    private static final String REG_0_255 = "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)";
    /** ip 正则 */
    private static final String IP_REGEX = "^" + REG_1_255 + "\\." + REG_0_255 + "\\." + REG_0_255 + "\\." + REG_0_255 + "$";
    static {
        /* 初始化掩码 */
        NET_MASK.put( I_32, long2ip( VALIDATE_DATA ) );
        for(int i = 1 ; i < I_32 ; i++ ){
            NET_MASK.put( I_32-i, long2ip( VALIDATE_DATA << i & VALIDATE_DATA ) );
        }
    }

    public static void main(String[] args) {
        String localIp = inetIp();
        System.out.println("本机ip:"+localIp);
        System.out.println("-------------");
        System.out.println(new IpInf("192.168.1.2", "255.255.254.0").toString());
        System.out.println(new IpInf("192.168.1.3", "255.255.255.0").toString());
        System.out.println("-------------");
        String ip="10.10.10.116";
        String startIP = "10.10.1.0";
        String endIP = "10.10.255.255";
        System.out.println("ip:10.10.10.116>>>"+ip2Long(ip));
        System.out.println("ip:10.10.10.116,startIP:10.10.1.0,endIP:10.10.255.255,>>>"+ipExistsIn(ip,startIP,endIP));
        System.out.println("-------------");
        //判断一个IP是否属于某个网段
        System.out.println("ip:10.2.1.0,cip:10.2.0.0/17,>>>"+ipIsIn("10.2.1.0", "10.2.0.0/17"));
    }
    /**
     * 获取 本机ip
     * @return 本机ip
     */
    public static String inetIp(){
        try {
            Enumeration<NetworkInterface> nif = NetworkInterface.getNetworkInterfaces();
            while (nif.hasMoreElements()) {
                NetworkInterface ni = nif.nextElement();
                Enumeration<InetAddress> inet = ni.getInetAddresses();
                while (inet.hasMoreElements()) {
                    InetAddress ia = inet.nextElement();
                    if (!ia.isLinkLocalAddress() && !ia.isLoopbackAddress() && ia instanceof Inet4Address) {
                        return ia.getHostAddress();
                    }
                }
            }
        } catch (Exception e) {
            return null;
        }
        return "";
    }
    /** 判断一个ip地址是否在某个ip段范围内 */
    public static boolean ipExistsIn(String ip,String start,String end){
        long ipL = ip2Long(ip);
        return ( ip2Long(start) <= ipL ) && ( ip2Long(end) >= ipL );
    }
    /**
     * 功能:判断一个IP是不是在一个网段下的
     * 格式:isInRange("192.168.8.3", "192.168.9.10/22");
     */
    public static boolean ipIsIn(String ip,String cip){
        long ipL = ip2Long(ip);
        String[] split = cip.split("/");
        int mask = 0xFFFFFFFF << ( 32L - s2l(split[1]));
        long cipL = ip2Long(split[0]);
        return ( ipL & mask ) == ( cipL & mask );
    }
    /** 把long类型的Ip转为一般Ip类型:xx.xx.xx.xx */
    public static String long2ip(Long ip){
        Long tmp = Optional.ofNullable(ip).filter(l -> l >= 0 && l <= VALIDATE_DATA )
                .orElseThrow(()-> new RuntimeException(ip + " 数字 不在 有效ip范围."));
        // 255.0.0.0 ~ 1.0.0.0,0.255.0.0 ~ 0.1.0.0,0.0.255.0 ~ 0.0.1.0,0.0.0.255 ~ 0.0.0.1
        return (tmp>>>24) + "." + (tmp>>>16&255L) + "." + (tmp>>>8&255L) + "." + (tmp&255L);
    }
    /** 将字符串形式IP地址转换long类型 */
    public static long ip2Long(String ip){
        ip = checkIp(ip);
        String[] split = ip.trim().split("\\.");
        return ( s2l(split[0]) << 24 ) + ( s2l(split[1]) << 16 ) + ( s2l(split[2]) << 8 )+ ( s2l(split[3]) );
    }
    private static long s2l(String s){
        return Long.parseLong(s,10);
    }
    private static String checkIp(String ip){
        return Optional.ofNullable(ip).filter(s -> !s.isEmpty()&&s.matches(IP_REGEX))
                .orElseThrow(() -> new RuntimeException(ip + " ip地址不合法."));
    }
    private static String checkMask(String mask){
        return Optional.ofNullable(mask).filter(s -> !s.isEmpty()&&NET_MASK.containsValue(mask))
                .orElseThrow(() -> new RuntimeException( mask + "掩码不合法."));
    }
    public static class IpInf{
        /** ip */
        private final Inf ip;
        /** 掩码 */
        private final Inf mask;
        /** 网段 */
        private final Inf segment;
        /** 广播地址 */
        private final Inf broadcast;
        /** 开始ip */
        private final Inf startIp;
        /** 结束ip */
        private final Inf endIp;
        /** 可用ip数 */
        private final Long count;
        /**
         * 初始化
         * @param ip 如 192.168.1.1
         * @param mask 掩码 如 255.255.255.255
         */
        public IpInf(String ip,String mask){
            System.out.println("ip:"+ip+",mask:"+mask);
            this.ip = new Inf(checkIp(ip));
            this.mask = new Inf(checkMask(mask));
            //网段 = ip & 掩码
            this.segment = new Inf(this.ip.val & this.mask.val);
            // 广播地址 网段末尾用1补齐
            this.broadcast = new Inf(this.segment.val | (~this.mask.val & VALIDATE_DATA));
            // 开始地址 网段+1
            this.startIp = new Inf(this.segment.val + 1L);
            // 结束地址 广播地址-1
            this.endIp = new Inf(this.broadcast.val - 1L);
            this.count = this.endIp.val - this.startIp.val;
        }

        public Inf ip() { return ip; }
        public Inf mask() { return mask; }
        public Inf segment() { return segment; }
        public Inf broadcast() { return broadcast; }
        public Inf startIp() { return startIp; }
        public Inf endIp() { return endIp; }
        public Long count() { return count; }

        @Override
        public String toString() {
            return "{ip=" + ip + ", mask=" + mask + ", segment=" + segment + ", broadcast=" + broadcast
                    + ", startIp=" + startIp + ", endIp=" + endIp + ", count=" + count + '}';
        }
    }
    public static class Inf{
        private final String lab;
        private final Long val;
        Inf(String l){ this.lab = l;this.val = ip2Long(l); }
        Inf(Long v){ this.val = v;this.lab = long2ip(v); }
        public Long toLong() { return val; }
        public String toStr() { return lab; }

        @Override
        public String toString() {
            return "{str='" + lab + "', long=" + val + '}';
        }
    }
}

测试

本机ip:192.168.***.171
-------------
ip:192.168.1.2,mask:255.255.254.0
{ip={str='192.168.1.2', long=3232235778}, mask={str='255.255.254.0', long=4294966784}, segment={str='192.168.0.0', long=3232235520}, broadcast={str='192.168.1.255', long=3232236031}, startIp={str='192.168.0.1', long=3232235521}, endIp={str='192.168.1.254', long=3232236030}, count=509}
ip:192.168.1.3,mask:255.255.255.0
{ip={str='192.168.1.3', long=3232235779}, mask={str='255.255.255.0', long=4294967040}, segment={str='192.168.1.0', long=3232235776}, broadcast={str='192.168.1.255', long=3232236031}, startIp={str='192.168.1.1', long=3232235777}, endIp={str='192.168.1.254', long=3232236030}, count=253}
-------------
ip:10.10.10.116>>>168430196
ip:10.10.10.116,startIP:10.10.1.0,endIP:10.10.255.255,>>>true
-------------
ip:10.2.1.0,cip:10.2.0.0/17,>>>true

截图
在这里插入图片描述

END

代码仅供参考,请充分测试后在使用。谢谢Thanks♪(・ω・)ノ

Java增量更新实战:时间戳陷阱与高可靠同步方案 增量更新是现代数据同步的核心技术,本质是通过识别和传输变更数据而非全量刷写,以降低网络、CPU与存储开销。其底层依赖时间戳、逻辑序号或日志位点等变更标识机制,但实际落地中常因并发冲突、时钟漂移、事务不一致等问题导致漏同步或重复数据。Java生态下需结合数据库特性(如MySQL的CURRENT_TIMESTAMP)、JVM时钟行为(System.currentTimeMillis精度限制)及分布式协同(节点ID+序列号生成器)构建鲁棒方案。典型应用场景包括电商商品同步、用户行为采集、金融风控规则下发等对一致性 阅读详情

相关推荐

Java随机数生成器选型指南:Random、Math.random与ThreadLocalRandom深度对比

随机数生成是Java并发编程与系统稳定性中的基础但高危环节。其本质是伪随机算法(如线性同余LCG)在JVM内存模型与硬件缓存约束下的工程实现。理解java.util.Random的CAS锁竞争、Math.random()的全局单例瓶颈,以及ThreadLocalRandom的无锁线程私有设计,直接关系到高并发场景下的吞吐量、延迟与AB测试准确性。在电商压测、订单号生成、分布式ID等典型应用中,错误选型会导致QPS骤降、重复ID、统计偏差甚至OOM。本文结合JDK源码、JMH实测数据与线上故障案例,解析三种实

weixin_33714884的博客 423

java获得本机ip

public static String getIpAddress(){         try {             Enumeration allNetInterfaces = NetworkInterface.getNetworkInterfaces();             InetAddress ip = null;             while (allNetI

world_the_begin的博客 586

macOS安装Maven的四大安全机制与最佳实践

Maven作为Java生态核心构建工具,在macOS系统中并非简单解压配置即可运行。其本质是JVM进程链在Apple安全框架(Gatekeeper、Notarization、Full Disk Access、Privacy Controls)下的可信执行问题。理解macOS对未签名二进制文件的沙盒限制、JAVA_HOME路径结构兼容性(尤其JDK 17+废弃jre目录)、Shell环境变量加载时机及权限审计机制,是解决mvn命令卡顿、类加载失败、权限弹窗等典型问题的关键。Homebrew和SDKMAN之所以

congjukun0600的博客 559

IP地址与Long型数字相互转换

【代码】IP地址与Long型数字相互转换。

qq_43595591的博客 796

Java 应用网络连接池泄漏:No buffer space available 的 2 种诊断工具与修复

本文深入分析了Java应用网络连接池泄漏导致的'No buffer space available'错误,提供了两种诊断工具与修复方案。从操作系统级资源监控到连接池深度配置,帮助开发者快速定位和解决TCP连接资源耗尽问题,确保系统稳定运行。

weixin_34391445的博客 313

Jeepay开源Java支付系统实战指南:架构、部署与避坑

开源支付系统是Java后端工程师在金融级业务中高频接触的领域模型实践载体。其核心在于统一多渠道(微信、支付宝等)接入、保障事务一致性、实现幂等与对账能力。基于Spring Boot的分层架构设计,既规避了微服务过度复杂化风险,又通过事务传播、乐观锁、自研验签等手段满足监管与稳定性要求。技术选型上,Java凭借成熟的事务控制、审计日志和JVM可观测性,在支付场景中显著优于Go或Node.js。实际落地涉及JDK兼容性、MySQL 8.0配置、Redis连接、渠道沙箱调试及生产监控五大关键环节,尤其需关注GC调

weixin_34007020的博客 306

java获取本地机器IP地址和访问的端口

Enumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces(); while (allNetInterfaces.hasMoreElements()){ NetworkInterface netInterface = (NetworkInterfac...

伫望向北的博客 2560

java代码 判断一个IP地址是否合法,并判断该地址是否属于一个给定的子网。

1)以命令行格式运行:ip_test subnet/mask ip_addr 其中ip_test为程序名;subnet为子网号;mask是一个数值,代表子网掩码连续1的个数;ip_addr是要测试的ip地址。 例如,要测试的IP地址为202.113.16.10,子网号为202.113.16.0,子网掩码为255.255.255.0 2)判断subnet和ip_addr的合法性(注意考虑全面,比如以下IP均为不合法 123..2.1 123.23$.2.1 123.12345.2.1 123.23.45.2.1 3)判断掩码的合法性 4) 在IP地址合法的前提下,判断ip_addr是否属于子网subnet 5)输出命令行中的IP是否合法,掩码是否合法(可适当给出不合法原因)以及ip_add

JAVA【long值与ip地址互转】 - ip的判别

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34319817的博客 312

从零到一:Halcon手眼标定的实战避坑指南

本文详细解析了Halcon手眼标定的完整流程,重点介绍了Eye-in-Hand和Eye-to-Hand两种模式的实操技巧与常见陷阱。通过九点法、N点法等实战案例,提供硬件配置检查、数据采集策略及误差修正方案,帮助开发者提升机械臂与视觉系统的协同精度,适用于工业自动化领域的精准定位与抓取任务。

neovim7hacker的博客 234

AI全景之第八章第三节:时间序列分析与预测技术

摘要 时间序列分析与预测技术从传统统计模型发展到深度学习方法。传统方法包括ARIMA模型(处理趋势和季节性)、指数平滑(加权平均预测)和状态空间模型(概率框架分解)。机器学习方法通过特征工程和树模型提升非线性建模能力。深度学习方法中,RNN/LSTM处理序列依赖,TCN利用因果卷积,Transformer通过注意力机制捕获长程依赖。当前研究趋势结合神经符号方法和生成模型,以提高预测精度和可解释性。不同方法各具优势,需根据数据特性和预测需求选择。

技术引领业务创新 988

JAVA获取本机IP

public String getIP() { InetAddress address = null; try { address = InetAddress.getLocalHost(); } catch (UnknownHostException e) { e.printStackTrace(...

qq_38949960的博客 390

别再瞎试了!用Python+正交设计,5分钟搞定你的多因素实验方案

本文介绍了如何利用Python和正交设计高效优化多因素实验方案。正交设计通过精心设计的正交表,用最少的实验次数覆盖所有因素的水平组合,显著提升实验效率。文章详细讲解了正交设计的核心优势、Python实现工具链、实验实施与数据分析方法,以及高级技巧与常见问题解决方案,帮助读者快速掌握这一强大的实验优化技术。

weixin_42526087的博客 331

Java集成Ip2region实现高效IP地址定位解析实战指南

IP地址定位解析是网络工程与数据分析中的一项基础技术,其核心原理是通过查询IP地址与地理位置的映射数据库,将数字化的网络标识符转换为物理位置信息。这项技术的价值在于,它能够在不依赖GPS等硬件定位的情况下,为应用提供用户或访问源的大致地域信息,是实现地域化服务、风险控制、流量分析和内容推荐的关键支撑。在技术实现上,开发者通常面临在线API与本地库两种方案的选择。在线API虽然便捷,但存在网络延迟、调用限制和隐私顾虑;而本地IP库则以其离线查询、高性能和隐私安全的优势,成为高并发与数据敏感场景的优选方案。其中

weixin_34245082的博客 418

双目视觉三维重构(一)————简介

优快云中关于立三维重构的介绍层出不穷,CNKI中也有各类综述对三维重构进行总结,撰写这篇博客仅作为本人对该类博客、论文的总结学习,加深自身学习的印象、作为学习的笔记。如有错误的地方,欢迎指正。   1、三维重构 1.1、三维重构到底是什么?   首先要了解立体匹配算法,首先要知道立体匹配算法主要具体应用于什么方向。 三维重构又被称为三维重建,百度百科中对它的定义为:指对三维物体建立适合...

qq_39634612的博客 1万+

如何根据芯片手册时序图编写驱动程序

如何根据芯片手册时序图编写驱动程序 对于电子开发者来说,刚刚拿到一个芯片,常用的芯片可以参考网上的例程来做深入了解,对于一个不常用的芯片来说,Datasheet几乎是使用芯片的唯一的资料,所以根据Datasheet时序图写出对应的驱动程序就尤为重要。 本文根据一个简单的例子来阐述根据时序图来编写对应的程序过程。旨在讲解对于初学者应该怎么利用芯片的时序图编写符合要求的底层驱动程序(老鸟请跳过)。 下载芯片的Datasheet,(个人常用http://www.21icsearch.com/)如..

weixin_36447711的博客 1万+

操作日志系统设计:基于Spring Boot实现灵活时间范围查询与性能优化

操作日志是保障系统可追溯性、支持审计与问题排查的核心组件,其设计原理涉及数据模型、存储策略与查询优化等多个层面。通过合理设计日志表结构,特别是为操作时间字段建立索引,可以显著提升查询效率。在技术价值上,一个健壮的日志系统不仅能满足合规性要求,还能为行为分析、异常检测提供数据支撑。在应用场景中,财会职业能力养成平台常需查询如“1月前4天”这类灵活时间段的用户操作记录,这要求后端能准确计算时间范围并高效执行查询。本文以Spring Boot和MyBatis-Plus为例,详细阐述了如何通过AOP切面实现日志的自

weixin_33754065的博客 362

Cadence PCB仿真 使用Allegro PCB SI为BRD文件创建通用型IBIS模型的方法图文教程

本文简单介绍使用Allegro PCB SI软件为BRD PCB设计文件中的元器件创建IBIS模型的方法。

fydar的博客 2167

IntelliJ IDEA + JDK 17下Spring Cloud微服务联调实战指南

微服务架构通过将单体应用拆分为多个独立部署的服务,提升了系统的可扩展性和可维护性。其核心原理在于服务间的解耦与通信,通常采用HTTP/REST或RPC协议。这种架构的技术价值在于支持团队独立开发、部署和扩展,并能采用不同的技术栈。然而,在开发阶段,尤其是在本地环境中进行多服务联调时,开发人员常常面临环境不一致、依赖复杂、服务发现困难等挑战,这直接影响了开发效率和问题排查。针对这些痛点,本文聚焦于**Spring Cloud**微服务框架,并结合**IntelliJ IDEA**这一主流集成开发环境,系统性地

weixin_34341229的博客 389

AI量化学习入门指南:从零开始掌握人工智能投资策略

量化投资:利用数学模型和计算机算法进行投资决策的方法算法交易:自动执行预定义交易规则的系统机器学习:让计算机从数据中学习并改进的技术回测:用历史数据检验交易策略表现的过程特征工程:将原始数据转化为模型可理解的输入过拟合:模型过度适应历史数据,导致未来表现不佳夏普比率:衡量单位风险所获得的超额收益AI量化投资不仅仅是技术的应用,更是一种理性、系统化的投资哲学。它不追求预测市场的每一个拐点,而是通过概率思维和风险管理,在不确定性的市场中寻找统计优势。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 1126

Stable Diffusion 模型分享:Beautiful Realistic Asians(美丽真实的亚洲人)

Beautiful Realistic Asians(BRA)模型是由作者自己训练而成的一个独立模型,它是一个真实模型,并且是一个针对亚洲人训练的模型,可以生成非常漂亮的亚洲小姐姐。条目内容类型大模型基础模型SD 1.5来源CIVITAI作者文件名称文件大小1.99GB。

水滴的博客 2156

dmsql日志分析工具部署与使用DM8/DM7

分析SQL是DBA或者数据库服务人员很重要的工作。达梦数据库通过开启SVR_LOG捕捉数据库中运行的所有SQL,并生成SQL日志文件。DMLOG工具是一款简单易用的达梦数据库SQL日志分析工具,旨在帮助运维人员统计日志中最长执行时间和执行最高频次的SQL语句,直观的反应SQL执行情况,对于SQL的优化工作提供了极大的便利。

qq_37358909的博客 1083

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【Java入门到精通】*基础篇

Java入门教程摘要(1-6期) 本系列从零讲解Java,基于Java 8 LTS版本。 Java历史与特性:1995年Sun公司发布,以跨平台、面向对象为核心优势,应用于后端、安卓、大数据等领域。 跨平台原理:通过JVM将字节码转换为机器码,实现"一次编写,到处运行"。 环境组件:JDK(开发工具包)⊃ JRE(运行环境)⊃ JVM(虚拟机),开发需安装JDK。 安装配置:提供Windows/Mac的JDK安装指南,强调路径无中文/空格。 环境变量:设置JAVA_HOME指向JDK路径,Path添加bin

2301_81248642的博客 929

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Guns框架:Spring Boot 3 + Vue 3 + JDK 17 全栈开发终极指南

在当今企业级应用开发中,开发者常常面临技术栈选择困难、前后端分离架构复杂、权限管理繁琐等痛点。你是否也在寻找一个既能快速上手,又能满足企业级需求的现代化开发框架?Guns正是为解决这些问题而生的全栈开发框架,基于Spring Boot 3、Vue 3和JDK 17技术栈,致力于提高开发效率,降低企业信息化系统的开发成本。 ## 为什么选择Guns框架? Guns框架的核心价值在于将前后端开发的

gitblog_00416的博客 387

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

四、Hadoop全分布模式配置流程

一、安装linux环境   1、linux环境在这里就不进行描述了,我这里安装的是[《红帽企业linux.6.2》(red.hat.enterprise.linux.6.2)6.2[光盘镜像]].rhel-server-6.2-i386-dvd.iso,这是32位的操作系统(getconf LONG_BIT命令)。        1.1在配置网络适配器时候需注意选择仅主机模式,否则会在后续连接不成...

Monstar_L的博客 619

linux命令详解及软件安装(持续更新)

linux解析 在java开发之路(javase、Mysql、前端(html、Css、Js)、JavaWeb、SSM(到这里很多人就开始找工作了)、Springboot、Vue、SpringCloud、MybatisPlus、Git…) 走到一定程度之后。 接下来再要遇到的技术(消息队列(kafka、RabbitMQ、RockeetMQ)、缓存(Redis)、搜索引擎(ES)、集群分布式(需要购买.....................

Ferao的博客 1万+
上一篇: java测试示例-生成ULID
下一篇: 【Git】git仓库完整迁移
privateobject
博客等级 码龄9年 107粉丝 86原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值