JAVA基础 (文末有彩蛋) JAVA中的几种基本类型,各占用多少字节?html
这48个Java技术点,让你的面试成功率提高5倍! 下图单位是bit,非字节 1B=8bitjava
这48个Java技术点,让你的面试成功率提高5倍! String能被继承吗?为何?react
不能够,由于String类有final修饰符,而final修饰的类是不能被继承的,实现细节不容许改变。日常咱们定义的String str=”a”;其实和String str=new String(“a”)仍是有差别的。git
前者默认调用的是String.valueOf来返回String实例对象,至于调用哪一个则取决于你的赋值,好比String num=1,调用的是web
public static String valueOf(int i) {面试
return Integer.toString(i);算法
}spring
后者则是调用以下部分:编程
public String(String original) {bootstrap
this.value = original.value;
this.hash = original.hash;
}
最后咱们的变量都存储在一个char数组中
private final char value[];
也为你们推荐了技术教程:
Java8零基础入门https://edu.csdn.net/course/detail/3044?utm_source=juejinxk
Drools7规则引擎入门教程https://edu.csdn.net/course/detail/5523?utm_source=juejinxk
Spring Boot开发小而美的我的博客https://edu.csdn.net/course/detail/6359?utm_source=juejinxk
探究Linux的总线、设备、驱动模型https://edu.csdn.net/course/detail/5329?utm_source=juejinxk
软件测试入门到精通https://edu.csdn.net/course/detail/8729?utm_source=juejinxk
Spring Boot 入门https://edu.csdn.net/course/detail/9068?utm_source=juejinxk
Java多线程+网银取款案例精讲https://edu.csdn.net/course/detail/8973?utm_source=juejinxk
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);
}
ArrayList 和 LinkedList 有什么区别。
ArrayList和LinkedList都实现了List接口,有如下的不一样点:
一、ArrayList是基于索引的数据接口,它的底层是数组。它能够以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每个元素都和它的前一个和后一个元素连接在一块儿,在这种状况下,查找某个元素的时间复杂度是O(n)。
二、相对于ArrayList,LinkedList的插入,添加,删除操做速度更快,由于当元素被添加到集合任意位置的时候,不须要像数组那样从新计算大小或者是更新索引。
三、LinkedList比ArrayList更占内存,由于LinkedList为每个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
讲讲类的实例化顺序,好比父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候, 他们的执行顺序。
此题考察的是类加载器实例化时进行的操做步骤(加载–>链接->初始化)。
父类静态代变量、
父类静态代码块、
子类静态变量、
子类静态代码块、
父类非静态变量(父类实例成员变量)、
父类构造函数、
子类非静态变量(子类实例成员变量)、
子类构造函数。
测试demo:blog.csdn.net/u014042066/…
参阅个人博客《深刻理解类加载》:blog.csdn.net/u014042066/…
用过哪些 Map 类,都有什么区别,HashMap 是线程安全的吗,并发下使用的 Map 是什么,他们内部原理分别是什么,好比存储方式, hashcode,扩容, 默认容量等。
hashMap是线程不安全的,HashMap是数组+链表+红黑树(JDK1.8增长了红黑树部分)实现的,采用哈希表来存储的,
参照该连接:zhuanlan.zhihu.com/p/21673805
JAVA8 的 ConcurrentHashMap 为何放弃了分段锁,有什么问题吗,若是你来设计,你如何设计。
有没有有顺序的 Map 实现类, 若是有, 他们是怎么保证有序的。
TreeMap和LinkedHashMap是有序的(TreeMap默认升序,LinkedHashMap则记录了插入顺序)。
参照:uule.iteye.com/blog/152229…
抽象类和接口的区别,类能够继承多个类么,接口能够继承多个接口么,类能够实现多个接口么。
一、抽象类和接口都不能直接实例化,若是要实例化,抽象类变量必须指向实现全部抽象方法的子类对象,接口变量必须指向实现全部接口方法的类对象。
二、抽象类要被子类继承,接口要被类实现。
三、接口只能作方法申明,抽象类中能够作方法申明,也能够作方法实现
四、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
五、抽象类里的抽象方法必须所有被子类所实现,若是子类不能所有实现父类抽象方法,那么该子类只能是抽象类。一样,一个实现接口的时候,如不能所有实现接口方法,那么该类也只能为抽象类。
六、抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。
七、抽象类里能够没有抽象方法
八、若是一个类里有抽象方法,那么这个类只能是抽象类
九、抽象方法要被实现,因此不能是静态的,也不能是私有的。
十、接口可继承接口,并可多继承接口,但类只能单根继承。
继承和聚合的区别在哪。
继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并能够增长它本身的新功能的能力,继承是类与类或者接口与接口之间最多见的关系;在Java中此类关系经过关键字extends明确标识,在设计时通常没有争议性;
这48个Java技术点,让你的面试成功率提高5倍! 聚合是关联关系的一种特例,他体现的是总体与部分、拥有的关系,即has-a的关系,此时总体与部分之间是可分离的,他们能够具备各自的生命周期,部分能够属于多个总体对象,也能够为多个总体对象共享;好比计算机与CPU、公司与员工的关系等;表如今代码层面,和关联关系是一致的,只能从语义级别来区分;
这48个Java技术点,让你的面试成功率提高5倍! 参考:www.cnblogs.com/jiqing9006/…
讲讲你理解的 nio和 bio 的区别是啥,谈谈 reactor 模型。
IO是面向流的,NIO是面向缓冲区的
参考:zhuanlan.zhihu.com/p/23488863
developer.51cto.com/art/201103/…
反射的原理,反射建立类实例的三种方式是什么
参照:www.jianshu.com/p/3ea4a6b57…
反射中,Class.forName 和 ClassLoader 区别。
描述动态代理的几种实现方式,分别说出相应的优缺点。
Jdk cglib jdk底层是利用反射机制,须要基于接口方式,这是因为
Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
Cglib则是基于asm框架,实现了无反射机制进行代理,利用空间来换取了时间,代理效率高于jdk
动态代理与 cglib 实现的区别
同上(基于invocationHandler和methodInterceptor)
为何 CGlib 方式能够对接口实现代理。
同上
final 的用途
类、变量、方法
写出三种单例模式实现。
懒汉式单例,饿汉式单例,双重检查等
参考:my.oschina.net/dyyweb/blog…
如何在父类中为子类自动完成全部的 hashcode 和 equals 实现?这么作有何优劣。
同时复写hashcode和equals方法,优点能够添加自定义逻辑,且没必要调用超类的实现。
参照:java-min.iteye.com/blog/141672…
请结合 OO 设计理念,谈谈访问修饰符 public、private、protected、default 在应用设计中的做用。
访问修饰符,主要标示修饰块的做用域,方便隔离防御
同一个类 同一个包 不一样包的子类 不一样包的非子类
1 2 Private √
Default √ √
Protected √ √ √
Public √ √ √ √
public: Java语言中访问限制最宽的修饰符,通常称之为“公共的”。被其修饰的类、属性以及方法不
仅能够跨类访问,并且容许跨包(package)访问。
private: Java语言中对访问权限限制的最窄的修饰符,通常称之为“私有的”。被其修饰的类、属性以
及方法只能被该类的对象访问,其子类不能访问,更不能容许跨包访问。
protect: 介于public 和 private 之间的一种访问修饰符,通常称之为“保护形”。被其修饰的类、
属性以及方法只能被类自己的方法及子类访问,即便子类在不一样的包中也能够访问。
default:即不加任何访问修饰符,一般称为“默认访问模式“。该模式下,只容许在同一个包中进行访
问。
深拷贝和浅拷贝区别。
数组和链表数据结构描述,各自的时间复杂度
error 和 exception 的区别,CheckedException,RuntimeException 的区别
请列出 5 个运行时异常。
同上
在本身的代码中,若是建立一个 java.lang.String 对象,这个对象是否能够被类加载器加载?为何
类加载无须等到“首次使用该类”时加载,jvm容许预加载某些类。。。。
说一说你对 java.lang.Object 对象中 hashCode 和 equals 方法的理解。在什么场景下须要从新实现这两个方法。
参考上边试题
在 jdk1.5 中,引入了泛型,泛型的存在是用来解决什么问题。
泛型的本质是参数化类型,也就是说所操做的数据类型被指定为一个参数,泛型的好处是在编译的时候检查类型安全,而且全部的强制转换都是自动和隐式的,以提升代码的重用率
这样的 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相等。
有没有可能 2 个不相等的对象有相同的 hashcode。
有
Java 中的 HashSet 内部是如何工做的。
底层是基于hashmap实现的
wiki.jikexueyuan.com/project/jav…
什么是序列化,怎么序列化,为何序列化,反序列化会遇到什么问题,如何解决。
JVM 知识 什么状况下会发生栈内存溢出。
若是线程请求的栈深度大于虚拟机所容许的深度,将抛出StackOverflowError异常。 若是虚拟机在动态扩展栈时没法申请到足够的内存空间,则抛出OutOfMemoryError异常。
参照:wiki.jikexueyuan.com/project/jav…
JVM 的内存结构,Eden 和 Survivor 比例。
这48个Java技术点,让你的面试成功率提高5倍! eden 和 survior 是按8比1分配的
jvm 中一次完整的 GC 流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的jvm 参数。
对象诞生即新生代->eden,在进行minor gc过程当中,若是依旧存活,移动到from,变成Survivor,进行标记代数,如此检查必定次数后,晋升为老年代,
wangkang007.gitbooks.io/jvm/content…
你知道哪几种垃圾收集器,各自的优缺点,重点讲下 cms,包括原理,流程,优缺点
Serial、parNew、ParallelScavenge、SerialOld、ParallelOld、CMS、G1
wangkang007.gitbooks.io/jvm/content…
垃圾回收算法的实现原理。
当出现了内存溢出,你怎么排错。
首先分析是什么类型的内存溢出,对应的调整参数或者优化代码。
wangkang007.gitbooks.io/jvm/content…
JVM 内存模型的相关知识了解多少,好比重排序,内存屏障,happen-before,主内存,工做内存等。
内存屏障:为了保障执行顺序和可见性的一条cpu指令
重排序:为了提升性能,编译器和处理器会对执行进行重拍
happen-before:操做间执行的顺序关系。有些操做先发生。
主内存:共享变量存储的区域便是主内存
工做内存:每一个线程copy的本地内存,存储了该线程以读/写共享变量的副本
简单说说你了解的类加载器。
类加载器的分类(bootstrap,ext,app,curstom),类加载的流程(load-link-init)
讲讲 JAVA 的反射机制。
Java程序在运行状态能够动态的获取类的全部属性和方法,并实例化该类,调用方法的功能
大家线上应用的 JVM 参数有哪些。
-server
Xms6000M
-Xmx6000M
-Xmn500M
-XX:PermSize=500M
-XX:MaxPermSize=500M
-XX:SurvivorRatio=65536
-XX:MaxTenuringThreshold=0
-Xnoclassgc
-XX:+DisableExplicitGC
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=0
-XX:+CMSClassUnloadingEnabled
-XX:-CMSParallelRemarkEnabled
-XX:CMSInitiatingOccupancyFraction=90
-XX:SoftRefLRUPolicyMSPerMB=0
-XX:+PrintClassHistogram
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-Xloggc:log/gc.log
g1 和 cms 区别,吞吐量优先和响应优先的垃圾收集器选择。
Cms是以获取最短回收停顿时间为目标的收集器。基于标记-清除算法实现。比较占用cpu资源,切易形成碎片。
G1是面向服务端的垃圾收集器,是jdk9默认的收集器,基于标记-整理算法实现。可利用多核、多cpu,保留分代,实现可预测停顿,可控。
请解释以下 jvm 参数的含义:
-server -Xms512m -Xmx512m -Xss1024K
-XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=20
XX:CMSInitiatingOccupancyFraction=80 -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等等
这48个Java技术点,让你的面试成功率提高5倍! 经过WebappClassLoader 加载class
tomcat 如何调优,涉及哪些参数。
硬件上选择,操做系统选择,版本选择,jdk选择,配置jvm参数,配置connector的线程数量,开启gzip压缩,trimSpaces,集群等
讲讲 Spring 加载流程。
经过listener入口,核心是在AbstractApplicationContext的refresh方法,在此处进行装载bean工厂,bean,建立bean实例,拦截器,后置处理器等。
讲讲 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。
Spring 如何管理事务的。
编程式和声明式
同上
Spring 怎么配置事务(具体说出一些关键的 xml 元素)。
说说你对 Spring 的理解,非单例注入的原理?它的生命周期?循环注入的原理, aop 的实现原理,说说 aop 中的几个术语,它们是怎么相互工做的。
核心组件:bean,context,core,单例注入是经过单例beanFactory进行建立,生命周期是在建立的时候经过接口实现开启,循环注入是经过后置处理器,aop其实就是经过反射进行动态代理,pointcut,advice等。
Aop相关:blog.csdn.net/csh62436618…
Springmvc 中 DispatcherServlet 初始化过程。
入口是web.xml中配置的ds,ds继承了HttpServletBean,FrameworkServlet,经过其中的init方法进行初始化装载bean和实例,initServletBean是实际完成上下文工做和bean初始化的方法。
彩蛋:须要相关课程资源推荐能够留言~