Java学习之路
IronWring_Fly
这个作者很懒,什么都没留下…
展开
-
如何修改String中某一位的字符
String是不可变的,所以不能直接对他进行修改,所以下面这样写代码会报错String str = "abc";str.charAt(0) = 'd'; 如果想要修改,可以将String改为StringBuilder。String str = "abc";StringBuilder sb = new StringBuilder(str);sb.setCharAt(0, 'd'...原创 2019-12-05 08:56:50 · 6635 阅读 · 0 评论 -
Java内部类
是什么在Java的一个类中再定义一个类,就称之为内部类。有四种类型:成员内部类类内部不能包含static修饰的属性和方法先创建外部类,再创建内部类静态内部类非静态类编译完成之后,会隐含的保存着一个引用,这个引用指向外部类。而静态内部类则没有这个引用静态内部类的创建不依赖于外部类,可以直接创建。静态类不能使用外部类的非静态变量和方法局部(方法)内部类定义在...原创 2019-10-20 13:54:14 · 120 阅读 · 0 评论 -
ConcurrentHashMap
ConcurrentHashMap中有三个层次,整个Hash表,Segment,HashEntry。 Segment数组中的每一个Segment就相当于是一个HashTable,每个HashEntry代表Hash表中的一个节点。HashEntry类如下: 除了value定义为volatile之外,其余都定义为final。 Segment继承自ReentrantLoc...原创 2019-10-15 08:20:15 · 148 阅读 · 0 评论 -
Java中的 >>和 >>>
简单说 >> 是有符号右移, >>> 是无符号右移。计算机中存储的都是补码,所以对于正说来说,这两个操作没差。但是对于负数来说: 有符号右移 >> 会给负数补码高位补1,无符号右移 >>> 给负数补码高位补0。举例: -2的补码:1111 1111 1111 1111 1111 1111 1111 1110 无符号右移...原创 2019-09-09 09:53:07 · 330 阅读 · 0 评论 -
HashMap第二回 面试题
为了真正弄清楚HashMap,我看了很多文章,但我最终觉得,公众号:孤独烟总结的最好。这里我根据烟哥给的面试提纲自己写一下:HashMap的实现原理?看过源码吗,知道原理吗?为什么用数组+链表?hash冲突还有什么解决办法可以用LinkedList代替数组结构吗?既然可以为什么不用?为什么不用ArrayList?看过源码,HashMap的原理就是用一个数组存储一系列...原创 2019-09-09 15:05:14 · 302 阅读 · 0 评论 -
Java实现生产者消费者的三种方法
java实现生产者消费者问题 https://www.cnblogs.com/happyPawPaw/archive/2013/01/18/2865957.html 生产者消费者,就是一个生产者线程,一个消费者线程,对同一块资源进行访问,但是两个线程不能同时访问该资源,必须得生产者生产完数据,并将其放入这个资源块之后,消费者才来访问这块资源,当消费者消费完这块资源,生产者才能开始访问这块资源,...原创 2019-09-10 21:48:54 · 222 阅读 · 0 评论 -
动态规划
之前在做斐比那契数列的时候,留下了一个小尾巴,就是动态规划,整了两天,现在赶紧总结一下。 动态规划是一种解题思路,而不是一种固定的算法,也不是一种万能的方法。甚至在一些极端情况下,利用动态规划思想写出来的代码,执行效率可能还不如简单的递归效率高。但他确实很巧妙,大部分情况下,他依然是一种非常高效的方法的。 动态规划主要针对最优解问题,有一个约定俗成的分析问题的思路:分析子问题确定...原创 2019-09-13 11:24:58 · 137 阅读 · 0 评论 -
字符串常量区
Java设计者为了提高字符串的性能,设计了字符串常量池。在方法区中。 JDK 1.8 中,已经把字符串常量池从方法区的运行时常量池中分离到堆中了。字符串常量池中存储的就是对象。参考资料:JDK1.8版本java字符串常量池里存的是String对象还是引用? 利用一个题目巩固一下:String name = new String(“A” + ”B”);创建了几个对象:三个字符...原创 2019-09-14 11:11:34 · 830 阅读 · 0 评论 -
JVM内存模型
堆这是一个可共享的运行时数据区域,将实际对象存储在内存中。他在虚拟机启动时实例化。堆内存可以分配给所有的类实例和数组。对大小可以是固定的,也可以是动态的,这取决于系统的设置。堆区域的垃圾收集是强制性的。方法区他是堆区域的逻辑部分,在虚拟机启动的时候创建。用来存储类信息,常量,静态变量等可以不用在内存中连续虚拟机栈创建线程时创建虚拟机栈,用来存储数据和部分结果,这些结...原创 2019-09-14 19:31:42 · 147 阅读 · 0 评论 -
Java为什么出现锁机制
Java支持多线程访问,对于一个公共资源,如果多个线程同时对其进行读写操作,就会发生程序混乱,造成未知的bug,所以需要对这个公共变量资源加锁,让各个线程按顺序对这个资源进行操作,避免发生数据不一致的情况出现,保证其唯一性和准确性。...原创 2019-09-14 21:28:35 · 427 阅读 · 0 评论 -
Java创建子类实例时会创建父类实例吗
结论:不会。 创建子类实例的时候确实会在内存空间中存储父类的实例属性,这些是从方法区获得的,但是这些属性都是属于子类实例的。 另外,子类继承抽象类的时候,重写了所有抽象方法,并实例化一个子类对象的时候,会实例化父类,也就是抽象类吗?不可能呀,抽象类是不能实例化的。 所以创建子类实例的时候不会创建父类实例。...原创 2019-09-14 21:50:36 · 1469 阅读 · 0 评论 -
JVM之垃圾回收
Java对象的存活周期也满足二八定律,也就是说,大约有80%左右的对象生命周期很短,需要将他们及时的清理掉,而仅仅20%左右的对象存活周期比较长,进行垃圾回收的时候,就需要注意。 根据对象存活周期的规律,JVM将内存划分为了新生代和老年代,新生代对应存活周期短的对象,老年代对应存活周期比较长的对象。 新生代又划分为Eden区和两个大小相同的Survivor区,由from指针和to指针...原创 2019-09-15 17:12:21 · 171 阅读 · 0 评论 -
HashMap第一回
终于来了,HashMap,come on。简介 HashMap底层是一个数组,里面存储的是key-value类型的元素,称为Entry。这个数组构成了HashMap的主体结构。 HashMap解决hash冲突的方法是链表法,Entry中有一个next指针,遇到冲突直接采用头插法把冲突的Entry用链表保存。 HashMap的初始容量为16,如果要自动扩展或者手动初始化,值必须为2...原创 2019-09-09 08:23:05 · 76 阅读 · 0 评论 -
常见的树结构
我看树结构的顺序如下:二叉搜索树 --> ACL树 --> 2-3-4 树 --> 红黑树。二叉搜索树 父节点的值大于任何一个左子树节点的值,小于任何一个右子树的节点的值。 二叉搜索树的检索类似与二分法,不过该树可能会退化为链表,大幅降低查询效率。ACL树 又称平衡二叉树,左右子树长度差值绝对值不超过1。参考资料:https...原创 2019-09-08 10:45:38 · 500 阅读 · 0 评论 -
七大排序算法
排序方法平均情况最好情况最坏情况辅助空间稳定型冒泡排序O(n2)O(n)O(n2)O(1)稳定简单选择排序O(n2)O(n2)O(n2)O(1)稳定插入排序O(n2)O(n)O(n2)O(1)稳定希尔排序O(nlogn) ~ O(n2)堆O(nlogn)归并排序O(nlogn)O(nlo...原创 2019-09-07 21:41:51 · 152 阅读 · 0 评论 -
Java二维数组的行数与列数
不管几维数组,内存里都是按一维存的。二维数组的行列求法如下: int[][] a = {{1, 2, 3}, {2, 3, 4}}; //行数 System.out.println(a.length); // 第一行的列数 System.out.println(a[0].length);...原创 2019-08-28 15:19:14 · 6187 阅读 · 0 评论 -
编译器前端简介
编译器前端主要分为词法分析、语法分析、语义分析三个部分。一、词法分析 词法分析首先要将整行的代码拆分成最小逻辑单元(Tocken),例如:age这样的单词;>=这样的比较运算符;123这样的数字等。可以自己手写,也可以利用生成工具。 生成工具包括Lex/Flex等,生成工具就是利用正则文法对新增节点生成自动有限机。 正则文法即正则表达式,自动有限机就是对于单词、运算符、数字...原创 2019-08-23 11:44:41 · 761 阅读 · 0 评论 -
Java中数组的length和字符串的length()
首先,字符数组和字符串都是对象。字符数组在创建的时候,长度就已经确定了,所以可以利用length属性表示其长度,而字符串本质也是一个字符数组,没必要再用这个属性表示其长度,于是就封装了一个方法,其源码如下: public int length() { return value.length >> coder(); }参考文章: https:/...原创 2019-09-06 08:45:08 · 4640 阅读 · 0 评论 -
接口与抽象类的区别
一个类里只要包含了至少一个抽象方法,就称其为抽象类。成员变量没有限制,但是抽象方法不能为private,否则子类不能继承,无法实现该抽象方法。抽象类不能实例化,不能用来创建对象。子类继承抽象类,必须实现其抽象方法,否则需要将子类也声明为抽象类。类不能多继承。接口比抽象类更为抽象,可以理解为一种特殊的类。接口中的成员变量默认且只能为:public static final,所有的方...原创 2019-09-06 11:09:38 · 378 阅读 · 0 评论 -
Java 三大特征五大基本原则
三大特征:封装继承多态五大基本原则:单一职责开放封闭接口隔离里氏替换依赖倒置原创 2019-09-06 11:21:41 · 180 阅读 · 0 评论 -
Java重载和重写的区别
重载是由静态类型决定的,在类加载的时候就可以确定,属于静态分派。重写是由动态类型决定的,是在运行时确定的,属于动态分派。 虚方法表中存放着各个方法的实际入口地址,如果子类没有重写父类方法,则父类和子类在方法表中的方法地址一致。如果子类重写了父类的方法,子类方法表中的地址指向重写后的地址。 重载是在一个类内部,出现了一致的方法名,而参数列表不同(个数不同,类型不同)。可以理解为一种类内部...原创 2019-09-06 14:54:09 · 134 阅读 · 0 评论 -
Java中的init方法和clinit方法
Java在编译之后,会在字节码中生成init方法。创建实例的时候会调用该方法,该方法会将按一下顺序执操作: 父类成员变量 --> 父类语句块 --> 父类构造函数 --> 子类成员变量 --> 子类语句块 --> 子类构造函数。 Java编译后,会在字节码中生成clinit方法,JVM在类加载–验证–解析–初始化的初始化阶段调用该方法,该方法会将按一下顺序...原创 2019-09-06 15:44:57 · 1515 阅读 · 0 评论 -
Java对象初始化的过程
1. 类加载检查 首先在常量区检查有没有该类的引用,如果没有,就开始执行类的加载,解析,初始化这个过程。2. 分配内存 类加载之后就知道需要给对象分配多少内存,分配内存的方法有“碰撞指针”和“空闲列表”两种方法。3. 初始化0值 给对象的成员变量初始化0值,这样不给成员变量赋值也可以直接用。4. 设置对象头 设置对象头内容,包括实例是哪个类的实例,类的元信息位置,GC分代年龄...原创 2019-09-06 16:24:24 · 179 阅读 · 0 评论 -
Java引用
Java中的引用分强引用、软引用、弱引用、虚引用。 强引用:常用Object object = new Object,只要强引用还在,垃圾回收器就不会回收这样的对象。 软引用:用来描述还有用但非必须的对象,如果系统内存不够用了,才会回收这些引用。 弱引用:用来描述非必须的对象,不管内存够不够用,当开始进行垃圾回收的时候,都会回收掉这些被弱引用关联的对象。 虚引用:最弱的一种引用...原创 2019-09-06 17:47:28 · 98 阅读 · 0 评论 -
Java解决散列冲突的方法
解决散列冲突的方法有:开放定址法:线性探测,每次增加的步长线性增加:1,2,3 。。。二次探测,每次增加的步长二次增加:12,22,32 。。。再散列法: 多准备几个hash函数,遇到散列冲突就换一个,重新散列。链表法: 散列表对应的每一个槽位维护一个链表,如果遇到hash冲突就直接添加到链表后面。...原创 2019-09-06 18:17:01 · 316 阅读 · 0 评论 -
leetcode 206. 反转链表
反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL迭代法代码如下:class Solution { public ListNode reverseList(ListNode head) { if(head == null) ...原创 2019-09-06 20:30:12 · 106 阅读 · 0 评论 -
已知二叉树的前序中序遍历,重建二叉树
二叉树的前序遍历顺序为:中、左、右;中序遍历顺序为左、中、右。 (中为根节点) 前序遍历和中序遍历的对应关系如下图(左边前序遍历,右边中序遍历): M:根节点,L:左子树,R:右子树 这个图非常重要,写迭代的时候,脑子里有这个图,就不会出错。代码如下:class TreeNode{ int val; TreeNode left; TreeNode right; ...原创 2019-09-07 09:47:42 · 280 阅读 · 0 评论 -
Memcached
简介 memcached是一个高性能的内存缓存管理系统,利用k-v结构的hashmap缓存从数据库中查询的结果,当再次查询的时候,就可以不经过数据库,直接从缓存中找到结果,大大提高查询效率,提高动态web应用的响应速度。内存模型 https://www.cnblogs.com/moyangvip/p/5259700.html memcached中包含三个概念,slab,chunk,i...原创 2019-08-27 17:57:52 · 114 阅读 · 0 评论