JDK

Java:转换列表 <String> 到一个字符串

佐手、 提交于 2020-11-01 15:06:22
问题: JavaScript has Array.join() JavaScript具有 Array.join() js>["Bill","Bob","Steve"].join(" and ") Bill and Bob and Steve Does Java have anything like this? Java有这样的东西吗? I know I can cobble something up myself with StringBuilder: 我知道我可以使用StringBuilder自己整理一些东西: static public String join(List<String> list, String conjunction) { StringBuilder sb = new StringBuilder(); boolean first = true; for (String item : list) { if (first) first = false; else sb.append(conjunction); sb.append(item); } return sb.toString(); } ...but there's no point in doing this if something like it is already part of the JDK.

2020Java面试试题及答案(基础部分)

与世无争的帅哥 提交于 2020-11-01 14:44:00
世人慌慌张张,不过图碎银几两。偏偏这碎银几两,能解世间万种慌张。最近实在揭不开锅了,有了换工作的想法,网上整理了部分Java基础面试题,好东西要拿出来分享。好了不多说了进入正题。 如果你不想再体验一次自学时找不到资料,没人解答问题,坚持几天便放弃的感受的话,可以加我们的扫描二维码,各种面试资料简历模板免费送! 1、面向对象的三个特征 封装(即包装或隐藏): 封装从字面上来理解就是包装的意思,专业点就是信息隐藏。它指的是将对象的数据、状态信息和对数据的操作方法及细节隐藏在对象内部, 不允许外部程序直接访问对象的内部信息或直接对对象进行操作,而是向外提供一些安全可靠的方法供外部程序对对象进行安全的访问和操作。 好处: 隐藏信息和实现细节 可以对成员进行更精确的控制,限制对对象的不合理访问 便于修改,提高代码的可维护性 良好的封装能够减少耦合 继承: 使用现有的类的所有功能,并无须重新编写原来的这些类的基础上对这些功能进行扩展(可以增加新的数据或新的功能)。 特点: 子类拥有父类非private的属性和方法 子类可以拥有自己属性和方法,即子类可以对父类进行扩展 子类可以重写父类已实现的方法 多态: 所谓多态就是一个实例的相同方法在不同的情形下有不同的表现形式,即程序中定义的引用变量所指向的具体类型和通过引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定

内存泄露的原因找到了,罪魁祸首居然是 Java TheadLocal

喜欢而已 提交于 2020-11-01 14:24:55
作者 | 雷架 来源 | 爱笑的架构师(ID:DancingOnYourCode) ThreadLocal使用不规范,师傅两行泪 组内来了一个实习生,看这小伙子春光满面、精神抖擞、头发微少,我心头一喜:绝对是个潜力股。于是我找经理申请亲自来带他,为了帮助小伙子快速成长,我给他分了一个需求,这不需求刚上线几天就出网上问题了,后台监控服务发现内存一直在缓慢上升,初步怀疑是内存泄露。 把实习生的PR都找出来仔细 review,果然发现问题了。由于公司内部代码是保密的,这里简单写一个 demo 还原场景(忽略代码风格问题)。 public class ThreadPoolDemo {private static final ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5, 5, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<>());public static void main(String[] args) throws InterruptedException {for (int i = 0; i < 100; ++i) { poolExecutor.execute(new Runnable() {@Overridepublic void run() {

工作5年的Java程序员心酸历程:为什么达到20K以后就很难突破了?

落爺英雄遲暮 提交于 2020-11-01 13:53:22
前言 前段时间有程序员向我抱怨: 为什么自己待在一家企业5年了,没有功劳也有苦劳啊,现在想涨薪怎么就那么难呢? 然后在接下来的聊天里得知:他自认为自己的技术没问题,但是公司的框架代码不停的更新换代,自己接受新事物的能力大不如前,有时候甚至还不如个刚来公司半年的小程序员,自己也就慢慢沦为 职场老油条 !感觉心好累! 不知道在屏幕前阅读的你有没有遇到类似的问题,这个问题我总结起来: 这些都是因为自己的掌握技术比较散乱,然后想提升自己的时候就发现无从下手! 所以我为大家梳理下我所理解的 Java架构师的成长路线 ,希望能够帮助到屏幕前的各位,并在文章末尾给大家分享 架构师学习资料 。 筑基阶段 主要学习了解JAVA的底层原理,之后所有的开发框架都是基于此进行拓展的,这里的筑基不光是基础,而是根基,所以底层一定要扎实,基本所有大厂面试的时候都会问 JVM,多线程,JDK新特性等问题 ,也是这个原因。 成长阶段 等你能够理解JAVA的底层原理之后,再来学习目前热门的、新的框架,就能更容易理解源码,开发思想,接触任何框架都会更加得心应手。 拓展阶段 架构师拓展阶段是对基础的拓展,响应式编程专题是程序员对于编程模式方面的拓展,让程序员具有更开阔的编程思维,网络编程专题是针对程序员网络方面的基础与底层原理拓展,网络方面一般的程序员是接触不到的,但是是作为一个架构师必备的,明白网络的底层原理后在

Java 在Ubuntu 安装

你离开我真会死。 提交于 2020-11-01 08:43:50
安装Java 8 ( 支持 Ubuntu 10.04 - Ubuntu 16.04 ) 1、如果你在 Ubuntu 软件中心安装过 OpenJDK,请先使用如下命令将其删除: sudo apt-get purge openjdk* 2、添加 PPA 源 sudo add-apt-repository ppa:webupd8team/java 3、更新下源数据库 sudo apt-get update 4、安装 Oracle Java 8 sudo apt-get install oracle-java8-installer 5、查看版本: java -version 6、设置 Java 8 环境变量: sudo apt-get install oracle-java8-set-default 7、java版本切换 sudo update-java-alternatives -s java-8-oracle 8、卸载jdk sudo apt-get remove oracle-java8-installer 参考:https://my.oschina.net/jimilee/blog/914075 更新:2019.4开始oracle java 需要licence,改用openjdk apt-get install software-properties-common add-apt

ArrayBlockingQueue你了解过吗?

扶醉桌前 提交于 2020-11-01 00:28:06
概述 自java5后,jdk增加了concurrent包,concurrent中的BlockingQueue,也就是堵塞队列,BlockingQueue只是一个接口,jdk为其提供了丰富的实现类,适用于不同的场景,这篇讲的是ArrayBlockingQueue。 ArrayBlockingQueue简介 ArrayBlockingQueue继承了AbstractQueue类和实现了BlockingQueue接口,是一个基于数组的有界队列,锁是基于ReentrantLock实现,只有一个锁对象,这就导致入队/出队共用一把锁,无法实现存取并行。 应用 1.在实际应用中,设置数组大小时要充分考虑到数据量,如果设置值过小,容易造成堵塞,而且运行中无法修改大小。 2.不支持null元素,否则报NullPointerException异常。 主要方法 1.插入数据 (1)offer(E e):如果队列没满,返回true,如果队列已满,返回false(不堵塞)。 (2)offer(E e, long timeout, TimeUnit unit):可以设置等待时间,如果队列已满,则进行等待。超过等待时间,则返回false。 (3)put(E e):无返回值,一直等待,直至队列空出位置。 2.获取数据 (1)poll():如果有数据,出队,如果没有数据,返回null。 (2)poll(long

Java 容器 × HashMap[JDK 1.8]源码学习

五迷三道 提交于 2020-10-31 11:14:42
HashMap 属性 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { /*--------------常量--------------*/ // 默认hash桶初始长度16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 // hash桶最大容量2的30次幂 static final int MAXIMUM_CAPACITY = 1 << 30; // 默认加载因子为0.75f static final float DEFAULT_LOAD_FACTOR = 0.75f; // 链表的数量大于等于8个并且桶的数量大于等于64时链表树化 static final int TREEIFY_THRESHOLD = 8; // hash表某个节点链表的数量小于等于6时树拆分 static final int UNTREEIFY_THRESHOLD = 6; // 树化时最小桶的数量 static final int MIN_TREEIFY_CAPACITY = 64; /*--------------实例变量--------------*/ // hash桶

S2-052

馋奶兔 提交于 2020-10-31 08:10:18
前言 S2-052的RCE漏洞和以前的有些不同,不再是ognl表达式注入了,而是xml反序列化漏洞导致的RCE(另外还有S2-055漏洞是fastjson的反序列化漏洞)。我复现的时候遇到一个坑,导致一直复现不成功,就是必须要jdk1.8以上的版本才行。 正文 之前讲过执行action之前会先经过一些内置的拦截器,使用rest插件之后也是类似的,只不过经过的拦截器有变化了,如下图: 这次的漏洞就出现在ContentTypeInterceptor中,debug进去看看: 可以看到,通过getHandlerForRequest获得一个Handler后,调用handler的toObject方法,而输入的参数就是请求body,跟进getHandlerForRequest: 发现是通过请求头Content-Type来选择对应的Handler的,这是的漏洞就出现在,当Content-Type时会选用XStreamHandler,调用它的toObject() 很明显,调用了Xstream的fromXML方法,导致了xml的反序列化漏洞。 发送一个post请求,修改请求头信息为Content-Type: application/xml,发送post数据就是POC了,使用marshalsec工具( https://github.com/mbechler/marshalsec)生成如下poc:

JAVA不可变类(immutable)机制与String的不可变性

杀马特。学长 韩版系。学妹 提交于 2020-10-31 07:55:42
一、不可变类简介 不可变类 :所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。 可变类 :相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类。 二、不可变类的优点 说完可变类和不可变类的区别,我们需要进一步了解为什么要有不可变类?这样的特性对JAVA来说带来怎样的好处? 线程安全 不可变对象是线程安全的,在线程之间可以相互共享,不需要利用特殊机制来保证同步问题,因为对象的值无法改变。可以降低并发错误的可能性,因为不需要用一些锁机制等保证内存一致性问题也减少了同步开销。 易于构造、使用和测试 ... 三、不可变类的设计方法 对于设计不可变类,个人总结出以下原则: 1. 类添加final修饰符,保证类不被继承 。 如果类可以被继承会破坏类的不可变性机制,只要继承类覆盖父类的方法并且继承类可以改变成员变量值,那么一旦子类以父类的形式出现时,不能保证当前类是否可变。 2. 保证所有成员变量必须私有,并且加上final修饰 通过这种方式保证成员变量不可改变。但只做到这一步还不够,因为如果是对象成员变量有可能再外部改变其值。所以第4点弥补这个不足。 3. 不提供改变成员变量的方法,包括setter 避免通过其他接口改变成员变量的值,破坏不可变特性。 4

要去面试,先刷完这16道高频面试题,阿里,字节跳动,美团任你选

╄→гoц情女王★ 提交于 2020-10-31 07:29:48
1.JDK8 新特性 Lambda 表达式-也是函数编程的一种方式(将函数做为参数) 方法的应用,应用已有的java类对象的方法或者构造器。与Lambda表达式相结合,方法应用使得语言构造更加简洁,从而减少代码的冗余 默认方法,默认方法就是一个在接口里边有了一个实现的方法 新工具-新的编译工具,如:Nashorn引擎jjs,类依赖分析器jdeps Stream API - 把真正的函数式编程风格引入到Java中。 Date Time API - 加强对日期与时间的处理 Optional 类 - Optional 类已经成为Java 8 类库的一部分,用来解决空指针异常 Base64 Java8 内置了Base64 编码的编码器和解析器 2.hashMap 底层实现?当你put一个元素时,在底层结构是如何执行的? 首先需要知道在不同的JDK版本上面hashMap 的实现是有区别的: JDK8之前: 数组 + 链表 JDK8之后:数组 + 链表 + 红黑树 当你put元素时: 执行步骤: a.计算该元素的hashCode 值 b.通过计算它的hashCode 值去确定数组下标,数组的初始化16大小,增长因子为0.75 c.当存在哈希冲突是,相同的hashCode 值得到的数组下标就是会一样的,则单纯的数组则不满足,需要链表的支持 d.链表满足长度大于8时转成红黑树,那为啥8呢