String 类能被继承吗,为什么。
String类不能被继承 因为他是final 修饰的.String,Stringbuffer,StringBuilder的区别。
String初始化后将不能进行改变对象.对于大量字符串进行相加,会产生大量的对象.
Stringbuffer 是一个线程安全, StringBulider 是线程不安全的 StringBulider 速度相对较快.
StringBuffer 和StringBulider 内部对象可以进追加或者改变 一般使用 append() 方法 insert ( ) 根据当前字符床位置插入对象.ArrayList 和 LinkedList 有什么区别。
ArrayList 和 LinkeList 都继承了 AbstartList, 都属于集合collection 实现了 list接口.
ArrayList 底层实现是一个数据, 他是一个可以进行长度自增的数据变量. 初始化容量是10, 对于ArrayList 进行数据扩容使用的方法为 Arrays.copyOf(elementData, newCapacity);
ArrayList 执行插入删除数据时. 会将elementData 数组中的操作位置 (index) 后的全部元素进行后移/前移. 移位操作使用的是 System.arraycopy()这个方法实现的.
ArrayList 优势,进行数据查找效率较高.但是数据进行增加删除时 需要进行数组拷贝, 进行移位操作.在进行添加数据元素是可能会进行数组扩容操作. 数组扩容过程中, 会占用冗余的内存空间.
ArrayList 每次扩容的时候会将原来的数组扩展成当前的1.5倍.LinkedList 是个基于双向链表的结构的集合.每一个元素只含有链的表头. 和链的表尾的指针.的引用 Node 节点是LinkedList的一个内部类.
LinkedList 进行数据添加删除时 当数据位于链表头或者尾时, 效率比较高, 不需要进行辩论讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候,他们的执行顺序。
当类第一次进行加载的时候 : 会对静态初始化块, 静态成员变量, 静态方法进行初始, 静态变量和静态初始化块的 执行顺序和 两个在代码中的顺序有关.
当执行new方法时 会先执行父类的初始化块, 然后父类的构造函数, 在执行子类的初始化块,子类的构造函数
类实例进行销毁的时候, 首先执行子类的finalize 方法, 在执行父类的finalize 方法用过哪些 Map 类,都有什么区别,HashMap 是线程安全的吗,并发下使用的 Map 是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。
[plain] view plain copy
当 HashMap 中的元素个数超过数组大小 loadFactor时,就会进行数组扩容,loadFactor的默认值为 0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为 16,那么当 HashMap 中元素个数超过 16*0.75=12 的时候,就把数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知 HashMap 中元素的个数,那么预设元素的个数能够有效的提高 HashMap 的性能。
HashMap 的性能参数
HashMap 包含如下几个构造器:
HashMap():构建一个初始容量为 16,负载因子为 0.75 的 HashMap。
HashMap(int initialCapacity):构建一个初始容量为 initialCapacity,负载因子为 0.75 的 HashMap
ConcurrentHashMap适用于读者数量超过写者时,当写者数量大于等于读者时,CHM的性能是低于Hashtable和synchronized Map的。这是因为当锁住了整个Map时,读操作要等待对同一部分执行写操作的线程结束。CHM适用于做cache,在程序启动时初始化,之后可以被多个请求线程访问。正如Javadoc说明的那样,CHM是HashTable一个很好的替代,但要记住,CHM的比HashTable的同步性稍弱
ArrayList:默认长度是10 一次扩容50%
默认长度是10 一次扩容50%- JAVA8 的 ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计。
[plain] view plain copy
从Java 8开始,HashMap,ConcurrentHashMap和LinkedHashMap在处理频繁冲突时将使用平衡树来代替链表,
当同一hash桶中的元素数量超过特定的值便会由链表切换到平衡树,这会将get()方法的性能从O(n)提高到O(logn)。 - 有没有有顺序的Map 实现类,如果有,他们是怎么保证有序的。
- 抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。
- 继承和聚合的区别在哪。
- 讲讲你理解的 nio。他和 bio 的区别是啥,谈谈 reactor 模型。
[plain] view plain copy
Reactor模式首先是事件驱动的,有一个或多个并发输入源,有一个Service Handler,有多个Request Handlers;这个Service Handler会同步的将
输入的请求(Event)多路复用的分发给相应的Request Handle
http://www.blogjava.net/DLevin/archive/2015/09/02/427045.html - 反射的原理,反射创建类实例的三种方式是什么。
- 反射中,Class.forName 和 ClassLoader 区别。
- 描述动态代理的几种实现方式,分别说出相应的优缺点。
jdk动态代理和cglib动态代理。两种方法同时存在,各有优劣。jdk动态代理是由Java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。还有一点必须注意:jdk动态代理的应用前提,必须是目标类基于统一的接口。如果没有上述前提,jdk动态代理不能应用。由此可以看出,jdk动态代理有一定的局限性,cglib这种第三方类库实现的动态代理应用更加广泛,且在效率上更有优势。。 - 动态代理与cglib 实现的区别。
- 为什么CGlib 方式可以对接口实现代理。
- final的用途。
[plain] view plain copy
final类不能被继承,没有子类,final类中的方法默认是final的。
final方法不能被子类的方法覆盖,但可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final不能用于修饰构造方法 - 出三种单例模式实现。
- 如何在父类中为子类自动完成所有的 hashcode 和 equals 实现?这么做有何优劣。
- 请结合 OO 设计理念,谈谈访问修饰符 public、private、protected、default 在应用设计中的作用。
- 深拷贝和浅拷贝区别。
- 数组和链表数据结构描述,各自的时间复杂度。
- error 和 exception 的区别,CheckedException,RuntimeException 的区别。
- 请列出 5 个运行时异常。
- 在自己的代码中,如果创建一个 java.lang.String 对象,这个对象是否可以被类加载器加载?为什么。
[plain] view plain copy
http://blog.csdn.net/bbirdsky/article/details/8283143
字符串类(Java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生。在很多面试题中经常用String大做文章,只要掌握了String特性,对付它们就不再是困难了。
1、从根本上认识java.lang.String类和String池
首先,我建议先看看String类的源码实现,这是从本质上认识String类的根本出发点。
从源码中可以看到:
String类是final的,不可被继承。public final class String。
String类是的本质是字符数组char[], 并且其值不可改变。private final char value[];
然后打开String类的API文档,从API中可以发现:
String类对象有个特殊的创建的方式,就是直接指定比如String x = “abc”,”abc”就表示一个字符串对象。而x是”abc”对象的地址,也叫做”abc”对象的引用。
String对象可以通过“+”串联。串联后会生成新的字符串。也可以通过concat()来串联,这个后面会讲述。
Java运行时会维护一个String Pool(String池),JavaDoc翻译很模糊“字符串缓冲区”。String池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法的堆栈区。
2、创建字符串的方式
创建字符串的方式很多,归纳起来有三类:
使用new关键字创建字符串,比如String s1 = new String(“abc”);
直接指定。比如String s2 = “abc”;
使用串联生成新的字符串。比如String s3 = “ab” + “c”。
3、String对象的创建的特性
String对象的创建也很讲究,关键是要明白其原理。
特性1:
当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个字符串的内容在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加。
特性2:
Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
特性3:
使用直接指定、使用纯字符串串联或者在编译期间可以确定结果的变量表达式来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢了!但绝不会在堆栈区再去创建该String对象;
1、 直接指定,例如:下面代码运行结果为true;
String str1 = “abc”;
String str2 = “abc”;
System.out.println(str1 == str2);
2、 使用纯字符串串联,例如:下面代码运行结果为true;
String str1 = “abc”;
String str2 = “ab” + “c”;
System.out.println(str1 == str2);
3、 在编译期间可以确定结果的变量表达式,例如:下面代码运行结果为true。
final String str1 = “c”; //final类型的变量在编译时当常量处理
String str2 = “ab” + “c”;
String str3 = “ab” + str1;
System.out.println(str2==str3);
否则使用包含编译期间无法确定结果的变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String(由StringBuilder.toString()生成)对象。
1、普通变量表达式进行创建字符串,例如:下面代码运行结果为false;
String str1 = “c”;
String str2 = “ab” + “c”;
String str3 = “ab” + str1;
System.out.println(str2==str3); - 说一说你对 java.lang.Object 对象中 hashCode 和 equals 方法的理解。在什么场景下需要重新实现这两个方法。
- 在 jdk1.5 中,引入了泛型,泛型的存在是用来解决什么问题。
- 这样的 a.hashcode() 有什么用,与 a.equals(b)有什么关系。
[plain] view plain copy
1、equals方法用于比较对象的内容是否相等(覆盖以后)
2、hashcode方法只有在集合中用到
3、当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等)。
4、将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。
如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。 - 有没有可能 2 个不相等的对象有相同的 hashcode。
[plain] view plain copy
equals()相等的两个对象,hashcode()一定相等;
equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。 - Java 中的 HashSet 内部是如何工作的。
- 什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。
JVM 知识 - 什么情况下会发生栈内存溢出。
[plain] view plain copy
至于是堆内存溢出还是方法区内存溢出还是栈内存溢出,其实可以用一些工具比如
JConsole来监视 - JVM 的内存结构,Eden 和 Survivor 比例。
- jvm 中一次完整的 GC 流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的 jvm 参数。
- 你知道哪几种垃圾收集器,各自的优缺点,重点讲下 cms,包括原理,流程,优缺点
- 垃圾回收算法的实现原理。
- 当出现了内存溢出,你怎么排错。
- JVM 内存模型的相关知识了解多少,比如重排序,内存屏障,happen-before,主内存,工作内存等。
- 简单说说你了解的类加载器。
- 讲讲 JAVA 的反射机制。
- 你们线上应用的 JVM 参数有哪些。
- g1 和 cms 区别,吞吐量优先和响应优先的垃圾收集器选择。
- 请解释如下 jvm 参数的含义:
[plain] view plain copy
-server -Xms512m -Xmx512m -Xss1024K
-XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=20 XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly。
http://blog.csdn.net/a503921892/article/details/39048889
Xmx3550m:设置JVM最大可用内存为3550M。
-Xms3550m:设置JVM初始内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xss128k: 设置每个线程的堆栈大小。在相同物理内 存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,
经验值在3000~5000左右
-XX:MaxPermSize=16m:设置持久代大小为16m
-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。
如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
开源框架知识 - 简单讲讲 tomcat 结构,以及其类加载器流程。
- tomcat 如何调优,涉及哪些参数。
- 讲讲 spring 加载流程。
- 讲讲 Spring 事务的传播属性。
PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 - Spring 如何管理事务的。
- Spring 怎么配置事务(具体说出一些关键的 xml元素)。
[plain] view plain copy
tx:advice,aop:config - 说说你对 Spring 的理解,非单例注入的原理?它的生命周期?循环注入的原理,aop 的实现原理,说说 aop 中的几个术语,它们是怎么相互工作的。
- Springmvc 中 DispatcherServlet初始化过程。
操作系统 - Linux 系统下你关注过哪些内核参数,说说你知道的。
- linux 下 IO 模型有几种,各自的含义是什么。
- epoll 和 poll 有什么区别。
- 平时用到哪些 Linux 命令。
- 用一行命令查看文件的最后五行。
[plain] view plain copy
输出test文件的后五行:
liyi@liyi:~/Desktop > tail -n 5 test
输出test文件的前五行:
liyi@liyi:~/Desktop > head -n 5 test - 用一行命令输出正在运行的 java 进程。
- 介绍下你理解的操作系统中线程切换过程。
- 进程和线程的区别。
多线程 - 多线程的几种实现方式,什么是线程安全。
- volatile 的原理,作用,能代替锁么。
- 画一个线程的生命周期状态图。
- sleep 和 wait 的区别。
- Lock 与 Synchronized 的区别。
- synchronized 的原理是什么,解释以下名词:重排序,自旋锁,偏向锁,轻量级锁,可重入锁,公平锁,非公平锁,乐观锁,悲观锁。
- 用过哪些原子类,他们的原理是什么。
- 用过线程池吗,newCache 和 newFixed 有什么区别,他们的原理简单概括下,构造函数的各个参数的含义是什么,比如 coreSize,maxsize 等。
- 线程池的关闭方式有几种,各自的区别是什么。
- 假如有一个第三方接口,有很多个线程去调用获取数据,现在规定每秒钟最多有 10 个线程同时调用它,如何做到。
- spring 的 controller 是单例还是多例,怎么保证并发的安全。
[java] view plain copy
singleton : bean在每个Spring ioc 容器中只有一个实例。
prototype:一个bean的定义可以有多个实例。
request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。 - 用三个线程按顺序循环打印 abc 三个字母,比如 abcabcabc。
[plain] view plain copy
思路:解题思路大概是这样的,开启三个线程,每个线程一次打印一个字母,并且按照一定的顺序打印,当打印A的时候,其他线程处于阻塞状态,打印完A以后,
将线程解锁,让打印B的那个线程开启,其他线程处于阻塞状态,同理打印C的时候,阻塞其他线程,这三个线程顺序循环,就达到顺序多次打印ABC的目的了。
这道题看似思路简单,其实主要需要用到wait()方法和notify()方法,还有关键字synchronized,只有充分理解了这些,才能解出这道题。下面我有必要讲解一下这两个方法,
还有关键字synchronized。 - ThreadLocal 用过么,用途是什么,原理是什么,用的时候要注意什么。
- 如果让你实现一个并发安全的链表,你会怎么做。
- 有哪些无锁数据结构,他们实现的原理是什么。
- 讲讲 java 同步机制的 wait 和 notify。
- 多线程如果线程挂住了怎么办。
- countdowlatch 和 cyclicbarrier的内部原理和用法,以及相互之间的差别。
- 使用 synchronized 修饰静态方法和非静态方法有什么区别。
[java] view plain copy
所有的非静态同步方法用的都是同一把锁——实例对象本身,也就是说如果一个实例对象的非静态同步方法获取锁后,
该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁,
可是别的实例对象的非静态同步方法因为跟该实例对象的非静态同步方法用的是不同的锁,
所以毋须等待该实例对象已获取锁的非静态同步方法释放锁就可以获取他们自己的锁。
而所有的静态同步方法用的也是同一把锁——类对象本身,这两把锁是两个不同的对象,
所以静态同步方法与非静态同步方法之间是不会有竞态条件的。但是一旦一个静态同步方法获取锁后,
其他的静态同步方法都必须等待该方法释放锁后才能获取锁,而不管是同一个实例对象的静态同步方法之间,
还是不同的实例对象的静态同步方法之间,只要它们同一个类的实例对象! - 简述 ConcurrentLinkedQueue 和 LinkedBlockingQueue 的用处和不同之处。
- 导致线程死锁的原因?怎么解除线程死锁。
- 非常多个线程(可能是不同机器),相互之间需要等待协调,才能完成某种工作,问怎么设计这种协调方案。
- 正确使用 Volatile 变量
[plain] view plain copy
正确使用 volatile 变量的条件
您只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:
1对变量的写操作不依赖于当前值。
2该变量没有包含在具有其他变量的不变式中。
http://www.ibm.com/developerworks/cn/java/j-jtp06197.html
TCP 与 HTTP - http1.0 和 http1.1 有什么区别。
[java] view plain copy
在http1.0中,当建立连接后,客户端发送一个请求,服务器端返回一个信息后就关闭连接,
当浏览器下次请求的时候又要建立连接,显然这种不断建立连接的方式,会造成很多问题。
在http1.1中,引入了持续连接的概念,通过这种连接,浏览器可以建立一个连接之后,
发送请求并得到返回信息,然后继续发送请求再次等到返回信息,也就是说客户端可以连续发送多个请求,而不用等待每一个响应的到来。 - TCP 三次握手和四次挥手的流程,为什么断开连接要 4次,如果握手只有两次,会出现什么。
- TIME_WAIT 和 CLOSE_WAIT 的区别。
- 说说你知道的几种 HTTP 响应码,比如 200, 302, 404。
- 当你用浏览器打开一个链接的时候,计算机做了哪些工作步骤。
- TCP/IP 如何保证可靠性,说说 TCP 头的结构。
- 如何避免浏览器缓存。
- 简述 Http 请求 get 和 post 的区别以及数据包格式。
- 简述 HTTP 请求的报文格式。
- HTTPS 的加密方式是什么,讲讲整个加密解密流程。
架构设计与分布式 - 常见的缓存策略有哪些,你们项目中用到了什么缓存系统,如何设计的。
- 用 java 自己实现一个 LRU。
- 分布式集群下如何做到唯一序列号。
- 设计一个秒杀系统,30 分钟没付款就自动关闭交易。
- 如何使用 Redis 和 zookeeper 实现分布式锁?有什么区别优缺点,分别适用什么场景。
- 如果有人恶意创建非法连接,怎么解决。
- 分布式事务的原理,优缺点,如何使用分布式事务。
- 什么是一致性 hash。
- 什么是 restful,讲讲你理解的 restful。
- 如何设计建立和保持 100w 的长连接。
- 如何防止缓存雪崩。
- 解释什么是 MESI 协议(缓存一致性)。
- 说说你知道的几种 HASH 算法,简单的也可以。
- 什么是 paxos 算法。
- 什么是 zab 协议。
- 一个在线文档系统,文档可以被编辑,如何防止多人同时对同一份文档进行编辑更新。
- 线上系统突然变得异常缓慢,你如何查找问题。
- 说说你平时用到的设计模式。
- Dubbo 的原理,数据怎么流转的,怎么实现集群,负载均衡,服务注册和发现。重试转发,快速失败的策略是怎样的。
- 一次 RPC 请求的流程是什么。
- 异步模式的用途和意义。
- 缓存数据过期后的更新如何设计。
- 编程中自己都怎么考虑一些设计原则的,比如开闭原则,以及在工作中的应用。
- 设计一个社交网站中的“私信”功能,要求高并发、可扩展等等。画一下架构图。
- MVC 模式,即常见的 MVC 框架。
- 聊了下曾经参与设计的服务器架构。
- 应用服务器怎么监控性能,各种方式的区别。
- 如何设计一套高并发支付方案,架构如何设计。
- 如何实现负载均衡,有哪些算法可以实现。
- Zookeeper 的用途,选举的原理是什么。
- Mybatis 的底层实现原理。
[plain] view plain copy
MyBatis底层就是JDBC 所以他的核心就是配置文件 :
1:全局配置文件 (配置数据源 事务运行时信息)
2:映射文件(执行statement的相关信息,包括SQL语句,输入参数,输出结果)
MyBatis把全局配置文件加载到内容中 构建出SqlSessionFactory ,这个工厂的作用相当于生产对象生产SqlSession。
SqlSession :它是一个面向程序员的接口,可以操作数据库。 接口有一个默认实现DefaultSqlSession。
在SqlSession 中有一个executor 执行器。 SqlSession 本身不能操作数据库 需要通过这个执行器去操作。有2个实现 一个叫做基本执行器,还有一个缓存执行器
(默认)。 MappedStatement:封装了执行Statement信息,包括SQL语句 输入参数,输出结果。由它去操作数据库。
输入输出参数类型:
1:基本类型
2:自定义类型
3:hashmap
根据源码:看到Sqlsession内部并不能直接操作数据库。而是利用内部的一个执行器去操作数据库。执行器执行的时候会去执行MappedStatement
到最后才去真正执行数据库。 - 请思考一个方案,设计一个可以控制缓存总体大小的自动适应的本地缓存。
- 请思考一个方案,实现分布式环境下的 countDownLatch。
- 后台系统怎么防止请求重复提交。
[java] view plain copy
http://blog.csdn.net/wws199304/article/details/44279589 - 如何看待缓存的使用(本地缓存,集中式缓存),简述本地缓存和集中式缓存和优缺点。本地缓存在并发使用时的注意事项。
- 描述一个服务从发布到被消费的详细过程。
- 讲讲你理解的服务治理。
- 如何做到接口的幂等性。
[java] view plain copy
接口幂等性,只要保证接口内的逻辑不涉及接口外的对象状态累积或变迁即可。
譬如说需求是:
当用户点击赞同时,将答案的赞同数量+1。
改为:
当用户点击赞同时,确保答案赞同表中存在一条记录,用户、答案。
赞同数量由答案赞同表统计出来
39.redis和memcached的区别
[java] view plain copy
1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等;
2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;
3、虚拟内存–Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘;
4、过期策略–memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定,例如expire name 10;
5、分布式–设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从;
6、存储数据安全–memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化);
7、灾难恢复–memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复;
8、Redis支持数据的备份,即master-slave模式的数据备份;
9、应用场景不一样:Redis出来作为NoSQL数据库使用外,还能用做消息队列、数据堆栈和数据缓存等;Memcached适合于缓存SQL语句、数据集、用户临时性数据、延迟查询数据和session等。
算法 - 10 亿个数字里里面找最小的 10 个。
- 有 1 亿个数字,其中有 2 个是重复的,快速找到它,时间和空间要最优。
- 2 亿个随机生成的无序整数,找出中间大小的值。
- 给一个不知道长度的(可能很大)输入字符串,设计一种方案,将重复的字符排重。
- 遍历二叉树。
- 有 3n+1 个数字,其中 3n 个中是重复的,只有 1 个是不重复的,怎么找出来。
- 写一个字符串反转函数。
- 常用的排序算法,快排,归并、冒泡。 快排的最优时间复杂度,最差复杂度。冒泡排序的优化方案。
- 二分查找的时间复杂度,优势。
- 一个已经构建好的 TreeSet,怎么完成倒排序。
- 什么是 B+树,B-树,列出实际的使用场景。
SQL - 行转列
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
[plain] view plain copy
SELECT 姓名,
max(CASE 课程 WHEN’语文’ THEN 分数 ELSE 0 END) 语文,
max(CASE 课程 WHEN’数学’ THEN 分数 ELSE 0 END) 数学,
max(CASE 课程 WHEN’物理’ THEN 分数 ELSE 0 END) 物理
FROM tb
GROUP BY 姓名
姓名 语文 数学 物理
李四 74 84 94
张三 74 83 93
2. MySQL存储引擎- MyISAM与InnoDB区别
[plain] view plain copy
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,
而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。
两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁。而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用
中间件
Dubbo提供了多种均衡策略,缺省为random随机调用。
Random LoadBalance
随机,按权重设置随机概率。
在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
RoundRobin LoadBalance
轮循,按公约后的权重设置轮循比率。
存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
LeastActive LoadBalance
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
ConsistentHash LoadBalance
一致性Hash,相同参数的请求总是发到同一提供者。
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
集群容错模式:
Failover Cluster
失败自动切换,当出现失败,重试其它服务器。(缺省)
通常用于读操作,但重试会带来更长延迟。
可通过retries=”2”来设置重试次数(不含第一次)。正是文章刚开始说的那种情况.
Failfast Cluster
快速失败,只发起一次调用,失败立即报错。
通常用于非幂等性的写操作,比如新增记录。
Failsafe Cluster
失败安全,出现异常时,直接忽略。
通常用于写入审计日志等操作。
Failback Cluster
失败自动恢复,后台记录失败请求,定时重发。
通常用于消息通知操作。
Forking Cluster
并行调用多个服务器,只要一个成功即返回。
通常用于实时性要求较高的读操作,但需要浪费更多服务资源。
可通过forks=”2”来设置最大并行数。
Broadcast Cluster
广播调用所有提供者,逐个调用,任意一台报错则报错。(2.1.0开始支持)
通常用于通知所有提供者更新缓存或日志等本地资源信息。
重试次数配置如:(failover集群模式生效)
MQ分布式系统事务一致性解决方案
http://www.infoq.com/cn/articles/solution-of-distributed-system-transaction-consistency
redis分布式缓存
http://blog.csdn.net/javaloveiphone/article/details/52327240
http://blog.csdn.net/javaloveiphone/article/details/52352894