分类:: Java

Java - 局部变量和StackOverflowError

本文目的对Java栈内存进行简单学习总结,并了解 -Xss JVM参数的配置,学会在代码中尽量减少不必要的局部变量声明,从而提高程序效率和编码水平。 Java栈内存简介Java栈内存空间中主要存放的是局部变量,包括基本数据类型(int、short、byte、long、float、double、char、boolean)和引用数据类型。例如:int a = 1 或者 double x = 0.01

Java8 - 更优雅的字符串连接(join)收集器 Collectors.joining

Java8中的字符串连接收集器在JDK8中,可以采用函数式编程(使用 Collectors.joining 收集器)的方式对字符串进行更优雅的连接。Collectors.joining 收集器 支持灵活的参数配置,可以指定字符串连接时的 分隔符,前缀 和 后缀 字符串。 代码参考如下: 1234567891011121314// 定义人名数组final String[] names =

Java8 - 对流(数据)进行自定义分块:partitioningBy收集器

partitioningBy收集器在JDK8中,可以对流进行方便的自定义分块,通常是根据某种过滤条件将流一分为二。 例如:有一组人名,包含中文和英文,在 JDK8 中可以通过 partitioningBy 收集器将其区分开来。 下面是代码例子:1234567891011121314151617// 创建一个包含人名称的流(英文名和中文名)Stream<String> stream

Java8 - 对流(数据)进行自定义分组:groupingBy收集器

groupingBy收集器在JDK8中,可以对流进行方便的自定义分组,就像 SQL 语句中的 groupBy 一样,在JDK8中对应的分组函数是 Collectors 类的 groupingBy 方法。这种特性很有用:把数据拆分成不同的组,可以使处理数据更加灵活方便,在某些情况下例如按需处理、分块处理时更高效。 例如:有一组人名,需要根据首字母(姓氏)进行分组,则可以通过 groupingBy

Java8 - Map更优雅的迭代方式:forEach

BiConsumer用于两个参数之间进行操作的函数式接口是 BiConsumer。这个函数式接口正好用来操作 Map 的 key 和 value。JDK8强化了针对 Map 类的迭代方式,新增了一个默认方法 forEach,它接收一个 BiConsumer 函数。JDK给出的描述如下: Performs the given action for each entry in this map u

Java8 - Map新增的方法:computeIfAbsent

computeIfAbsent这个方法是JDK8中Map类新增的一个方法,用来实现当一个KEY的值缺失的时候,使用给定的映射函数重新计算填充KEY的值并返回结果。computeIfAbsent 方法的JDK源码如下:1234567891011121314151617default V computeIfAbsent(K key, Function<? super K, ? extends

Java8 - 定制归一化收集器(reducing)得到自定义结果集

reducing简介reducing 是一个收集器(操作),从字面意义上可以理解为“减少操作”:输入多个元素,在一定的操作后,元素减少。 reducing 有多个重载方法,其中一个方法如下: 1public static <T> Collector<T,?,Optional<T>> reducing(BinaryOperator<T> op) 以上

(译)Java - null在内存中到底是什么

Java中随时都在使用 null,那么 null 到底是什么?让我们从一个简单的表达式说起: 1String x = null; 1. 这句话的确切含义是什么?回想什么是变量,什么是值。一个常见的隐喻是一个变量类似于一个盒子。就像你可以用一个盒子来存储东西一样,你可以使用变量来存储一个值。在声明变量时,我们需要设置变量的类型。 Java中有两大类类型:原始类型和引用类型。声明原始类型存储值的变量;

(译)Java - 数组的10个常用方法

以下是Java数组中最常用的10种方法,它们是 stackoverflow 中投票最多的问题。 0. 声明数组123String[] aArray = new String[5];String[] bArray = {"a","b","c", "d", "e"};String[] cArray = new String[]{"a","b","c","d","e"

Java8 - 转为流为基本数据类型求最大值、最小值、平均值、求和、计数

基本数据类型在高阶函数中的运用众所周知,在Java中使用基本数据类型的性能和产效率远高于包装类型。由于装箱类型是对象,因此在内存中存在额外开销。比如,整型在内存中占用4 字节,整型对象却要占用 16 字节。这一情况在数组上更加严重,整型数组中的每个元素只占用基本类型的内存,而整型对象数组中,每个元素都是内存中的一个指针,指向 Java堆中的某个对象。在最坏的情况下,同样大小的数组, Intege

Java8 - 高阶函数及判断高阶函数的方式

什么是高阶函数高阶函数是指接受另外一个函数作为参数,或返回一个函数的函数。什么样的参数是函数类型的参数?要看该参数是否是一个函数式接口,函数式接口只会有一个方法,会使用 @FunctionalInterface 这个注解来修饰。 高阶函数在 Java8 中很常见,如以下的例子: 1Stream<Integer> numUp = Stream.of(1, 2, 5).map(num -

Java8 - ThreadLocal的Lambda构造方式:withInitial

ThreadLocal的Lambda构造方式Java8中ThreadLocal对象提供了一个Lambda构造方式,实现了非常简洁的构造方法:withInitial。这个方法采用Lambda方式传入实现了 Supplier 函数接口的参数。写法如下: 代码实例1234/** * 当前余额 */private ThreadLocal<Integer> balance = ThreadLo

Java8 - 惰性求值

什么是惰性求值(惰性计算)惰性求值也叫惰性计算、延迟求职,在函数式编程语言中随处可见。可以这样通俗地理解为:不对给出的表达式立即计算并返回值,而是在这个值需要被用到的时候才会计算。这个是个人理解,有关专业的术语定义请参考百度百科:https://baike.baidu.com/item/惰性计算 什么是及早求值(热情求值)和惰性求值相反的是及早求值(热情求值),这是在大多数编程语言中随处可见的一

Java8 - Lambda表达式的5种形式

本文介绍Jave8中Lambda表达式的多种写法形式,一般有五种写法形式。 形式一:这种写法没有参数,用一对圆括号表示。1Runnable noArguments = () -> System.out.println("Hello World"); 形式二:这种写法只有1个参数,可以省略括号,下面的 event 相当于 (event)。123ActionListener oneArgumen

Java - 使用蔡勒公式快速计算某一天是星期几

使用蔡勒公式,只需给出年月日,就可以用该公式来计算任意一个日期是星期几。 请参考以下计算星期几的代码例子: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263/** * 蔡勒公式Java实现例子 * @author

Java - 逢一进一高效分页公式

本文介绍使用Java语言实现的逢一进一高效分页公式: 1int totalPage = (totalCount - 1) / pageSize + 1; 逢一进一在十进制中,每一位有0~9共十个数码,所以计数的基数为10。超过9就必须用多位数来表示。十制数的运算遵循:加法时,“逢十进一 —— 该数位上的数满十就向前一位进一”;减法时,“借一当十 —— 该数位上的数不够减时,就向前一位借一当做十,再

Java - 获取HTTP请求的上下文绝对路径

本文介绍使用Java获取一个请求的完整的 协议名+主机+端口号,如:http://127.0.0.1:14530。获取该地址后,可以设为全局变量(contextPath),在系统页面中作为路径前缀使用。 请参考以下代码片段: 1234567// 获取HTTP请求的上下文绝对路径(完整的协议名+主机+端口号)StringBuffer url = request.getRequestURL(); //

Java - 获取HTTP请求的真实IP

本文介绍使用Java获取HTTP请求的真实IP,包括了对反向代理、代理客户端、多个IP情况的处理。 请参考以下代码片段: 123456789101112131415161718192021222324252627/** * 获取真实IP * @param request 请求体 * @return 真实IP */public static String getRealIp(HttpServletR

Java - 解决在一个线程(或进程)中切换多个账号发送邮件的问题

近期做一个项目中遇到需要使用多个邮箱以负载均衡的方式发邮件(单线程多账号发邮件),遇到一些问题在此做一个记录,主要解决 “501 mail from address must be same as authorization user” 这个错误。 场景有A、B、C三个邮件账户,由于发信量限制原因,程序需要做到在每次向用户发邮件时,交替使用这三个邮箱,实际就是一种简单的负载均衡轮询。我将A、B、C

Java - 使用腾讯企业邮箱发邮件的例子

这篇教程演示使用腾讯企业邮箱发邮件,文中代码已在java8环境下测试通过,文中的帐户名和密码等信息请修改为自己的企业邮箱账号进行测试。 邮件发送器1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Java8 - 使用jdeps —— Java类依赖性分析器

jdeps,即“java dependencies” 的缩写,是Java8中提供的一个工具。 jdeps命令显示Java类文件的包级或类级依赖关系。输入类可以是.class文件、目录、jar文件的路径名,或者可以是完全限定的类名称,以分析所有类文件。jdeps的参数选项决定了输出的内容。默认情况下,JDEPS将依赖关系输出到系统输出(控制台)。它可以用DOT语言生成依赖关系(见 -dotoutpu

Java - 使用Files类一行代码读取文件内容

Files 类是 java.nio 包中的用于操作文件的类,提供了比 java.io.File 类更便捷的操作。其中,Files类的 readAllBytes 方法提供了一个读取所有字节的方法,可以将读取结果很方便地赋值给一个 String。例如以下代码,可以用一行代码实现读取文件的内容,然后赋值给一个字符串: 12345678910111213141516171819202122232425pa

Java - 调用JavaScript脚本的例子

Java中提供了一个脚本引擎管理器:ScriptEngineManager,它会在虚拟机启动时发现可用的脚本引擎。 脚本引擎管理器构造一个 ScriptEngineManager,调用它的 getEngineFactories 方法,可用获取到当前Java环境所有支持的引擎工厂,可用通过循环去获取每个引擎工厂的属性。请参考以下代码: 1234567891011121314public static

Java - 动态代理例子 - 茶叶代理商

这个例子使用Java的动态代理技术演示了茶叶商家、代理商获取茶叶价格的例子,文章内容仅供加强理解之用,如有描述不妥之处,请参阅其他专业资料。 理解Java的动态代理所谓代理,简单来说就是把一件事情交给别人去做,由别人替你代办。例如银行的代理人、娱乐圈的经纪人、商业中的经销商等等,都是一种代理的行为。 Java中的代理,是一样的道理,屏蔽了对原始对象实例的访问,由代理对象替代真实对象去完成。代理对象

Java9 - 模块化简明例子

个人对Java9的模块化的理解个人对Java9模块化的简单理解是:模块是 package 的容器,是 package 的上一层。在模块里,可以输出(管理)当前模块哪些包是对外暴露(exports)的。同样的,当前模块需要别的模块,就要引用(requires)进来。 Java9模块化的例子使用Idea创建一个项目 java-9-module-demo,添加两个模块: module-main:主模

Java - 延时队列的简单使用例子

DelayQueue(延时队列)DelayQueue主要用于放置实现了Delay接口的对象,其中的对象只能在其时刻到期时才能从队列中取走。这种队列是有序的,即队头的延迟到期时间最短。如果没有任何延迟到期,那么久不会有任何头元素,并且poll()将返回null(正因为这样,你不能将null放置到这种队列中)。

Java - 使用Ip2Region(ip地址定位库)转换IP和地区

Ip2Region是一个准确率99.9%的ip地址定位库,0.0x毫秒级查询,数据库文件大小只有1.5M,提供了java、php、c、python、nodejs、golang查询绑定和Binary、B树、内存三种查询算法,查询效率非常高。码云地址:https://gitee.com/lionsoul/ip2region