网站做优化好还是推广好,电商运营有前途吗,网站建设项目价格,关键词排名优化方法JAVA基础
JAVA中的几种基本类型#xff0c;各占用多少字节#xff1f;
下图单位是bit,非字节 1B8bit
String能被继承吗#xff1f;为什么#xff1f;
不可以#xff0c;因为String类有final修饰符#xff0c;而final修饰的类是不能被继承的#xff0c;实现细节不允许…JAVA基础
JAVA中的几种基本类型各占用多少字节
下图单位是bit,非字节 1B8bit
String能被继承吗为什么
不可以因为String类有final修饰符而final修饰的类是不能被继承的实现细节不允许改变。平常我们定义的String str”a”;其实和String strnew String(“a”)还是有差异的。
前者默认调用的是String.valueOf来返回String实例对象至于调用哪个则取决于你的赋值比如String num1,调用的是 public static String valueOf(int i) { return Integer.toString(i); }
后者则是调用如下部分 public String(String original) { this.value original.value; this.hash original.hash; } 最后我们的变量都存储在一个char数组中 private final char value[];
String Stringbuffer StringBuilder 的区别。
String 字符串常量(final修饰不可被继承)String是常量当创建之后即不能更改。(可以通过StringBuffer和StringBuilder创建String对象(常用的两个字符串操作类)。) StringBuffer 字符串变量线程安全,其也是final类别的不允许被继承其中的绝大多数方法都进行了同步处理包括常用的Append方法也做了同步处理(synchronized修饰)。其自jdk1.0起就已经出现。其toString方法会进行对象缓存以减少元素复制开销。 public synchronized String toString() { if (toStringCache null) { toStringCache Arrays.copyOfRange(value, 0, count); } return new String(toStringCache, true); }
StringBuilder 字符串变量非线程安全其自jdk1.5起开始出现。与StringBuffer一样都继承和实现了同样的接口和类方法除了没使用synch修饰以外基本一致不同之处在于最后toString的时候会直接返回一个新对象。 public String toString() { // Create a copy, don’t share the array return new String(value, 0, count); }
JAVA容器列举同步容器和并发容器
Collection下 和 Map下的实现 例如ArrayList, HashMap. HashTable, HashSet, LinkedArrayList等
同步容器 HashTableVector
并发容器: ConcurrentHashMap
ArrayList 和 LinkedList 有什么区别以及查询和插入的时间复杂度。
ArrayList和LinkedList都实现了List接口有以下的不同点 1、ArrayList是基于索引的数据接口它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应LinkedList是以元素列表的形式存储它的数据每一个元素都和它的前一个和后一个元素链接在一起在这种情况下查找某个元素的时间复杂度是O(n)。 2、相对于ArrayListLinkedList的插入添加删除操作速度更快因为当元素被添加到集合任意位置的时候不需要像数组那样重新计算大小或者是更新索引。 3、LinkedList比ArrayList更占内存因为LinkedList为每一个节点存储了两个引用一个指向前一个元素一个指向下一个元素。
讲讲类的实例化顺序比如父类静态数据构造函数字段子类静态数据构造函数字段当 new 的时候 他们的执行顺序。
此题考察的是类加载器实例化时进行的操作步骤加载–连接-初始化。 父类静态代变量、 父类静态代码块、 子类静态变量、 子类静态代码块、 父类非静态变量父类实例成员变量、 父类构造函数、 子类非静态变量子类实例成员变量、 子类构造函数。 测试demohttp://blog.csdn.net/u014042066/article/details/77574956 参阅我的博客《深入理解类加载》http://blog.csdn.net/u014042066/article/details/77394480
用过哪些 Map 类都有什么区别HashMap 是线程安全的吗,并发下使用的 Map 是什么他们内部原理分别是什么比如存储方式 hashcode扩容 默认容量等。
hashMap是线程不安全的HashMap是数组链表红黑树JDK1.8增加了红黑树部分实现的采用哈希表来存储的 参照该链接https://zhuanlan.zhihu.com/p/21673805 JAVA8 的 ConcurrentHashMap 为什么放弃了分段锁有什么问题吗如果你来设计你如何设计。 参照https://yq.aliyun.com/articles/36781
有没有有顺序的 Map 实现类 如果有 他们是怎么保证有序的。
TreeMap和LinkedHashMap是有序的TreeMap默认升序LinkedHashMap则记录了插入顺序。 参照http://uule.iteye.com/blog/1522291
请你简单说下HashMap的Put()方法.
抽象类和接口的区别类可以继承多个类么接口可以继承多个接口么,类可以实现多个接口么。
1、抽象类和接口都不能直接实例化如果要实例化抽象类变量必须指向实现所有抽象方法的子类对象接口变量必须指向实现所有接口方法的类对象。 2、抽象类要被子类继承接口要被类实现。 3、接口只能做方法申明抽象类中可以做方法申明也可以做方法实现 4、接口里定义的变量只能是公共的静态的常量抽象类中的变量是普通变量。 5、抽象类里的抽象方法必须全部被子类所实现如果子类不能全部实现父类抽象方法那么该子类只能是抽象类。同样一个实现接口的时候如不能全部实现接口方法那么该类也只能为抽象类。 6、抽象方法只能申明不能实现。abstract void abc();不能写成abstract void abc(){}。 7、抽象类里可以没有抽象方法 8、如果一个类里有抽象方法那么这个类只能是抽象类 9、抽象方法要被实现所以不能是静态的也不能是私有的。 10、接口可继承接口并可多继承接口但类只能单根继承。
继承和聚合的区别在哪。
继承指的是一个类称为子类、子接口继承另外的一个类称为父类、父接口的功能并可以增加它自己的新功能的能力继承是类与类或者接口与接口之间最常见的关系在Java中此类关系通过关键字extends明确标识在设计时一般没有争议性
聚合是关联关系的一种特例他体现的是整体与部分、拥有的关系即has-a的关系此时整体与部分之间是可分离的他们可以具有各自的生命周期部分可以属于多个整体对象也可以为多个整体对象共享比如计算机与CPU、公司与员工的关系等表现在代码层面和关联关系是一致的只能从语义级别来区分
参考http://www.cnblogs.com/jiqing9006/p/5915023.html
讲讲你理解的 nio和 bio 的区别是啥谈谈 reactor 模型。
IO是面向流的NIO是面向缓冲区的 参考https://zhuanlan.zhihu.com/p/23488863 http://developer.51cto.com/art/201103/252367.htm http://www.jianshu.com/p/3f703d3d804c
反射的原理反射创建类实例的三种方式是什么
getClass
2.xxx.class
Class.forName
参照http://www.jianshu.com/p/3ea4a6b57f87?amp
http://blog.csdn.net/yongjian1092/article/details/7364451
反射中Class.forName 和 ClassLoader 区别。
Class.forName(className)方法其实调用的方法是Class.forName(className,true,classloader);注意看第2个boolean参数它表示的意思在loadClass后必须初始化。比较下我们前面准备jvm加载类的知识我们可以清晰的看到在执行过此方法后目标对象的 static块代码已经被执行static参数也已经被初始化。
再看ClassLoader.loadClass(className)方法其实他调用的方法是ClassLoader.loadClass(className,false);还是注意看第2个 boolean参数该参数表示目标对象被装载后不进行链接这就意味这不会去执行该类静态块中间的内容。因此2者的区别就显而易见了
https://my.oschina.net/gpzhang/blog/486743
描述动态代理的几种实现方式分别说出相应的优缺点。
Jdk cglib jdk底层是利用反射机制需要基于接口方式这是由于 Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); Cglib则是基于asm框架实现了无反射机制进行代理利用空间来换取了时间代理效率高于jdk http://lrd.ele.me/2017/01/09/dynamic_proxy/
动态代理与 cglib 实现的区别
同上基于invocationHandler和methodInterceptor
为什么 CGlib 方式可以对接口实现代理。
同上
注解原理
https://www.jianshu.com/p/a692150d625c
final 的用途
类、变量、方法 http://www.importnew.com/7553.html
写出三种单例模式实现。
懒汉式单例饿汉式单例双重检查等 参考https://my.oschina.net/dyyweb/blog/609021
如何在父类中为子类自动完成所有的 hashcode 和 equals 实现这么做有何优劣。
同时复写hashcode和equals方法优势可以添加自定义逻辑且不必调用超类的实现。 参照http://java-min.iteye.com/blog/1416727
请结合 OO 设计理念谈谈访问修饰符 public、private、protected、default 在应用设计中的作用。
访问修饰符主要标示修饰块的作用域方便隔离防护
同一个类 同一个包 不同包的子类 不同包的非子类 1 2 Private √ Default √ √ Protected √ √ √ Public √ √ √ √ public Java语言中访问限制最宽的修饰符一般称之为“公共的”。被其修饰的类、属性以及方法不 仅可以跨类访问而且允许跨包package访问。 private: Java语言中对访问权限限制的最窄的修饰符一般称之为“私有的”。被其修饰的类、属性以 及方法只能被该类的对象访问其子类不能访问更不能允许跨包访问。 protect: 介于public 和 private 之间的一种访问修饰符一般称之为“保护形”。被其修饰的类、 属性以及方法只能被类本身的方法及子类访问即使子类在不同的包中也可以访问。 default即不加任何访问修饰符通常称为“默认访问模式“。该模式下只允许在同一个包中进行访 问。
深拷贝和浅拷贝区别。
http://www.oschina.net/translate/java-copy-shallow-vs-deep-in-which-you-will-swim
数组和链表数据结构描述各自的时间复杂度
http://blog.csdn.net/snow_wu/article/details/53172721
error 和 exception 的区别CheckedExceptionRuntimeException 的区别
http://blog.csdn.net/woshixuye/article/details/8230407
请列出 5 个运行时异常。
同上
在自己的代码中如果创建一个 java.lang.String 对象这个对象是否可以被类加载器加载为什么
类加载无须等到“首次使用该类”时加载jvm允许预加载某些类。。。。 http://www.cnblogs.com/jasonstorm/p/5663864.html
说一说你对 java.lang.Object 对象中 hashCode 和 equals 方法的理解。在什么场景下需要重新实现这两个方法。
参考上边试题
在 jdk1.5 中引入了泛型泛型的存在是用来解决什么问题。
泛型的本质是参数化类型也就是说所操作的数据类型被指定为一个参数泛型的好处是在编译的时候检查类型安全并且所有的强制转换都是自动和隐式的以提高代码的重用率 http://baike.baidu.com/item/java%E6%B3%9B%E5%9E%8B
这样的 a.hashcode() 有什么用与 a.equals(b)有什么关系。
hashcode hashcode方法提供了对象的hashCode值是一个native方法返回的默认值与System.identityHashCode(obj)一致。
通常这个值是对象头部的一部分二进制位组成的数字具有一定的标识对象的意义存在但绝不定于地址。
作用是用一个数字来标识对象。比如在HashMap、HashSet等类似的集合类中如果用某个对象本身作为Key即要基于这个对象实现Hash的写入和查找那么对象本身如何实现这个呢就是基于hashcode这样一个数字来完成的只有数字才能完成计算和对比操作。
hashcode是否唯一 hashcode只能说是标识对象在hash算法中可以将对象相对离散开这样就可以在查找数据的时候根据这个key快速缩小数据的范围但hashcode不一定是唯一的所以hash算法中定位到具体的链表后需要循环链表然后通过equals方法来对比Key是否是一样的。
equals与hashcode的关系 equals相等两个对象则hashcode一定要相等。但是hashcode相等的两个对象不一定equals相等。 https://segmentfault.com/a/1190000004520827
有没有可能 2 个不相等的对象有相同的 hashcode。
有
Java 中的 HashSet 内部是如何工作的。
底层是基于hashmap实现的 http://wiki.jikexueyuan.com/project/java-collection/hashset.html
什么是序列化怎么序列化为什么序列化反序列化会遇到什么问题如何解决。
序列化把对象转换为字节序列的过程称为对象的序列化。 反序列化把字节序列恢复为对象的过程称为对象的反序列化。
例如对象在网络中传输, Redis, 消息中间件, 分布式通讯中都是需要用到, 对象必须实现Serializable接口.
https://blog.csdn.net/u013870094/article/details/82765907
JVM 知识
什么情况下会发生栈内存溢出。
如果线程请求的栈深度大于虚拟机所允许的深度将抛出StackOverflowError异常。 如果虚拟机在动态扩展栈时无法申请到足够的内存空间则抛出OutOfMemoryError异常。 参照http://wiki.jikexueyuan.com/project/java-vm/storage.html
JVM 的内存结构Eden 和 Survivor 比例。
eden 和 survior 是按8比1分配的 http://blog.csdn.net/lojze_ly/article/details/49456255
jvm 中一次完整的 GC 流程是怎样的对象如何晋升到老年代说说你知道的几种主要的jvm 参数。
对象诞生即新生代-eden在进行minor gc过程中如果依旧存活移动到from变成Survivor进行标记代数如此检查一定次数后晋升为老年代 http://www.cnblogs.com/redcreen/archive/2011/05/04/2037056.html http://ifeve.com/useful-jvm-flags/ https://wangkang007.gitbooks.io/jvm/content/jvmcan_shu_xiang_jie.html
你知道哪几种垃圾收集器各自的优缺点重点讲下 cms包括原理流程优缺点
Serial、parNew、ParallelScavenge、SerialOld、ParallelOld、CMS、G1 https://wangkang007.gitbooks.io/jvm/content/chapter1.html
垃圾回收算法的实现原理。 http://www.importnew.com/13493.html
内存泄漏与内存溢出的区别, 你怎么排错。
内存泄漏对象无法得到及时的回收持续占用内存空间从而造成内存空间的浪费。 内存溢出内存泄漏到一定的程度就会导致内存溢出但是内存溢出也有可能是大对象导致的。
手动dump
jmap -dump:formatb,fileheap.hprof PID
一般在开发中JVM参数可以加上下面两句这样内存溢出时会自动dump出该文件
-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPathheap.hprof
https://wangkang007.gitbooks.io/jvm/content/4jvmdiao_you.html
一般使用哪些JVM监控工具
jvisualvm,jconsole,Arthas
MAT 用于解析dump文件
JVM性能优化步骤
JVM 内存模型的相关知识了解多少比如重排序内存屏障happen-before主内存工作内存等。
内存屏障为了保障执行顺序和可见性的一条cpu指令 重排序为了提高性能编译器和处理器会对执行进行重拍 happen-before操作间执行的顺序关系。有些操作先发生。 主内存共享变量存储的区域即是主内存 工作内存每个线程copy的本地内存存储了该线程以读/写共享变量的副本 http://ifeve.com/java-memory-model-1/ http://www.jianshu.com/p/d3fda02d4cae http://blog.csdn.net/kenzyq/article/details/50918457
简单说说你了解的类加载器。
类加载器的分类bootstrap,ext,app,curstom类加载的流程(load-link-init) http://blog.csdn.net/gjanyanlig/article/details/6818655/
讲讲 JAVA 的反射机制。
Java程序在运行状态可以动态的获取类的所有属性和方法并实例化该类调用方法的功能 http://baike.baidu.com/link?urlC7p1PeLa3ploAgkfAOK-4XHE8HzQuOAB7K5GPcK_zpbAa_Aw-nO3997K1oir8N–1_wxXZfOThFrEcA0LjVP6wNOwidVTkLBzKlQVK6JvXYvVNhDWV9yF-NIOebtg1hwsnagsjUhOE2wxmiup20RRa#7
你们线上应用的 JVM 参数有哪些。
-server Xms6000M -Xmx6000M -Xmn500M -XX:PermSize500M -XX:MaxPermSize500M -XX:SurvivorRatio65536 -XX:MaxTenuringThreshold0 -Xnoclassgc -XX:DisableExplicitGC -XX:UseParNewGC -XX:UseConcMarkSweepGC -XX:UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction0 -XX:CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction90 -XX:SoftRefLRUPolicyMSPerMB0 -XX:PrintClassHistogram -XX:PrintGCDetails -XX:PrintGCTimeStamps -XX:PrintHeapAtGC -Xloggc:log/gc.log
g1 和 cms 区别,吞吐量优先和响应优先的垃圾收集器选择。
Cms是以获取最短回收停顿时间为目标的收集器。基于标记-清除算法实现。比较占用cpu资源切易造成碎片。 G1是面向服务端的垃圾收集器是jdk9默认的收集器基于标记-整理算法实现。可利用多核、多cpu保留分代实现可预测停顿可控。 http://blog.csdn.net/linhu007/article/details/48897597
请解释如下 jvm 参数的含义
-server -Xms512m -Xmx512m -Xss1024K -XX:PermSize256m -XX:MaxPermSize512m -XX:MaxTenuringThreshold20 XX:CMSInitiatingOccupancyFraction80 -XX:UseCMSInitiatingOccupancyOnly。
Server模式启动
最小堆内存512m 最大512m 每个线程栈空间1m 永久代256 最大永久代256 最大转为老年代检查次数20 Cms回收开启时机内存占用80% 命令JVM不基于运行时收集的数据来启动CMS垃圾收集周期
开源框架知识
简单讲讲 tomcat 结构以及其类加载器流程。
Server- –多个service Container级别的–engine–》host–context Listenter Connector Logging、Naming、Session、JMX等等
通过WebappClassLoader 加载class
http://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/ http://blog.csdn.net/dc_726/article/details/11873343 http://www.cnblogs.com/xing901022/p/4574961.html http://www.jianshu.com/p/62ec977996df
tomcat 如何调优涉及哪些参数。
硬件上选择操作系统选择版本选择jdk选择配置jvm参数配置connector的线程数量开启gzip压缩trimSpaces集群等 http://blog.csdn.net/lifetragedy/article/details/7708724
https://blog.csdn.net/ThinkWon/article/details/102744033
讲讲 Spring 加载流程。
通过listener入口核心是在AbstractApplicationContext的refresh方法在此处进行装载bean工厂bean创建bean实例拦截器后置处理器等。 https://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/
讲讲 Spring 事务的传播属性。
七种传播属性。 事务传播行为 所谓事务的传播行为是指如果在开始当前事务之前一个事务上下文已经存在此时有若干选项可以指定一个事务性方法的执行行为。在TransactionDefinition定义中包括了如下几个表示传播行为的常量 TransactionDefinition.PROPAGATION_REQUIRED如果当前存在事务则加入该事务如果当前没有事务则创建一个新的事务。 TransactionDefinition.PROPAGATION_REQUIRES_NEW创建一个新的事务如果当前存在事务则把当前事务挂起。 TransactionDefinition.PROPAGATION_SUPPORTS如果当前存在事务则加入该事务如果当前没有事务则以非事务的方式继续运行。 TransactionDefinition.PROPAGATION_NOT_SUPPORTED以非事务方式运行如果当前存在事务则把当前事务挂起。 TransactionDefinition.PROPAGATION_NEVER以非事务方式运行如果当前存在事务则抛出异常。 TransactionDefinition.PROPAGATION_MANDATORY如果当前存在事务则加入该事务如果当前没有事务则抛出异常。 TransactionDefinition.PROPAGATION_NESTED如果当前存在事务则创建一个事务作为当前事务的嵌套事务来运行如果当前没有事务则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。 https://www.ibm.com/developerworks/cn/education/opensource/os-cn-spring-trans/
Spring 如何管理事务的。
编程式和声明式 同上
Spring 怎么配置事务具体说出一些关键的 xml 元素。
说说你对 Spring 的理解非单例注入的原理它的生命周期循环注入的原理 aop 的实现原理说说 aop 中的几个术语它们是怎么相互工作的。
单例注入是通过单例beanFactory进行创建生命周期是在创建的时候通过接口实现开启循环注入是通过后置处理器aop其实就是通过反射进行动态代理pointcutadvice等。 Aop相关https://blog.csdn.net/weixin_38399962/article/details/79882226
Spring 如何解决循环依赖的
三级缓存
https://blog.csdn.net/qq_36381855/article/details/79752689
BeanFactory和ApplicationContext有什么区别
BeanFactory 可以理解为含有bean集合的工厂类。BeanFactory 包含了种bean的定义以便在接收到客户端请求时将对应的bean实例化。
BeanFactory还能在实例化对象的时生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制调用客户端的初始化方法initialization methods和销毁方法destruction methods。
从表面上看application context如同bean factory一样具有bean定义、bean关联关系的设置根据请求分发bean的功能。但application context在此基础上还提供了其他的功能。
提供了支持国际化的文本消息 统一的资源文件读取方式 已在监听器中注册的bean的事件
你对Spring核心组件的理解
核心组件beancontextcore.
我的理解 :
我们知道 Bean 包装的是 Object而 Object 必然有数据如何给这些数据提供生存环境就是 Context 要解决的问题对 Context 来说他就是要发现每个 Bean 之间的关系为它们建立这种关系并且要维护好这种关系。所以 Context 就是一个 Bean 关系的集合这个关系集合又叫 Ioc 容器一旦建立起这个 Ioc 容器后 Spring 就可以为你工作了。那 Core 组件又有什么用武之地呢其实 Core 就是发现、建立和维护每个 Bean 之间的关系所需要的一些列的工具从这个角度看来Core 这个组件叫 Util 更能让你理解。
简述Bean的生命周期
Spring容器初始化- bean构造器- bean字段注入- 【init-method】调用的init-method属性指定的初始化方法
-容器初始化成功 -单例bean的使用-关闭容器-【destroy-method】调用的destroy-method属性指定的初始化方法
-bean死亡
详见 https://www.cnblogs.com/zrtqsk/p/3735273.html
AspectJ 的用法
https://blog.csdn.net/weixin_38399962/article/details/83894823
Springmvc 中 DispatcherServlet 初始化过程。
入口是web.xml中配置的dsds继承了HttpServletBeanFrameworkServlet通过其中的init方法进行初始化装载bean和实例initServletBean是实际完成上下文工作和bean初始化的方法。 http://www.mamicode.com/info-detail-512105.html
SpringBoot比Spring做了哪些改进?
• 独立运行 • 简化配置 • 自动配置 • 无代码生成和 XML 配置 • 应用监控 • 上手容易
简称四简一快
简化编码, 简化监控, 简化配置, 简化部署, 快速搭建
详情移步: 为什么说JAVA程序员必须掌握SpringBoot?
你如何理解 Spring Boot 中的 Starters, 其中加载原理
Starters 可以理解为启动器它包含了一系列可以集成到应用里面的依赖包你可以一站式集成 Spring 及其他技术而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。 Starters 包含了许多项目中需要用到的依赖它们能快速持续的运行都是一系列得到支持的管理传递性依赖。
https://mp.weixin.qq.com/s/9YDLIcF7J6pQ91o-lipL6w
SpringIOC是什么?DI是什么 优点是什么?
控制反转是应用于软件工程领域中的在运行时被装配器对象来绑定耦合对象的一种编程技巧对象之间耦合关系在编译时通常是未知的。在传统的编程方式中业务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。在使用控制反转的情况下业务逻辑的流程是由对象关系图来决定的该对象关系图由装配器负责实例化这种实现方式还可以将对象之间的关联关系的定义抽象化。而绑定的过程是通过“依赖注入”实现的。控制反转是一种以给予应用程序中目标组件更多控制为目的设计范式并在我们的实际工作中起到了有效的作用。依赖注入是在编译阶段尚未知所需的功能是来自哪个的类的情况下将其他对象所依赖的功能对象实例化的模式。这就需要一种机制用来激活相应的组件以提供特定的功能所以依赖注入是控制反转的基础。否则如果在组件不受框架控制的情况下框架又怎么知道要创建哪个组件
在Java中依然注入有以下三种实现方式
构造器注入 Setter方法注入 接口注入
操作系统 Linux 系统下你关注过哪些内核参数说说你知道的。 http://www.haiyun.me/category/system/
Linux 下 IO 模型有几种各自的含义是什么。
阻塞式io非阻塞ioio复用模型信号驱动io模型异步io模型。 https://yq.aliyun.com/articles/46404 https://yq.aliyun.com/articles/46402
epoll 和 poll 有什么区别。
select的本质是采用32个整数的32位即3232 1024来标识fd值为1-1024。当fd的值超过1024限制时就必须修改FD_SETSIZE的大小。这个时候就可以标识32max值范围的fd。 对于单进程多线程每个线程处理多个fd的情况select是不适合的。 1.所有的线程均是从1-32*max进行扫描每个线程处理的均是一段fd值这样做有点浪费 2.1024上限问题一个处理多个用户的进程fd值远远大于1024 所以这个时候应该采用poll poll传递的是数组头指针和该数组的长度只要数组的长度不是很长性能还是很不错的因为poll一次在内核中申请4K一个页的大小来存放fd尽量控制在4K以内 epoll还是poll的一种优化返回后不需要对所有的fd进行遍历在内核中维持了fd的列表。select和poll是将这个内核列表维持在用户态然后传递到内核中。但是只有在2.6的内核才支持。 epoll更适合于处理大量的fd 且活跃fd不是很多的情况毕竟fd较多还是一个串行的操作 https://yq.aliyun.com/articles/10525
平时用到哪些 Linux 命令。
Ls,find,tar,tail,cp,rm,vigrep,ps,pkill等等 https://yq.aliyun.com/articles/69417?spm5176.100240.searchblog.18.Zrbh9R
用一行命令查看文件的最后五行。
Tail -n 5 filename
用一行命令输出正在运行的 java 进程。
ps -ef|grep Java
介绍下你理解的操作系统中线程切换过程。
控制权的转换根据优先级切换上下文用户寄存器系统 http://www.cnblogs.com/kkshaq/p/4544426.html
进程和线程的区别。
Linux 实现并没有区分这两个概念进程和线程
进程程序的一次执行线程CPU的基本调度单位 一个进程可以包含多个线程。
http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
多线程
多线程的几种实现方式什么是线程安全。 实现runable接口继承thread类。 http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/
volatile 的原理作用能代替锁么。
Volatile利用内存栅栏机制来保持变量的一致性。不能代替锁其只具备数据可见性一致性不具备原子性。 http://blog.csdn.net/gongzi2311/article/details/20715185
画一个线程的生命周期状态图。
新建可运行运行中 睡眠阻塞等待死亡。
http://ifeve.com/thread-status
sleep 和 wait 的区别。
Sleep是休眠线程wait是等待sleep是thread的静态方法wait则是object的方法。
Sleep依旧持有锁并在指定时间自动唤醒。wait则释放锁。
http://www.jianshu.com/p/4ec3f4b3903d
Lock 与 Synchronized 的区别。
首先两者都保持了并发场景下的原子性和可见性区别则是synchronized的释放锁机制是交由其自身控制且互斥性在某些场景下不符合逻辑无法进行干预不可人为中断等。 而lock常用的则有ReentrantLock和readwritelock两者添加了类似锁投票、定时锁等候和可中断锁等候的一些特性。此外它还提供了在激烈争用情况下更佳的性能。 http://blog.csdn.net/vking_wang/article/details/9952063
synchronized 的原理是什么解释以下名词重排序自旋锁偏向锁轻量级锁可重入锁公平锁非公平锁乐观锁悲观锁。
Synchronized底层是通过监视器的enter和exit实现 https://my.oschina.net/cnarthurs/blog/847801 http://blog.csdn.net/a314773862/article/details/54095819
用过哪些原子类他们的原理是什么。
AtomicInteger AtomicLong AtomicReference AtomicBoolean基于CAS原语实现 比较并交换、加载链接/条件存储最坏的情况下是旋转锁 https://www.ibm.com/developerworks/cn/java/j-jtp11234/index.html http://www.jmatrix.org/java/848.html
用过线程池吗newCache 和 newFixed 有什么区别他们的原理简单概括下构造函数的各个参数的含义是什么比如 coreSizemaxsize 等。
newSingleThreadExecutor返回以个包含单线程的Executor,将多个任务交给此Exector时这个线程处理完一个任务后接着处理下一个任务若该线程出现异常将会有一个新的线程来替代。
newFixedThreadPool返回一个包含指定数目线程的线程池如果任务数量多于线程数目那么没有没有执行的任务必须等待直到有任务完成为止。
newCachedThreadPool根据用户的任务数创建相应的线程来处理该线程池不会对线程数目加以限制完全依赖于JVM能创建线程的数量可能引起内存不足。 底层是基于ThreadPoolExecutor实现借助reentrantlock保证并发。 coreSize核心线程数maxsize最大线程数。 http://ifeve.com/java-threadpoolexecutor/
线程池的关闭方式有几种各自的区别是什么。
Shutdown shutdownNow tryTerminate 清空工作队列终止线程池中各个线程销毁线程池 http://blog.csdn.net/xxcupid/article/details/51993235
假如有一个第三方接口有很多个线程去调用获取数据现在规定每秒钟最多有 10 个线程同时调用它如何做到。
ScheduledThreadPoolExecutor 设置定时进行调度。 public ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory) { super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS, new DelayedWorkQueue(), threadFactory); }
http://ifeve.com/java-scheduledthreadpoolexecutor/
spring 的 controller 是单例还是多例怎么保证并发的安全。
单例 通过单例工厂 DefaultSingletonBeanRegistry实现单例 通过保AsyncTaskExecutor持安全
面试问我创建多少个线程合适
其实多线程使用所需线程数和实际场景息息相关如果是 CPU 密集型例如1-1000 万累加计算则是 CUP核心数1如果是IO 密集型数据库访问远程调用则是最佳线程数 (1/CPU利用率) 1 (I/O耗时/CPU耗时)
https://www.jianshu.com/p/f30ee2346f9f
ThreadLocal 用过么用途是什么原理是什么用的时候要注意什么。
Threadlocal底层是通过threadlocalMap进行存储键值 每个ThreadLocal类创建一个Map然后用线程的ID作为Map的key实例对象作为Map的value这样就能达到各个线程的值隔离的效果。 ThreadLocal的作用是提供线程内的局部变量这种变量在线程的生命周期内起作用减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。
谁设置谁负责移除
http://qifuguang.me/2015/09/02/[Java%E5%B9%B6%E5%8F%91%E5%8C%85%E5%AD%A6%E4%B9%A0%E4%B8%83]%E8%A7%A3%E5%AF%86ThreadLocal/
如果让你实现一个并发安全的链表你会怎么做。
Collections.synchronizedList() ConcurrentLinkedQueue http://blog.csdn.net/xingjiarong/article/details/48046751
有哪些无锁数据结构他们实现的原理是什么。
LockFreeCAS 基于jdk提供的原子类原语实现例如AtomicReference http://blog.csdn.net/b_h_l/article/details/8704480
讲讲 java 同步机制的 wait 和 notify。
首先这两个方法只能在同步代码块中调用wait会释放掉对象锁等待notify唤醒。 http://blog.csdn.net/ithomer/article/details/7685594
多线程如果线程挂住了怎么办。
根据具体情况sleep,wait,join等酌情选择notifyAllnotify进行线程唤醒。 http://blog.chinaunix.net/uid-122937-id-215913.html
countdowlatch 和 cyclicbarrier 的内部原理和用法以及相互之间的差别。
CountDownLatch是一个同步辅助类在完成一组正在其他线程中执行的操作之前它运行一个或者多个线程一直处于等待状态。 CyclicBarrier要做的事情是让一组线程到达一个屏障也可以叫同步点时被阻塞直到最后一个线程到达屏障时屏障才会开门所有被屏障拦截的线程才会继续运行。 CyclicBarrier初始化的时候设置一个屏障数。线程调用await()方法的时候这个线程就会被阻塞当调用await()的线程数量到达屏障数的时候主线程就会取消所有被阻塞线程的状态。 前者是递减不可循环后者是递加可循环用 countdowlatch 基于abq cb基于ReentrantLock Condition http://www.jianshu.com/p/a101ae9797e3 http://blog.csdn.net/tolcf/article/details/50925145
使用 synchronized 修饰静态方法和非静态方法有什么区别。
对象锁和类锁 https://yq.aliyun.com/articles/24226
简述 ConcurrentLinkedQueue LinkedBlockingQueue 的用处和不同之处。
LinkedBlockingQueue 是一个基于单向链表的、范围任意的其实是有界的、FIFO 阻塞队列。 ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列它采用先进先出的规则对节点进行排序当我们添加一个元素的时候它会添加到队列的尾部当我们获取一个元素时它会返回队列头部的元素。它采用了“waitfree”算法来实现该算法在Michael Scott算法上进行了一些修改, Michael Scott算法的详细信息可以参见参考资料一。 http://ifeve.com/concurrentlinkedqueue/ http://ifeve.com/juc-linkedblockingqueue/ http://blog.csdn.net/xiaohulunb/article/details/38932923
导致线程死锁的原因怎么解除线程死锁。
死锁问题是多线程特有的问题它可以被认为是线程间切换消耗系统性能的一种极端情况。在死锁时线程间相互等待资源而又不释放自身的资源导致无穷无尽的等待其结果是系统任务永远无法执行完成。死锁问题是在多线程开发中应该坚决避免和杜绝的问题。 一般来说要出现死锁问题需要满足以下条件
互斥条件一个资源每次只能被一个线程使用。请求与保持条件一个进程因请求资源而阻塞时对已获得的资源保持不放。不剥夺条件进程已获得的资源在未使用完之前不能强行剥夺。循环等待条件若干进程之间形成一种头尾相接的循环等待资源关系。 只要破坏死锁 4 个必要条件之一中的任何一个死锁问题就能被解决。 https://www.ibm.com/developerworks/cn/java/j-lo-deadlock/
非常多个线程可能是不同机器相互之间需要等待协调才能完成某种工作问怎么设计这种协调方案。 此问题的本质是保持顺序执行。可以使用executors
TCP 与 HTTP
TCP与UDP的区别 TCP 是面向连接的UDP 是面向无连接的 UDP程序结构较简单 TCP 是面向字节流的UDP 是基于数据报的 TCP 保证数据正确性UDP 可能丢包 TCP 保证数据顺序UDP 不保证 TCP与HTTP协议的关系 关于TCP/IP和HTTP协议的关系网络有一段比较容易理解的介绍“我们在传输数据时可以只使用传输层TCP/IP协议但是那样的话如果没有应用层便无法识别数据内容如果想要使传输的数据有意义则必须使用到应用层协议应用层协议有很多比如HTTP、FTP、TELNET等也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议以封装HTTP 文本信息然后使用TCP/IP做传输层协议将它发到网络上。”
http1.0 和 http1.1 有什么区别。 HTTP 1.0主要有以下几点变化 请求和相应可以由于多行首部字段构成 响应对象前面添加了一个响应状态行 响应对象不局限于超文本 服务器与客户端之间的连接在每次请求之后都会关闭 实现了Expires等传输内容的缓存控制 内容编码Accept-Encoding、字符集Accept-Charset等协商内容的支持 这时候开始有了请求及返回首部的概念开始传输不限于文本其他二进制内容
HTTP 1.1加入了很多重要的性能优化持久连接、分块编码传输、字节范围请求、增强的缓存机制、传输编码及请求管道。 http://imweb.io/topic/554c5879718ba1240cc1dd8a
请画出三次握手和四次挥手的示意图 为什么连接的时候是三次握手 什么是半连接队列 ISN(Initial Sequence Number)是固定的吗 三次握手过程中可以携带数据吗 如果第三次握手丢失了客户端服务端会如何处理 SYN攻击是什么 挥手为什么需要四次 四次挥手释放连接时等待2MSL的意义?
https://blog.csdn.net/hyg0811/article/details/102366854
TIME_WAIT 和 CLOSE_WAIT 的区别。 TIME_WAIT状态就是用来重发可能丢失的ACK报文。 TIME_WAIT 表示主动关闭CLOSE_WAIT 表示被动关闭。
说说你知道的几种 HTTP 响应码比如 200, 302, 404。 1xx信息请求收到继续处理 2xx成功行为被成功地接受、理解和采纳 3xx重定向为了完成请求必须进一步执行的动作 4xx客户端错误请求包含语法错误或者请求无法实现 5xx服务器错误服务器不能实现一种明显无效的请求 200 ok 一切正常 302 Moved Temporatily 文件临时移出 404 not found https://my.oschina.net/gavinjin/blog/42856
当你用浏览器打开一个链接的时候计算机做了哪些工作步骤。 Dns解析–端口分析–tcp请求–服务器处理请求–服务器响应–浏览器解析—链接关闭
TCP/IP 如何保证可靠性说说 TCP 头的结构。 使用序号对收到的TCP报文段进行排序以及检测重复的数据使用校验和来检测报文段的错误使用确认和计时器来检测和纠正丢包或延时。//TCP头部总长度20字节 typedef struct _tcp_hdr { unsigned short src_port; //源端口号 unsigned short dst_port; //目的端口号 unsigned int seq_no; //序列号 unsigned int ack_no; //确认号 #if LITTLE_ENDIAN unsigned char reserved_1:4; //保留6位中的4位首部长度 unsigned char thl:4; //tcp头部长度 unsigned char flag:6; //6位标志 unsigned char reseverd_2:2; //保留6位中的2位 #else unsigned char thl:4; //tcp头部长度 unsigned char reserved_1:4; //保留6位中的4位首部长度 unsigned char reseverd_2:2; //保留6位中的2位 unsigned char flag:6; //6位标志 #endif unsigned short wnd_size; //16位窗口大小 unsigned short chk_sum; //16位TCP检验和 unsigned short urgt_p; //16为紧急指针 }tcp_hdr;
https://zh.bywiki.com/zh-hans/%E4%BC%A0%E8%BE%93%E6%8E%A7%E5%88%B6%E5%8D%8F%E8%AE%AE
如何避免浏览器缓存。 无法被浏览器缓存的请求 HTTP信息头中包含Cache-Control:no-cachepragma:no-cache或Cache-Control:max-age0等告诉浏览器不用缓存的请求 需要根据Cookie认证信息等决定输入内容的动态请求是不能被缓存的 经过HTTPS安全加密的请求有人也经过测试发现ie其实在头部加入Cache-Controlmax-age信息firefox在头部加入Cache-Control:Public之后能够对HTTPS的资源进行缓存参考《HTTPS的七个误解》 POST请求无法被缓存 HTTP响应头中不包含Last-Modified/Etag也不包含Cache-Control/Expires的请求无法被缓存 http://www.alloyteam.com/2012/03/web-cache-2-browser-cache/
简述 Http 请求 get 和 post 的区别以及数据包格式。
http://www.w3school.com.cn/tags/html_ref_httpmethods.asp http://www.360doc.com/content/12/0612/14/8093902_217673378.shtml
简述 HTTP 请求的报文格式。 参考上面
HTTPS 的加密方式是什么讲讲整个加密解密流程。 加密方式是tls/ssl底层是通过对称算法非对称hash算法实现 客户端发起HTTPS请求 –》2. 服务端的配置 –》 3. 传送证书 —》4. 客户端解析证书 5. 传送加密信息 6. 服务段解密信息 7. 传输加密后的信息 8. 客户端解密信息 http://www.cnblogs.com/zhuqil/archive/2012/07/23/2604572.html ———————————————— 版权声明本文为CSDN博主「晴天小哥哥」的原创文章遵循CC 4.0 BY-SA版权协议转载请附上原文出处链接及本声明。 原文链接https://blog.csdn.net/weixin_38399962/article/details/80358168
转载于CSDN博主[晴天小各个] 原文链接https://blog.csdn.net/weixin_38399962/article/details/80358168