1.hashmap、concurrenthashmap底层实现和区别
hashmap是基于数组+链表结构的,数组下标有hash生成,链表主要是为了防止hash冲突,即使两个对象的hashCode一样,它们会放到当前数组索引位置的链表中,Java8后链表长度大于8就会转为红黑树,
主要是为了提高查找效率,链表查找慢,增删改快
区别:hashmap是线程不安全的,ConcurrentHashMap是线程安全的,把数据分成了不同的段,使用的分段锁技术,通过hash计算那些数据放在那个段中,查找也是如此
2.spring框架的原理
spring框架主要是用来创建、注册、配置、管理、维护bean的容器,主要是利用Java反射技术动态维护、调用对象,主要包括控制反转(IOC)以及面向切面(AOP),三种注入方式分别是Field注入
(使用@Autowired或@Resource注入)、构造器注入和Setter方法注入
3.如何写一个orm框架
对象-关系映射(Object-Relational Mapping,简称ORM),处理对象与数据库交互的,常见的有hibernate、jpa、ibatis等
4.hibernate一级缓存和二级缓存,hibernate其他缓存
hibernate缓存分为三种:一级缓存,二级缓存和查询缓存,
session内的缓存即一级缓存,不能被清除,缓存起来的对象叫做持久化对象,如果在同一个session中去获取这个对象,先查缓存,没有则去查数据库。
evict(Object o)和clear()管理缓存。
二级缓存的生命周期和SessionFactory的生命周期一致,可以被其他缓存共享。
5.hibernate事务传播行为种类
事物的四个特性:原子性(所有操作全部发生或全部不发生)、一致性(事务执行前和执行后必须处于一致性状态)、隔离性(多个事务相互隔离)、持久性(事务一旦提交,数据就会发生永久性的改变)
6.springmvc原理
用户发起请求到前端控制器,然后根据配置找到处理器映射器,然后根据适配器找到对应的controller,controller处理完毕后返回对应的model&view到前端控制器,前端控制器拿着model&view
到视图解释器进行渲染生成最终的页面返回给用户
7.restful的好处
基于rest API开发的开发规范,尤其是当前后端分离时能够节约时间
8.restful有几种请求,表单如何提交put请求
form提交需要在URL中加入提交方式:X-Method-Override=PUT,ajax提交需要在header中加入提交方式:X-Method-Override=PUT
9.web中安全性问题的考虑,如何防止
主要包括SQL注入、XSS、越权访问、文件上传漏洞
10.web系统整体架构
一、ssh:Struts2+spring+hibernate,Struts2用于分发控制,spring用于管理bean,hibernate用于orm,负责于数据库交互,业务缓存使用memcache,tomcat集群session共享使用redis
二、springboot+vue:springboot用作后台业务,spring gateway用作网关,spring eurake 用作服务注册发现,业务缓存redis
11.hibernate如何实现声明式事务
添加事务管理类的bean、配置事务的通知、添加事务的切入点
12.java并发包
https://blog.csdn.net/qq_38357267/article/details/80972942
13.volatile
Java 内存模型中的可见性、原子性(原子是世界上的最小单位,具有不可分割性,原子类:AtomicInteger、AtomicLong、AtomicReference)和有序性。volatile只能让被他修饰内容具有可见性,但不能保证它具有原子性.volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值.而声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过 CPU cache 这一步.
当一个变量定义为 volatile 之后,将具备两种特性:1.保证此变量对所有的线程的可见性.2.禁止指令重排序优化(多线程下jvm会按照最优规则对代码指令的执行顺序进行重新排序,让CPU的利用率达到最大)。
16.如何进行反射,如何提高反射的性能
ReflectASM就是把类的各个方法缓存起来,然后通过case选择,直接调用,因此速度会快上很多。但是它的get方法同样会消耗很大的时间,因此就算是使用ReflectASM的朋友也记得请在启动的时候
就初始化get方法计入缓存
MethodAccess access = MethodAccess.get(UserService.class);
access.invoke(target, "update", 1, "zhangsan");
17.如何实现java的代理,为什么需要实现接口
1.在需要继承proxy类获得有关方法和InvocationHandler构造方法传参的同时,java不能同时继承两个类,我们需要和想要代理的类建立联系,只能实现一个接口
2.需要反射获得代理类的有关参数,必须要通过某个类,反射获取有关方法
3.成功返回的是object类型,要获取原类,只能继承/实现,或者就是那个代理类
4.对具体实现的方法内部并不关心,这个交给InvocationHandler.invoke那个方法里去处理就好了,我只想根据你给我的接口反射出对我有用的东西。
5.考虑到设计模式,以及proxy编者编写代码的逻辑使然
---------------------
作者:XyGoodCode
来源:CSDN
原文:https://blog.csdn.net/zxysshgood/article/details/78684229
版权声明:本文为博主原创文章,转载请附上博文链接!
1、生成的代理类继承了Proxy,由于java是单继承,所以只能实现接口,通过接口实现 (一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的)
2、从代理模式的设计来说,充分利用了java的多态特性,也符合基于接口编码的规范
18.TCP协议三次握手
第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手
19.springmvc用过哪些注解
@Component 在类定义之前添加@Component注解,他会被spring容器识别,并转为bean。 @Repository 对Dao实现类进行注解 (特殊的@Component) @Service 用于对业务逻辑层进行注解, (特殊的@Component) @Controller 用于控制层注解 , (特殊的@Component)
@RequestMapping 用于处理请求地址映射,可以作用于类和方法上。
@RequestParam:用于获取传入参数的值
@PathViriable:用于定义路径参数值
@ResponseBody:作用于方法上,可以将整个返回结果以某种格式返回,如json或xml格式。
@CookieValue:用于获取请求的Cookie值
@ModelAttribute:用于把参数保存到model中
@SessionAttributes 模型中的数据存储一份到session域中
20.springAOP可以使用哪些代理,有什么区别
1.JDK动态代理(原理是使用反射机制)
2.cglib代理(reflactASM)
原理区别:
java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
21.为什么要分三层
低耦合、高内聚(减少模块之间的相互影响)
1、String、StringBuilder和StringBuffer的区别
string不可变
StringBuilder 线程不安全、效率高
StringBuffer 线程安全、效率低
2、gc的概念,如果A和B对象循环引用,是否可以被GC?
不会,无论是分代还是标记清除,都不会标记处于活跃状态的对象,知道虚拟机内存满,gc清无可清的时候,就Error了
https://blog.csdn.net/kkgbn/article/details/44787149
3、Java中的内存溢出是如何造成的
- 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
- 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
- 代码中存在死循环或循环产生过多重复的对象实体;
- 使用的第三方软件中的BUG;
- 启动参数内存值设定的过小;
http://outofmemory.cn/c/java-outOfMemoryError
4、String s = “123”;这个语句有几个对象产生
String s = “123”;1个,常量池
String str=new String("123"); 2个 常量池、堆
5、Error、Exception和RuntimeException的区别,作用又是什么?
Error、Exception是Throwable的子类,RuntimeException是Exception的子类,是在程序运行中产生的,是可以通过代码避免的,比如空指针异常、数组越界等。
6、列举3个以上的RuntimeException
NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常。
IllegalArgumentException - 传递非法参数异常。
ArithmeticException - 算术运算异常
ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
IndexOutOfBoundsException - 下标越界异常
NegativeArraySizeException - 创建一个大小为负数的数组错误异常
NumberFormatException - 数字格式异常
SecurityException - 安全异常
UnsupportedOperationException - 不支持的操作异常
---------------------
作者:魅影猎鹰
来源:CSDN
原文:https://blog.csdn.net/qq_32595075/article/details/80059834
版权声明:本文为博主原创文章,转载请附上博文链接!
7、reader和inputstream区别
InputStream,OutputStream 前者为字节输入流,后者为字节输出流。
Reader Writer 前者为字符输入流,后者为字符输出流。
8、hashCode的作用
改写equals时总是要改写hashCode
两个相等对象的equals方法一定为true, 但两个hashcode相等的对象不一定是相等的对象。
9、Object类中有哪些方法,列举3个以上(可以引导)
getClass()、hashCode()、equals()、clone()、toString()、notify()、notifyAll()、wait()、finalize()
10、char型变量中能不能存贮一个中文汉字?为什么?
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。
11、列举几个Java Collection类库中的常用类
集合类主要指用于描述集合的相关类和接口,顶层集合分别是:Collection接口和Map接口
其中java.util.Collection集合操作元素的基本单位是:单个元素;(一个元素一个元素的放)
其中java.util.Map集合操作元素的基本单位是:单对元素;(一对一对的元素放)
在以后的开发中Collection接口本身很少使用,更多的使用该接口的子接口:List接口、Queue接口以及Set接口。
---------------------
作者:CarolLXW
来源:CSDN
原文:https://blog.csdn.net/carolcoral/article/details/78722074
版权声明:本文为博主原创文章,转载请附上博文链接!
12、List、Set、Map是否都继承自Collection接口?
List、Set继承自Collection接口
13、HashMap和Hashtable的区别
HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。
HashMap线程不安全,速度快
Hashtable线程安全,速度慢
14、HashMap中是否任何对象都可以做为key,用户自定义对象做为key有没有什么要求?
用户自定义对象要重载hashcode() 与equals()方法
15、interface 和 abstrat class的区别 是否可以继承多个接口,是否可以继承多个抽象类
单继承、但可以实现多个接口
16、 启动一个线程是用run()还是start()? 多线程有几种实现 同步和并发是如何解决的 什么叫守护线程,用什么方法实现守护线程(Thread.setDeamon()的含义) 如何停止一个线程? 解释是一下什么是线程安全?举例说明一个线程不安全的例子。解释Synchronized关键字的作用。 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
start(),继承Thread或者实现runnable接口,
(1) thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
(2) 在Daemon线程中产生的新线程也是Daemon的。
(3) 不要认为所有的应用都可以分配给Daemon来进行服务,比如读写操作或者计算逻辑。
API说明如下:
void setDaemon(boolean on) 标志着该线程是 守护线程或用户线程。
1
---------------------
作者:ckinghan58
来源:CSDN
原文:https://blog.csdn.net/ckinghan58/article/details/72473333
版权声明:本文为博主原创文章,转载请附上博文链接!
17、了解过哪些JDK8的新特性,举例描述下相应的特性?
一、Lambda表达式
二、流
三、方法引用
四、默认方法
六、日期/时间改进
https://www.cnblogs.com/pkufork/p/java_8.html
18、对sql进行优化的原则有哪些?
https://www.cnblogs.com/exe19/p/5786806.html
https://www.cnblogs.com/lddbupt/p/5781831.html
19、servlet生命周期是生命与cgi的区别?
Servlet的生命周期主要由3个过程组成。
(1)init()方法:服务器初始化servlet。
(2)service()方法:初始化完毕,servlet对象调用该方法响应客户的请求。
(3)destroy()方法:调用该方法消灭servlet对象。
其中,init()方法只在servlet第一次被请求加载的时候被调用一次,当有客户再请求servlet服务时,web服务器将启动一个新的线程,在该线程中,调用service方法响应客户的请求。
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。
---------------------
作者:yanghaitao_1990
来源:CSDN
原文:https://blog.csdn.net/yanghaitao_1990/article/details/51723512
版权声明:本文为博主原创文章,转载请附上博文链接!
(转)Java三年经验 - 面试总结:https://www.cnblogs.com/zhiqsyr/p/4167284.html
private、默认、protected、public作用范围
1)private,同类 2)默认,同类、同包,不写时默认为friendly
3)protected,同类,同包,子类
4)public,所有
String trim的实现原理
先从char数组左边开发便利,遇到ascii小于等于空格的便记下下标位置,然后从右边开始遍历,遇到ascii小于等于空格的同样也记下下标位置,最后截取这两个下标之间的内容,源码如下:
public String trim() {
int len = value.length;
int st = 0;
char[] val = value; /* avoid getfield opcode */
while ((st < len) && (val[st] <= ' ')) {
st++;
}
while ((st < len) && (val[len - 1] <= ' ')) {
len--;
}
return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
}
抽象类与接口的异同
同:具有抽象方法 异:1)抽象类可以有构造器,非抽象方法,非公有属性,仅可以单继承抽象类 2)接口仅有公有抽象方法或者公有静态常量,可以同时实现多个接口 个人使用经验:一般在控制层使用抽象类,提取公共初始化方法、框架定制化工具方法等 一般会在业务层使用接口
数据库性能调优
1)经常做查询条件的字段建立序列
2)关联查询时,关联结果集,替代直接关联整张表;或者使用exists
Struts的Action是单例吗
1)Struts1的Action是单例且线程安全
2)Struts2的Action不是单例,针对每一请求产生一个实例
Hibernate与Mybatis区别
1)Hibernate,使用pojo实现orm,查询速度相比较慢,插入/更新开发容易
2)Mybaits,使用纯sql开发,执行效率较快,比较适合统计、多表关联查询
Hibernate状态
瞬时态:new对象
持久态:实例与数据库中记录对应,拥有持久化标识
游离态:session关闭;session打开,游离态转成持久态
ibatis中#与$的区别
1)#,变量替换,即prepareStament设置字段值,并可以匹配变量类型 2)$,字符串拼接,需要小心依赖注入
https://www.cnblogs.com/tyhJava/p/5842594.html
事务特性
1)原子性:诸多操作要么全做,要么全不做 2)一致性:事务执行结果使数据库从一个一致性状态变到另一个一致性状态 3)隔离性:事务执行不被其他事务影响 4)持久性:一旦提交,对数据库的改变是永久性的
(转)Java开发面试题,3年工作经验的Java程序员面试经:https://www.cnblogs.com/yuxiang1/p/9253876.html
Collection和Collections区别
java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。
Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。
short s1; s1=s1+1;是否有错?
1.高位转低位需要强制转换
2.低位转高位自动转.
Overriding和Overloading区别
重写(Overriding)是父类与子类之间多态性的一种表现,而重载(Overloading)是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding) 。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了.
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型或有不同的参数次序,则称为方法的重载(Overloading)。不能通过访问权限、返回类型、抛出的异常进行重载.
Set里面的元素不能重复,用什么方法区分重复与否
Set 里的元素是不能重复的,元素重复与否是使用 equals()方法进行判断的。 equals()和==方法决定引用值是否指向同一对象 equals()在类中被覆盖,为的是当两个 分离的对象的内容和类型相配的话,返回真值。
error和exception区别。
Exception:
1.可以是可被控制(checked) 或不可控制的(unchecked)。
2.表示一个由程序员导致的错误。
3.应该在应用程序级被处理。
Error:
1.总是不可控制的(unchecked)。
2.经常用来用于表示系统错误或低层资源的错误。
3.如何可能的话,应该在系统级被捕捉。
abstract class和interface 的区别。
两种的语法区别 1. 抽象类可以有构造方法,接口不能有构造方法 2. 抽象类中可以有普通成员变量,接口中没有普通成员变量 3. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须是抽象的,不能有非抽象的普通方法 4. 抽象类中抽象方法的访问类型可以是public,protected和默认类型虽然(eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型,并且默认即为public abstract类型 5. 抽象类中可以包含静态方法,接口中不能包含静态方法 6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型 7. 一个类可以实现多个接口,但只能继承一个抽象类 --------------------- 作者:Sally-he 来源:CSDN 原文:https://blog.csdn.net/qq_31059475/article/details/70651750 版权声明:本文为博主原创文章,转载请附上博文链接!
Java中,是否可以继承String类?为什么?
不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。
try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会不会被执行,什么时候被执行,在 return 前还是后?
会在return中间执行! try 中的 return 语句调用的函数先于 finally 中调用的函数执行,也就是说 return 语句先执行,finally 语句后执行,但 return 并不是让函数马上返回,而是 return 语句执行后,
将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行 finally 语句后才真正开始返回!但此时会出现两种情况: ①、如果finally中也有return,则会直接返回并终止程序,函数栈中的return不会被完成!; ②、如果finally中没有return,则在执行完finally中的代码之后,会将函数栈中的try中的return的内容返回并终止程序; catch同try;
用最有效的方式算出2*8等于几
2*8=2 << 3; 因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 << 3。 package java基础题目; /* * 用最有效的方式算出2*8等于几 */ public class Test9 { public static void main(String[] args) { int a = 2 << 3; System.out.println("2左移3位是:" + a); } } --------------------- 作者:_自由意志 来源:CSDN 原文:https://blog.csdn.net/johnWcheung/article/details/52937680 版权声明:本文为博主原创文章,转载请附上博文链接!
两个对象值相同(x.equals(y) == true),Hashcode是否一定相同?
两个对象值相同(x.equals(y) == true),Hashcode是否一定相同,这个要分两种情况回答? 第一种情况回答: 答:假如这个类没有重写equals方法,如果两个对象值相同(x.equals(y) == true),那么那么它们的hashCode值一定要相同; 第二种情况回答: 答:但是如果重写equals方法,没有重写hashCode的方法,就会出现不相等的情况。 Java对于eqauls方法和hashCode方法是这样规定的: 1.如果两个对象相同,那么它们的hashCode值一定要相同; 2.如果两个对象的hashCode相同,它们并不一定相同(这里说的对象相同指的是用eqauls方法比较)。 如不按要求去做了,会发现相同的对象可以出现在Set集合中,同时,增加新元素的效率会大大下降。 3.equals()相等的两个对象,hashcode()一定相等;equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。 换句话说,equals()方法不相等的两个对象,hashcode()有可能相等(我的理解是由于哈希码在生成的时候产生冲突造成的)。反过来,hashcode()不等,一定能推出equals()也不等;
hashcode()相等,equals()可能相等,也可能不等。 --------------------- 作者:改变123456 来源:CSDN 原文:https://blog.csdn.net/zouliping123456/article/details/82692127 版权声明:本文为博主原创文章,转载请附上博文链接!
switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
在switch(expr1)中,expr1只能是一个整数表达式【byte,short,char,int】或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char
都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,
所以,它们不能作用于swtich语句中【JDK1.7以前的版本】。 --------------------- 作者:ISPEAKFORMYSELF 来源:CSDN 原文:https://blog.csdn.net/ISPEAKFORMYSELF/article/details/51931318 版权声明:本文为博主原创文章,转载请附上博文链接!
ArrayList和Vector的区别,HashMap和Hashtable的区别
就ArrayList与Vector主要从二方面来说. 一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的 二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半 就HashMap与HashTable主要从三方面来说。 一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现 二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 三.值:只有HashMap可以让你将空值作为一个表的条目的key或value
当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是「按值传递」还是「按引用传递」?
答:是按值传递。Java 语言的参数传递只有「按值传递」。当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,
但对象的引用(不是引用的副本) 是永远不会改变的。
GC是什么,为什么要有GC,简单介绍GC。
https://blog.csdn.net/leisure_life/article/details/74529253
float型float f=3.4是否正确
答案:不正确。 原因:精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4 或float f = 3.4f 在java里面,没小数点的默认是int,有小数点的默认是 double; 编译器可以自动向上转型,如int 转成 long 系统自动转换没有问题,因为后者精度更高 double 转成 float 就不能自动做了,所以后面的加上个 f;
Java-Collection Framework学习要点
https://blog.csdn.net/zolalad/article/details/11368561
如在COLLECTION框架中,实现比较要实现什么样的接口?
Collection框架中实现比较要实现Comparable 接口和 Comparator 接口
面向对象的特征
面向对象编程有三大特性:封装、继承、多态。
String属于是基本数据类型吗?为什么?
java 中String 是个对象,是引用类型 ,基础类型与引用类型的区别是,基础类型只表示简单的字符或数字,引用类型可以是任何复杂的数据结构 ,基本类型仅表示简单的数据类型,
引用类型可以表示复杂的数据类型,还可以操作这种数据类型的行为 。 java虚拟机处理基础类型与引用类型的方式是不一样的,对于基本类型,java虚拟机会为其分配数据类型实际占用的内存空间,而对于引用类型变量,他仅仅是一个指向堆区中某个实例的指针。 --------------------- 作者:我和普京一样酷 来源:CSDN 原文:https://blog.csdn.net/leon_is_sad/article/details/79997064 版权声明:本文为博主原创文章,转载请附上博文链接!
heap和stack区别
java 的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法时, 会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法 结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。 堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用 new 创建的对象都放在堆里,所以,它不会随方法的结束而消失。 方法中的局部变量使用 final 修饰后,放在堆中,而不是栈中。 区别: 1.heap是堆,stack是栈。 2.stack的空间由操作系统自动分配和释放,heap的空间是手动申请和释放的,heap常用new关键字来分配。 3.stack空间有限,heap的空间是很大的自由区。 在Java中, 若只是声明一个对象,则先在栈内存中为其分配地址空间, 若再new一下,实例化它,则在堆内存中为其分配地址。 4.举例: 数据类型 变量名;这样定义的东西在栈区。 如:Object a =null; 只在栈内存中分配空间 new 数据类型();或者malloc(长度); 这样定义的东西就在堆区 如:Object b =new Object(); 则在堆内存中分配空间
描述一下JVM加载Class文件的原理和机制
https://blog.csdn.net/weisg81/article/details/77415937
https://www.cnblogs.com/Berryxiong/p/6220890.html
什么是Java序列化,如何实现Java序列化?
https://blog.csdn.net/qq_39602750/article/details/79273516
写clone()方法时,通常都有一行代码
clone 有缺省行为,super.clone();因为首先要把父类中的成员复制到位,然后才是复制自己的成员。
写出一种11位手机号的正则表达式
^[1][3,4,5,7,8][0-9]{9}$
sleep和wait的区别。
对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。
sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
在调用sleep()方法的过程中,线程不会释放对象锁。
而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备
获取对象锁进入运行状态。
(转)三年java经验面试总结:https://blog.csdn.net/u010664947/article/details/78518456/
(转)面试阿里巴巴技术开发岗位是什么样的流程?:https://www.zhihu.com/question/40912176
(转)Vue面试中,经常会被问到的面试题/Vue知识点整理:https://segmentfault.com/a/1190000016344599
(转)面试总结之[JDK1.8新特性]:https://blog.csdn.net/hequan199411/article/details/81713827
(转)谈谈对红黑树的理解:https://www.cnblogs.com/liushaojie/p/10273679.html