宇宙虽有其起源,却没有终结。无限。 星球虽也有起源,却因其自身之力走向毁灭。有限。
问题本身都要可以被分解为几个较小的问题求解,而dp还要满足重叠子问题和最优子结构,所以dp最多只能说是递归算法中的小类问题的解决算法。
1.预防为主:不是特别必要的场景少用单例,以及单例中少持有非必须的数据,要持有的地方即使释放,可以考虑通过代码review机制保障
2.编译时检测:编写插件,基于规则去扫描单例相关的使用地方,进行一定的报警
3.运行时检测:做一些从单例对象开始的可达性分析,结合对象的使用频率和存货时长,来做一定的报警
最重要的优化是每个slot,之前使用链表解决冲突,现在当链表长度超过一定数量时使用红黑树解决冲突。
如果数据非常大,冲突较多时,单链表长度可能会非常长,比如k,考虑k的数量非常大的情况下,此时查找效率从hashMap的O(1)退化到O(k),而红黑树是二叉平衡树,优化后,查找效率为O(logk),所以此时能显著提升效率。
优点:代码简短清晰
缺点:可能会栈溢出,如果没使用尾递归优化的话, 以及 性能不用递归实现一般而言会差一点
而之所以简短清晰有个很重要的原因是,不适用递归,一般要使用栈,而递归中调用栈正好就充当了栈的角色,从而有这个优点,而栈是有确定的大小的,每次递归都会创建一个栈帧,容易栈溢出,同时由于有方法调用,包含栈帧创建等事情所以效率比起自己实现相对会差一点。
不安全,因为++只是java的语法,在实现上简单且不严谨的说会经历 1.取值放栈上 2.执行+1,得到结果 3.将结果赋值回去
从而3部有很多节点都会有线程安全问题造成结果的不可预知和不正确。
如果明确是为了给外部调用的方法则用public
如果只是为了类内自己使用则private
如果子类也要使用or覆盖的话则protect
清晰和严格的权限控制能 让自己与子类,自己与外部之间尽可能的减少偶尔,从而遇到变动时能减少互相影响的可能性。
一般程序编译完后的二进制文件,里面是汇编代码,直接使用CPU的指令集来实现。而不同(CPU)平台指令集不同,以及可能格式也不同,进而你编译出来的ARM平台的二进制文件无法再x86平台上去执行。
而java的做法是加了一层:虚拟机层,你编译出来的是class字节码,这个是约定好的平台无关的指令集,而各个平台上的虚拟机都是针对该平台/CPU指令集实现的,提供将字节码翻译为平台指令集的功能。
所以,开发者基于java开发的产物:字节码文件是平台无关的,而平台上的虚拟机帮你做了平台有关的那部分事情。
一般语义下,java虚拟机的堆指java堆,java虚拟机的栈或堆栈指java虚拟机栈
前者核心职责分配内存存储对象,后者核心职责是执行java方法
Java堆:虚拟机运行时数据区中的一块内存,主要用来存放对象
GC:虚拟机自动的通过一定的算法(比如mark-sweep,mark-compact等)来分析哪些对象已经可以被回收了,从而进行回收。进而可以提高开发效率,因为这样一定程度上开发者不需要自己手动去管理内存了。
数据结构和算法是CS的基础,属于内功,最好学习一下,并且收益也比较高,不只是面向java这门语言的。
知识这个东西学的越多,不懂的就越多,要学的也越多,很多时候会令人感觉学无止境,举个例子,学习的java过程可能像个二叉树,学了某个节点后,他又有自己的很多子节点,要学习。
大一的话一般主要学习了语法以及一定的面向对象思想,可能只是冰山的一角都算不上,但是是后续学习的重要基础。
1.加锁,又分为很多锁,比如信号量、自旋锁、互斥锁等等
2.软件上加一层,比如用一个队列来控制顺序的访问顺序
1.找本书了解java语法,比如"Thinking in java"
2.找几本书了解java语法之下的东西, 内存结构、内存回收、虚拟机等,比如"深入理解java虚拟机"
在运行时获取对象、类的各类上下文信息,并可以进行修改、创建、方法调用等。对于上层开发者而言获得了极大的灵活性。
首先假定题目中的栈指java虚拟机栈,堆指Java堆。
最主要的区别是职责区别:前者最主要的用途是执行方法,后者主要用途是分配(给对象)内存。
当然还有非常多小区别,比如前者是线程私有的,后者是共有的
前者基于栈的栈帧的形式处理方法的上下文,从而不需要GC去管理内存,而后者需要通过GC管理内存的回收
等等等等还有很多,不过主要还是职责定义
目前java主要领域是在 后端 和 Android
而C++可能是在游戏场景 以及 部分后端场景。
如果只是学习阶段,建议都可以学习下,虽然语言只是个工具,但是工具种类稍微了解多点,更容易透过语言现象看到语言本质。
参数化类型,即将类型也可视作参数传入,进而增加代码的抽象性和复用性。
此外,还能在编译时或得编译器的提示和检查,从而相对而言不容易写出问题来。
最后,java使用类型擦除来实现范型,在编译完的字节码中还是进行了类型强转,只是不需要自己转。
较多1.8
学完C后,建议先学数据结构与算法,提升内功的同时还可以用C来实现数据结构和算法,正好巩固和深入语言功底。
语言功底不错之后学习其他语言事半功倍。
不懂也行,但上限会差很多。
有时间最好学习学习,数据结构和算法是CS的基础课程,学了不吃亏,内功可以用在很多地方。