原理:泛型的实现是靠类型擦除技术,类型擦除是在编译期完成的,在编译期,编译器会将泛型的类型参数都擦除成它的限定类型,若是没有则擦除为object类型以后在获取的时候再强制类型转换为对应的类型。mysql
使用场景:参数类型能够用在类、接口和方法的建立中,分别称为泛型类、泛型接口和泛型方法。git
优势:算法
缺点:在性能上不如数组快。sql
public static int parseInt(String s) throws NumberFormatException { return parseInt(s,10); } public static int parseInt(String s, int radix) throws NumberFormatException { /* * 将整数字符串s转换成10进制的整数 * radix用来指明s是几进制 */ //处理字符串s为空的状况 if (s == null) { throw new NumberFormatException("null"); } //Character.MIN_RADIX为2,就是进制数radix小于2进制的话也是无效的 if (radix < Character.MIN_RADIX) { throw new NumberFormatException("radix " + radix + " less than Character.MIN_RADIX"); } //Character.MAX_RADIX为36,就是进制数radix大于36进制的话也是无效的 if (radix > Character.MAX_RADIX) { throw new NumberFormatException("radix " + radix + " greater than Character.MAX_RADIX"); } int result = 0; //判断正负号的标记,初始化为正 boolean negative = false; int i = 0, len = s.length(); int limit = -Integer.MAX_VALUE; int multmin; int digit; if (len > 0) { //取出第一个字符判断时候包含正负号 char firstChar = s.charAt(0); if (firstChar < '0') { if (firstChar == '-') { negative = true; //如果字符串的符号是﹣,由于下面每次的result是相减的形式,因此这里是﹢的 limit = Integer.MIN_VALUE; } else if (firstChar != '+') throw NumberFormatException.forInputString(s); if (len == 1) throw NumberFormatException.forInputString(s); i++; } multmin = limit / radix; while (i < len) { // 返回使用指定radix进制的字符 s.charAt(i++) 的数值 digit = Character.digit(s.charAt(i++),radix); // s.charAt(i++)的值是一个使用指定radix进制的无效数字,则返回 -1,异常 if (digit < 0) { throw NumberFormatException.forInputString(s); } if (result < multmin) { throw NumberFormatException.forInputString(s); } //上一次的结果乘以radix进制 result *= radix; //处理溢出状况 if (result < limit + digit) { throw NumberFormatException.forInputString(s); } result -= digit; } } else {//长度小于0的话,异常 throw NumberFormatException.forInputString(s); } //negative是true的话,此整数是负的,输出result //negative是false的话,此整数是正的,输出-result return negative ? result : -result; }
互斥同步:推荐使用 synchronized 关键字进行同步, 在 concurrent包中有ReentrantLock类, 实现效果差很少. 仍是推荐原生态的synchronized.数据库
非阻塞同步:须要硬件指令完成.经常使用的指令有:编程
Test-and-Set设计模式
Fetch-and-Increment数组
Swap安全
Compare-and-Swap (CAS)
Load-Linked/Store-Conditional (LL/SC)
典型的应用在 AtomicInteger 中
无同步方案:将变量保存在本地线程中,就不会出现多个线程并发的错误了。
java中主要使用的就是ThreadLocal这个类。
private static void quickSort(int[] array, int _left, int _right) { int left = _left;// int right = _right; int pivot;//基准线 if (left < right) { pivot = array[left]; while (left != right) { //从右往左找到比基准线小的数 while (left < right && pivot <= array[right]) { right--; } //将右边比基准线小的数换到左边 array[left] = array[right]; //从左往右找到比基准线大的数 while (left < right && pivot >= array[left]) { left++; } //将左边比基准线大的数换到右边 array[right] = array[left]; } //此时left和right指向同一位置 array[left] = pivot; quickSort(array, _left, left - 1); quickSort(array, left + 1, _right); } }
类加载的过程主要分为三个部分:
连接又能够细分为
程序计数器:记录正在执行的虚拟机字节码指令的地址(若是正在执行的是本地方法则为空)。
Java虚拟机栈:每一个 Java 方法在执行的同时会建立一个栈帧用于存储局部变量表、操做数栈、常量池引用等信息。每个方法从调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。
本地方法栈:与 Java 虚拟机栈相似,它们之间的区别只不过是本地方法栈为本地方法服务。
Java堆:几乎全部对象实例都在这里分配内存。是垃圾收集的主要区域("GC 堆"),虚拟机把 Java 堆分红如下三块:
新生代又可细分为Eden空间、From Survivor空间、To Survivor空间,默认比例为8:1:1。
方法区:方法区(Method Area)与Java堆同样,是各个线程共享的内存区域。Object Class Data(类定义数据)是存储在方法区的,此外,常量、静态变量、JIT编译后的代码也存储在方法区。
运行时常量池:运行时常量池是方法区的一部分。Class 文件中的常量池(编译器生成的各类字面量和符号引用)会在类加载后被放入这个区域。除了在编译期生成的常量,还容许动态生成,例如 String 类的 intern()。这部分常量也会被放入运行时常量池。
直接内存:直接内存(Direct Memory)并非虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,可是这部份内存也被频繁地使用,并且也可能致使OutOfMemoryError 异常出现。避免在Java堆和Native堆中来回复制数据。
HTTPS(Secure Hypertext Transfer Protocol) 安全超文本传输协议是一个安全的通讯通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。HTTPS使用安全套接字层(SSL)进行信息交换,简单来讲HTTPS是HTTP的安全版,是使用TLS/SSL加密的HTTP协议。
https通讯过程
public class Singleton { private volatile static Singleton instance = null; private Singleton() { } /** * 当第一次调用getInstance()方法时,instance为空,同步操做,保证多线程实例惟一 * 当第一次后调用getInstance()方法时,instance不为空,不进入同步代码块,减小了没必要要的同步 */ public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
AOP是对OOP的补充和完善。AOP利用的是代理,分为CGLIB动态代理和JDK动态代理。OOP引入封装、继承和多态性等概念来创建一种对象层次结构。OOP编程中,会有大量的重复代码。而AOP则是将这些与业务无关的重复代码抽取出来,而后再嵌入到业务代码当中。实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法建立“方面”,从而使得编译器能够在编译期间织入有关“方面”的代码,属于静态代理。