Java新特性
JDK9到JDK17的新特性JDK9新特性(2017年9月)模块化
提供了List.of()、Set.of()、Map.of()和Map.ofEntries()等工厂方法
接口支持私有方法
Optional 类改进
多版本兼容Jar包
JShell工具
try-with-resources的改进
Stream API的改进
设置G1为JVM默认垃圾收集器
支持http2.0和websocket的API
重要特性:主要是API的优化,如支持HTTP2的Client API、JVM采用G1为默认垃圾收集器。
JDK10新特性(2018年3月)局部变量类型推断,类似JS可以通过var来修饰局部变量,编译之后会推断出值的真实类型
不可变集合的改进
并行全垃圾回收器 G1,来优化G1的延迟
线程本地握手,允许在不执行全局VM安全点的情况下执行线程回调,可以停止单个线程,而不需要停止所有线程或不停止线程
Optional新增orElseThrow()方法
类数据共享
Unicode 语言标签扩展
根证书
重要特性:通过var关键字实现局部变量类型推断,使Java语言变成弱类型语言、JVM的G1垃圾 ...
Effective C++ && More Effective C++
Effective C++1. Accustoming Yourself to C++Item 1: View C++ as a federation of languagesC++应该被视为四个部分组成的联邦
C:基础C的语法,因为C++兼容C
面向对象的C++:C with Class(ctor&dtor)、封装、继承、多态、虚函数(动态绑定)
模板C++:模板元编程
STL
Item 2: Prefer consts, enums, and inlines to #defines
#defins对编译报错排查非常不友好
const在C++中有很多用武之地,比#defines适用广泛
enum 比const更像#defines,但没有#defines的副作用
模板+inlines可以节省函数调用的开销,比#defines好用
123456789101112// #defines函数#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))CALL_WITH_MAX(++a, b); // a i ...
C++排查派生类内存泄漏步骤
1、pmap命令找出最大块内存区域pmap [pid],找出最大块内存区域,一般即为堆内存区域
1pmap [pid]
2、gcore产生core文件1$gcore [pid]
3、获取内存空间64bit下,一个指针占8字节,5666356*1024/8=725293568于是用gdb打印内存空间
12345$gdb [binfile] [corefile](gdb) set height 0(gdb) set logging on(gdb) x/725293568a 0x00000001249e1000
上述命令,会把内存中的内容,按照指针进行解读,保存在gdb.txt文件中。
等一会,此时gdb.txt
此时gdb.txt不太好看出来类名是什么,可以用c++filt命令转换一下
1cat gdb.txt|c++filt > demo.txt
4、统计输出内容根据demo.txt第五列(即类名)进行统计排序
1cat demo.txt | awk '{print $5}'|sort|uniq -c | s ...
多线程场景下的C++字符串转换最佳实践
背景前段时间发现在基础库中有一些字符串转化的性能问题,在读取某些字符串配置时,需要借助字符串这个中间变量进行转换,在多线程场景下效率很差,代码如下,成员变量m_data存储了所有的配置:
12345678910// SectionConfig.hclass SectionCfonig{ ... GetInt()... GetDouble()... GetString()... ... private: std::map<std::string, std::map<std::string, std::string>> m_data;}
1234567891011121314151617181920212223242526272829// SectionConfig.cpp...// GetDouble等函数与GetInt类似int SectionConfig::GetInt( const std::string §ion, const std::string &key, int defau ...
探秘Java中的ThreadLocal
探秘Java中的ThreadLocal多线程基础Thread对象代表一个线程,我们可以在代码中调用Thread.currentThread()获取当前线程
ThreadLocal简介ThreadLocal是一个关于创建线程局部变量的类。
通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改。
用法创建,支持泛型
1ThreadLocal<String> mStringThreadLocal = new ThreadLocal<>();
set方法
1mStringThreadLocal.set("hello world");
get方法
1mStringThreadLocal.get();
源码刚才的get与set方法的源码如下,两个方法都用到了方法getMap()
1234567891011121314151617181920212223242526272829303132 public T get() { Thread ...
设计模式之禅
单一职责原则
Single Responsibility Principle:There should never be more than one reason for a class to change.
单一职责原则最难划分的就是职责,单一职责适用于接口、类,同时也适用于方法,一个方法尽可能做一件事情
最佳实践:接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。
里氏替换原则
继承的利:
代码共享
提高代码的重用性
子类可以形似父类,但又异于父类
提高代码的可扩展性
继承的弊:
继承是侵入性的。只要继承,就必须拥有父类的所有属性和方法;
降低代码的灵活性。子类必须拥有父类的属性和方法
增强了耦合性。当父类的常量、变量和方法被修改时,需要考虑子类的修改
如何增大利而减小弊?答案就是引入里氏替换原则(Liskov Substitution Principle,LSP)
定义一:If for each object o1 of type S there is an object o2 of type T such that for all programs ...
大话设计模式
桥接模式适配器:改变已有的两个接口,让他们相容。
桥接模式:分离抽象化和实现,使两者的接口可以不同,目的是分离。
共同点:桥接和适配器都是让两个东西配合工作。
不同点:出发点不同
适配器:改变已有的两个接口,让他们相容。
桥接模式:分离抽象化和实现,使两者的接口可以不同,目的是分离
桥接是先有桥,才有两端的东西,适配是先有两边的东西,才有适配器,桥接是在桥好了之后,两边的东西还可以变化
何时使用
在抽象化角色和具体化角色之间增加更多的灵活性
实现化角色不能影响客户端
责任链模式
纯责任链模式要求具体处理必须在两个行为中二选一:承担责任 or 责任推给下家,并且最后一定会被某一个处理者对象所接受
责任链模式减低了发出命令的对象和处理命令的对象之间的耦合
一个链可以是一条线,一个树,也可以是一个环。链的拓扑结构可以是单连通的或多连通的,责任链模式并不指定责任链的拓扑结构。但是责任链模式要求在同一个时间里,命令只可以被传给一个下家(或被处理掉);而不可以传给多于一个下家。
举例:击鼓传花
客户端不知道最后处理者是谁
Handler是个抽象的类,定义了抽象的handler方法,具体的C ...
《深入理解Java虚拟机:JVM高级特性与最佳实践》——读书笔记
深入理解Java虚拟机第1章 走进Java
我们可以把Java程序设计语言、Java虚拟机、Java类库这三部分统称为JDK(Java Development Kit),JDK是用于支持Java程序开发的最小环境,本书中为行文方便,在不产生歧义的地方常以JDK来代指整个Java技术体系 [2] 。可以把Java类库API中的Java SE API子集 [3] 和Java虚拟机这两部分统称为JRE(Java Runtime Environment),JRE是支持Java程序运行的标准环境。
虚拟机始祖:Sun Classic/Exact VM
武林盟主:HotSpot VM。相信所有Java程序员都听说过HotSpot虚拟机,它是Sun/OracleJDK和OpenJDK中的默认Java虚拟机,也是目前使用范围最广的Java虚拟机。
HotSpot虚拟机的热点代码探测能力可以通过执行计数器找出最具有编译价值的代码,然后通知即时编译器以方法为单位进行编译。如果一个方法被频繁调用,或方法中有效循环次数很多,将会分别触发标准即时编译和栈上替换编译(On-Stack R ...
Git Cheatsheet
git cheatsheet分支与远程协作开始git checkout -b feature/xxx:从当前分支创建出新分支,并切换到新分支上,新分支与当前分支是一样的
git checkout -b feature/xxx origin/eature/xxx:该命令可以将远程git仓库里的指定分支拉取到本地,这样就在本地新建了一个feature/xxx分支,并和指定的远程分支feature/xxx关联了起来,当前分支是什么对新分支不造成影响,最后会切换到新分支上,本地和远程分支的名称最好一致;
如果还碰到问题:fatal: ‘origin/feature/xxx’ is not a commit and a branch ‘feature/xxx’ cannot be created from it
解决:git fetch –all,再git checkout -b feature/xxx origin/eature/xxx
反向开始git push –set-u ...
《Java核心技术卷一》——读书笔记
JavaJava核心技术第十版源码:https://github.com/deyou123/corejava
与C++的不同
Java中int永远是32位的,C++的int可能是16位、32位,也可能是编译器提供商指定的其他大小,唯一的限制是不能小于short int,不能大于long int
Java中所有函数都属于某个类的方法(标准术语称其为方法,而不是成员函数
静态成员函数(static member function),这些函数定义在类的内部,并且不对对象进行操作,Java中的main方法必须是静态的
Java的main方法没有为操作系统返回『退出代码』,若想返回非0值,则要调用System.exit方法
Java没有无符号形式的int、long、short或btye类型,整形都是有包括负数的
C++中的数值甚至指针都可以代替布尔值,非0值相当于布尔值的true,Java中整型值与布尔值不能相互转换
C++会区分定义和声明,Java不会
Java声明一个变量后,必须用赋值语句对变量进行显示初始化,千万不要使用未初始化的变量
C++用const表示常量,Java ...