Java
文章平均质量分 57
流动的城市
纸上得来终觉浅,觉知此事要躬行
展开
-
【Java源码分析】LinkedHashSet和HashSet源码分析
类的定义 public class HashSet<E>extends AbstractSet<E>implements Set<E>, Cloneable, java.io.Serializable{}是AbstractSet的子类,实现了Set接口和序列化接口以及克隆接口。内部实际上是一个HashMap实例。不保证遍历顺序,允许空的元素添加 删除 Contains和size操作都是常数原创 2016-08-11 00:52:57 · 945 阅读 · 0 评论 -
【Java基础】异常处理与输入输出流
finally中的代码执行时机try{}语句中含有return,那么finally还会执行吗?如果会,那么是什么时候执行(return前还是return后) 在Java的异常处理中,不论什么情形,finally中的逻辑一定会执行,也就是说try{}块里面有return,那么finally同样会执行的,执行时机就是try{}中的return 之前。同时如果try{} catch{}以及finally原创 2016-05-24 16:12:06 · 3205 阅读 · 0 评论 -
【Java基础】字符串与数组
字符串创建于存储机制字符串的声明和初始化的两种情形: 1. str1 = “abc”; str2 = “abc”;在JVM中存在着一个常量池,其中保存着很多的String对象,并且这些对象可以共享。因此此处的str1和str2是引用同一个常量池中的对象。由于String是不可变类,因此这种共享并不会造成混乱。 2. str1 = new String(“abc”); str2 = new Str原创 2016-05-24 16:11:23 · 704 阅读 · 0 评论 -
【Java基础】Java中的char是否可以存储一个中文字符之理解字符字节以及编码集
Java中的一个char采用的是Unicode编码集,占用两个字节,而一个中文字符也是两个字节,因此Java中的char是可以表示一个中文字符的。 但是在C/C++中由于采用的字符编码集是ASCII,只有一个字节,因此是没办法表示一个中文字符的。解答了上面的浅显易懂的问题之后,下面彻底理清楚字符 字节以及编码的原理。 其实关于编码以及字节的问题,在腾讯实习生一面的时候也问到过,当时搞不懂面试官为原创 2016-04-28 19:21:28 · 9595 阅读 · 0 评论 -
【剑指offer-Java版】49把字符串转换为整数
字符串转换为整数 : atoi可能的输入: 1 带符号数 2 无符号数 3 零 4 空指针 5 超出表示范围 – 暂时仅仅是直接退出且设置最小 – 可以考虑此时抛个异常 6 非法输入,比如并不是一个0-9或者+ -组成的字符串 – 对于非法输入一律返回的是Integer.MIN_VALUE public class _Q49<T> { public long Str原创 2016-04-27 09:48:55 · 2081 阅读 · 0 评论 -
【剑指offer-Java版】47不用加减乘除做加法
不用 + - * / 做加法 输入两个整数,不使用四则运算求出这两个数的和 分析加法运算对应的位运算: 1 等价于两个数先做异或运算 – 相当于不考虑进位的加法 2 然后按位与运算并将与运算的和左移一位 – 相当于考虑进位 3 将1中的结果赋值给第一个数,将2中的结果赋值给第二个数 4 如果第二个数不为0,重复1 2 3 public class _Q47<T> {原创 2016-04-27 09:48:00 · 753 阅读 · 0 评论 -
【剑指offer-Java版】46求 1 + 2 + 3 + ... + n
求 1 + 2 + … + n 但是不能使用判断,循环,分支,条件判断语句以及乘除运算利用反射实现递归:目标就是构建一个递归出口 public class _Q46<T> { public int terminator(int n){ return 0; } public int sum(int n) throws IllegalAccessExcepti原创 2016-04-27 09:47:16 · 1645 阅读 · 0 评论 -
【剑指offer-Java版】45圆圈中最后剩下的数字
圆圈中最后剩余的数字:约瑟夫环问题 0-n这n个数字排成一圈,从数字零开始每次从这个圆圈中删除第m个数字,求出剩余的最后一个数字 public class _Q45<T> { // 低效的模拟而已 public int LastRemaining(int n, int m){ if(n < 0 || m < 0) return -1; int c原创 2016-04-27 09:45:59 · 721 阅读 · 0 评论 -
【剑指offer-Java版】44扑克牌的顺子
扑克牌中的顺子:从一副扑克牌中抽取5张,判断是不是一个顺子。 2- 10 为自身,A 为1 JQK为11 12 13,大小王为任意数先按从小到大对5张牌进行排序 首先判断大小王个数K(只能为0 1 2) 然后判断不连续的间隔之和M,比较M和K的大小;如果在遍历的过程中出现了对子,那么就直接退出,不可能再形成顺子 public class _Q44<T> { public boo原创 2016-04-27 09:44:47 · 580 阅读 · 0 评论 -
【剑指offer-Java版】43n个骰子的点数
属于比较适合进行时空权衡的题目,不过没有过多的研究dp技巧,只是简单的用作者的思路实现了下 public class _Q43<T> { private final static int dice = 6; // 面数 public static void main(String[] args) { PrintDiceProb(2); } //原创 2016-04-27 09:44:03 · 641 阅读 · 0 评论 -
【剑指offer-Java版】42翻转单词顺序VS左旋转字符串
反转单词顺序以及左旋转字符串:输入一个英文句子,翻转句子中的单词顺序,单词内部的字母顺序是不变的 – I am a student. -> student. am I第一步,翻转句子中的所有字符串,第二步翻转单词顺序 public class _Q42<T> { public char[] ReverseSentence(String str){ if(str == n原创 2016-04-27 09:43:01 · 563 阅读 · 0 评论 -
【剑指offer-Java版】41和为s的两个数字VS和为s的连续正数序列
和为S的两个数字以及和为S的连续正数序列:输入是一个递增排序的数组,查找其中一对满足和为S的数,输出。如果有多对,输出其中一对 public void FindNumbersWithSum(int nums[], int sum){ if(nums == null) return; int indexL = 0; int indexR = nu原创 2016-04-27 09:41:49 · 411 阅读 · 0 评论 -
【剑指offer-Java版】40数组中只出现一次的数字
数组中只出现一次的数字:输入一个数组,该数组中有两个数字只出现了一次,其他数字都出现了两次,求出这两个只出现了一次的数字 要求时间复杂度为O(n)空间复杂度为O(1) 考虑一个数组中只有一个数字仅仅出现一次而其他数字都出现了两次,求这个只出现了一次的数字 – 结合异或运算的性质,两个相同数字异或的结果必为0 那么我们只需要依次 将数组中的数据进行异或,最终结果就是那个只出现一次的数字原创 2016-04-27 09:40:44 · 666 阅读 · 0 评论 -
【剑指offer-Java版】39二叉树的深度
二叉树的深度:递归判断二叉树是否是平衡二叉树:注意二叉树平衡代表的是所有非叶子节点都是一棵平衡树 – 而不仅仅是根节点 public class _Q39<T> { public int TreeDepth(BinaryTreeNode<?> tree){ if(tree == null) return 0; if(tree.leftChild == nu原创 2016-04-27 09:39:54 · 364 阅读 · 0 评论 -
【剑指offer-Java版】32从1到n的整数中1出现的次数
测试代码:原创 2016-04-26 16:34:51 · 430 阅读 · 0 评论 -
【剑指offer-Java版】38数字在排序数组中出现的次数
数字在排序数组中出现的次数: 最简单粗暴的方法是O(n^2)可能的解法可以采用二分,首先根据二分找到给定数字在数组中的位置,然后再左右二分,找到边界(第一个和最后一个),左右边界的差值就是出现次数 public class _Q38<T> { public int GetNumberOfK(int nums[], int k){ if(nums == null) re原创 2016-04-26 16:40:31 · 422 阅读 · 0 评论 -
【剑指offer-Java版】37两个链表的第一个公共结点
两个链表中的第一个公共顶点: 解法一:两次遍历即可 第一次遍历找到两个链表的长度,求出差值k,然后较长的;链表先走k步,之后两个链表同时走,直到遇到第一个相同的结点为止 解法二:辅助栈,先顺序遍历并将链表内容存储到栈中,然后依次弹栈,直到遇到最后一个不同结点 public class _Q37<T> { public ListNode<T> FindFirstCommonNo原创 2016-04-26 16:39:37 · 392 阅读 · 0 评论 -
【Java基础】容器
Java Collections框架该框架包含了集合接口以及这些接口的实现类,还有操作这些接口的算法或者工具类。其中List Set Queue Stack和Map都继承自Collection接口,Collection是整个集合框架的基础。 1. Set:表示数学意义上的集合,不允许元素是重复的,因此在存入Set中的对象必须实现equals保证对象的唯一性。其实现类有HashSet和TreeSet原创 2016-05-24 17:07:01 · 578 阅读 · 0 评论 -
【Java基础】多线程
线程及与进程的区别线程也被称为是轻量级的进程,是程序执行的最小单元。有四种状态:运行,就绪,挂起和结束。一个进程拥有多个线程,这些线程共享进程的一些资源如打开的文件,代码段,数据段和堆空间。 使用线程的优点在于: 1. 更好的交互性,GUI程序中可以将耗时操作单独一个线程,从而使程序具有更好的交互性。 2. 和进程相比,线程的开销更小,而且多线程在数据共享方面更加方便,效率更高 3. 多线程原创 2016-05-24 21:05:59 · 513 阅读 · 0 评论 -
【Java源码分析】HashTable源码分析
类的定义 public class Hashtable<K,V>extends Dictionary<K,V>implements Map<K,V>, Cloneable, java.io.Serializable {}注意前面虽然说HashTable和HashMap是非常像的,但是这两个类的父类是不一样的。前者是字典类的子类,后者是抽象Map的子类。 HashTable 也是将key映原创 2016-07-17 17:31:22 · 1836 阅读 · 3 评论 -
【Java源码分析】HashMap源码分析
类的定义 public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {}属于AbstractMap子类,具有clone和序列化的属性实现了Map接口,这样HashMap支持所有的Map操作,并且允许NULL Value和NULL Key.HashMap和Hash原创 2016-07-17 16:07:22 · 1100 阅读 · 0 评论 -
【Java源码分析】Vector源码分析
类的声明public class Vector<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable{}仔细对比ArrayList的类的定义就可以看出,Vector实现的接口以及父类和ArrayList是一样的。实际上从继承体系上也可以看出两者很类似,同属于List原创 2016-07-16 22:41:09 · 624 阅读 · 0 评论 -
【Java源码分析】LinkedList源码分析
类的定义如下 public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable{}本质是一个双向链表,实现了List和Deque接口。实现了所有List的操作,可以存储所有类型的对象,包括NULL 非线程安全多线程调原创 2016-07-16 21:14:52 · 667 阅读 · 0 评论 -
【Java源码分析】ArrayList源码分析
类的定义 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {}List接口的实现类,AbstractList 的子类,支持随机访问,因此底层实现的数据结构是数组 实现了所有list的操作,允许所有类型的元原创 2016-07-16 17:49:16 · 1716 阅读 · 0 评论 -
【Java源码分析】集合框架-Collections工具类-Arrays工具类
集合框架Collection 和Collections和Arrays工具类一开始总是搞不清楚Collection和Collections的区别,不过看下代码应该很清楚,一个是接口,一个是工具类 Collection是集合类的上级接口,子接口主要有Set 和List、Map。平时用到的一些集合类都是该接口的间接实现类。 Collections是针对集合类的一个帮助类,提供了操作集合的工具方法:一系原创 2016-07-23 23:13:33 · 1273 阅读 · 0 评论 -
【Java源码分析】Android-SparseArray源码分析
类的定义 public class SparseArray<E> implements Cloneable {}将int映射为对象,比HashMap更节省内存。一方面是避免了对key的自动装箱;另外一个方面是它的键值对不依赖于外部的实体对象来保存键值映射而HashMap需要额外的存储空间来保存键值对之间的映射关系。该容器将映射存储在一个数组数据结构中,使用二分查找找到对应的key.这种设计不太原创 2016-07-23 23:09:21 · 709 阅读 · 0 评论 -
【Java源码分析】Android-LruCache源码分析
内部实现是LinkedHashMap,保持有限数量的值得强引用,值被访问之后就被移动到队列的首部。当队列满了之后,尾部的值会被移除以便于GC回收 类的定义 public class LruCache<K, V> {}如果被缓存的值所拥有的职员需要被显式的释放,重载entryRemoved()方法默认情况下size方法返回的是条目数,如果需要返回缓存大小,可以重载sizeOf()线程安全的类原创 2016-07-23 23:06:53 · 676 阅读 · 0 评论 -
【Java源码分析】LinkedHashMap源码分析
类的定义 public class LinkedHashMap<K, V> extends HashMap<K, V> {}基于双向链表实现,属于Map的一类,其父类是HashMap。最主要的是LinkedHashMap可以保证迭代顺序。如果既想要使用Map的功能又想要键值对插入和取出是有序的,可以使用LinkedHashMap键和值支持任意类型,包括null迭代的顺序就是键值对被插入Map的原创 2016-07-23 23:04:16 · 558 阅读 · 0 评论 -
【Java基础】基本类型与运算
Java的8种基本数据类型8种基本数据类型:byte short int long float double char boolean,基本数据类型不是对象,此类变量在被声明的时候会在栈上分配空间。其实还有第九种基本数据类型void,但是几乎没有使用,其也有对应的对象类型(包装类)Void。 Java的中的数值类型都是有符号数,其取值范围也是固定的(因为平台无关性)。Java中默认声明的小数都原创 2016-05-20 21:00:14 · 2044 阅读 · 0 评论 -
【Java基础】关键字
变量命名规则标识符只能以大小写英文字母,数字,下划线和组成,而且开头必须是字母或者是下划线或者组成,而且开头必须是字母或者是下划线或者 同时Java中的标识符是区分大小写的,Count和count是两个不同的变量。 assert断言主要用于软件调试,提供了一种在代码中进行正确性检查的机制。使用方式有两种: assert exp1; assert exp1 : ex2; 第一种和第二种中的exp原创 2016-05-20 20:17:20 · 580 阅读 · 0 评论 -
【Java基础】面向对象特性
面向对象的特征面向对象的主要特征包括:抽象,继承,封装,多态 1. 抽象:忽略主题中与当前目标无关的方面,值注意与目标有关的方面(抓住主要矛盾或者主要特征),包括数据抽象和过程抽象 2. 继承:用于表述类的共性,是一种联结类的层次模型 3. 封装:将客观事物抽象为类,每个类对自身的方法和数据进行保护。通过权限修饰符确定哪些属性或方法可以被外界访问 4. 多态:允许不同类的对象对同一个消息做出原创 2016-05-19 21:16:33 · 784 阅读 · 0 评论 -
【Java基础】语言基础知识
Java语言的优点纯面向对象 平台无关性:编译器编译后的中间代码由JVM解释执行 内置类库比较丰富简化开发 提供完善的安全机制异常机制以及垃圾回收机制和强类型机制 除去了C++中那一理解的特性:如多重继承,虚基类,运算符重载,指针等Java语言和C++语言的异同相同点: 都是面向对象语言,都提供了封装,继承,多态等特性。都具有很好的代码维护性和可重用性。 不同点: 1. J原创 2016-05-19 20:06:53 · 710 阅读 · 0 评论 -
【网络】HTTP2.0新特性
前段时间实习生面试的时候被问到HTTP2.0以及和HTTP1.1的区别,貌似网上对这一块的讲解很少,而且大多数就是空洞的理论堆砌,看也看不懂。不过花点时间慢慢找还是可以找到很不错的资料的。整理如下,希望对其他的应届生求职有帮助 HTTP2.0的标准总体目标是为了改善用户在使用web时候的速度体验(这些改进都是HTTP1.1中的痛点或者说是所遇到的瓶颈)。实现上主要是有7项技术:多路复用,流量控制,原创 2016-05-25 09:23:11 · 6995 阅读 · 0 评论 -
【网络】TCP基础总结
OSI以及分层模型OSI分层 (7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 TCP/IP分层(4层):网络接口层、 网际层、运输层、 应用层。 五层协议(5层):物理层、数据链路层、网络层、运输层、 应用层 OSI的7层模型主要是理论研究的意义,而实际使用的是4层的TCP/IP模型(而TCP/IP的第4层网络接口层并没有什么实际的内容)。5层模型是7层模型和TCP/I原创 2016-05-25 23:30:13 · 8832 阅读 · 0 评论 -
【网络】HTTP基础总结
Http的报文结构HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成。 (1)请求行 请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。 例如,GET /index.h原创 2016-05-25 23:28:06 · 902 阅读 · 0 评论 -
【剑指offer-Java版】36数组中的逆序对
数组中的逆序对:归并排序的另类应用数组中的逆序对:给定的数组,如果两个数字中前面一个数字大于后面的一个,那么称为一个逆序对,数组中所有满足此关系的逆序对总数就是这个数组的逆序对此处的实现并不优雅,毕竟copy数组是不需要的,只需要一个局部的就可以 但是如果使用的是一个局部的空间复杂度是logn的辅助数组,会造成代码有一点点难理解另外,书上的明显是错误的代码,没有运行过,但是从逻辑上来分析,应该会出原创 2016-04-26 16:38:49 · 840 阅读 · 0 评论 -
【剑指offer-Java版】35第一个只出现一次的字符
第一个只出现一次的字符: 对于给定的字符,遍历一遍,然后将其映射到一个hash表中,遍历完成之后,遍历哈希表, 遇到的第一个哈希值为1所对应的字符就是第一个只出现了一次的字符 public class _Q35<T> { public char FirstNotRepeatingChar(char chars[]){ if(chars == null) ret原创 2016-04-26 16:38:08 · 464 阅读 · 0 评论 -
【剑指offer-Java版】15链表中倒数第K个结点
链表中倒数第K个结点:快慢指针解决 需要注意的地方是 1) 可能会存在输入的链表大小小于k 2) 输入的k可能小于等于0 - 所以必须限定k大于0 public class _Q15 { public ListNode FindKthToTail(ListNode head, int k){ if(head == null || k < 1) return n原创 2016-04-25 22:53:17 · 312 阅读 · 0 评论 -
【剑指offer-Java版】14调整数组顺序使奇数位于偶数前面
调整数组顺序使奇数位于偶数前面:遍历交换特殊输入: 1) 只有一个数字 2) 全奇数或者全偶数 3) 空指针 4) 正常输入 考虑到扩展性,C++里面使用了函数指针来实现,但是对于java,可以采用接口实现 - 思路比较简单 public class _Q14 { public void ReorderOddEven(int array[]){ if(ar原创 2016-04-25 22:52:14 · 484 阅读 · 0 评论 -
【剑指offer-Java版】13O(1)时间删除链表结点
O(1)时间删除链表结点 前提是调用者知道要删除的结点的指针,而不是要删除结点的值 不过此类删除问题,当然是存在各种边界条件了: 1) 链表中只有一个结点 - 删除唯一的一个 2) 要删除的结点是最后一个结点 - 3) 要删除的结点不存在 - 多虑了,毕竟给定的参数是一个结点参数,所以不会存在这种问题,除非调用者故意给定 public class _Q13 { publi原创 2016-04-25 22:50:10 · 435 阅读 · 0 评论