java jdk常见问题总结,Java常见问题总结_Zcb0126的博客-程序员秘密

技术标签: java jdk常见问题总结  

1、Object有哪些公共方法?

答:clone(),equals(),hashCode(),wait(), getClass(),finalize(),notify(),notifyAll(),toString()

2、Object中finalize()的作用?

答:用于清理。finalize()方法不需要显示地调用, 在垃圾回收(GC)时会被自动先行调用的。

3、Java中四种引用方式?

答:http://my.oschina.net/eager/blog/726428

4、hashCode()的作用?

答:hashcode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。

在 Java 应用程序执行期间,在对同一对象多次调用 hashCode()时,必须一致地返回相同的整数,前提是将对象进行hashCode()比较时所用的信息没有被修改。

如果两个对象根据hashCode()返回的整数值不等,则equals()得到的结果必定为false;

如果两个对象根据equals()比较是相等的,那么调用两个对象的hashCode()必须返回相同的整数结果;

如果两个对象根据equals()比较是不等的,则hashCode()不一定得返回不同的整数。

详见:http://www.cnblogs.com/dolphin0520/p/3681042.html

5、ArrayList、LinkedList、Vector的区别?

线程安全性:

Vector、Stack:线程安全

ArrayList、LinkedList:非线程安全

实现方式:

LinkedList:双向链表

ArrayList,Vector,Stack:数组

扩容方式:

Stack继承自Vector,故不分开解释。

ArrayList扩容原来的50%(int newCapacity = (oldCapacity * 3)/2 + 1)

Vector缺省情况是原来的1倍(newCapacity  = oldCapacity * 2)

其他详见:http://blog.csdn.net/a19881029/article/details/45533733

6、String、StringBuffer与StringBuilder的区别?

String类为final类型

StringBuffer线程安全的可变字符序列

StringBuilder线程不安全,JDK5.0新增

在构造 StirngBuffer 或 StirngBuilder 时应尽可能指定它们的容量。如果操作的字符串长度(length)不超过 16 个字符就不用了,缺省时默认构造一个容量为16的对象,否则不指定会降低性能

详见:http://blog.csdn.net/kingzone_2008/article/details/9220691

7、java.io 与 java.nio的区别?

主要区别如下表:

IO

NIO

面向流

面向缓冲

阻塞IO

非阻塞IO

选择器

详见:http://my.oschina.net/eager/blog/729320

8、HashMap和Hashtable(注意 t 是小写的)的区别?

Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现;

Hashtable是线程安全的,HashMap是线程不安全的;

HashMap允许null作为Entry的key和value,Hashtable不允许;

Hashtable使用Enumeration,HashMap使用Iterator遍历;

Hashtable中hash数组默认大小是11,扩容的方式是 old*2+1,HashMap中hash数组的默认大小是16,扩容一定是2的指数。

9、HashMap和ConcurrentHashMap的区别?

HashMap是since JDK1.2,ConcurrentHashMap是since JDK1.5;

HashMap是线程不同步的,ConcurrentHashMap是线程同步的;

HashMap本质是数组+链表,ConcurrentHashMap将数据分为多个segment,默认16个。

ConcurrentHashMap详见:http://www.cnblogs.com/dolphin0520/p/3932905.html

ConcurrentHashMap实现同步分析:http://blog.csdn.net/xuefeng0707/article/details/40834595

10、Hashtable和ConcurrentHashMap的区别?

Hashtable采取的是synchronized整个方法,ConcurrentHashMap采取的是synchronized代码块

Hashtable每次同步锁整体,ConcurrentHashMap只锁当前需要用到的segment

更多关于Map的详见:http://my.oschina.net/eager/blog/729795

11、try{}里有一个return语句,finally{}里的代码还会执行吗?

会执行,在return之前执行。

public class Test {

public static void main(String[] args) {

int a = 1;

System.out.println("a:"+a);

System.out.println("result:"+getNum(a));

}

public static int getNum(int a) {

try {

a = 2;

System.out.println("try-a:"+a);

return a;

} finally {

a = 3;

System.out.println("finally-a:"+a);

}

}

}

结果展示:

e4c7e95a18d0a43e274c49c16d6903a5.png

可能会觉得很疑惑,从输出可以看出是执行了finally中的语句,但为什么最终返回值是2。因为如果存在finally代码块,try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值,所以在finally块中调用return,则会修改返回值,但是不建议这样做。

12、Excption与Error包结构?

ee4024450ba3efd4366dd6ad2c4580eb.png

13、OOM你遇到过哪些情况?SOF你遇到过哪些情况?

OOM(Out Of Memory):当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个Error(注:非Exception,因为这个问题已经严重到不足以被应用处理)。

1)分配的少了,比如虚拟机本身可使用的内存(一般通过启动时的JVM参数指定)太少。

2)应用用的太多,并且用完没释放,浪费了,此时就会造成内存泄露或者内存溢出。

内存泄露:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了,因为申请者不用了,而又不能被虚拟机分配给别人用。

内存溢出:申请的内存超出了JVM能提供的内存大小,此时称之为溢出。

常见内存溢出情况:

java.lang.OutOfMemoryError: Java heap space ------>java堆内存溢出,此种情况最常见,一般由于内存泄露或者堆的大小设置不当引起。对于内存泄露,需要通过内存监控软件查找程序中的泄露代码,而堆大小可以通过虚拟机参数-Xms,-Xmx等修改。

java.lang.OutOfMemoryError: PermGen space ------>java永久代溢出,即方法区溢出了,一般出现于大量Class或者jsp页面,或者采用cglib等反射机制的情况,因为上述情况会产生大量的Class信息存储于方法区。此种情况可以通过更改方法区的大小来解决,使用类似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。另外,过多的常量尤其是字符串也会导致方法区溢出。

SOF(Stack Over Flow):JAVA虚拟机栈溢出,一般是由于程序中存在死循环或者深度递归调用造成的,栈大小设置太小也会出现此种溢出。可以通过虚拟机参数-Xss来设置栈的大小。

详见:http://www.cnblogs.com/gaojing/archive/2012/10/30/2844938.html

未完待续,该博客会每一天进行更新。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_36190812/article/details/115779657

智能推荐

linux系统定时器中断优先级,请教定时器中断与串口中断优先级配置问题_Feitong Yang的博客-程序员秘密

各位大神,最近做项目遇到一问题,如下:功能要求:串口要接收大量数据,用于绘图;使用串口屏绘图,每5ms刷新一次。实现过程:使用TIM3,每5ms取一次数据,并发送一次绘图命令,优先级设置为抢占3,组内2;使能串口1接收中断(或DMA空闲中断),把数据放置在某缓冲区,优先级设置为最高(抢占0,组内0);中断优先级分组为2。故障表现:定时器绘图正常,但串口接收大量数据丢失,把TIM3关掉,或者TIM3...

OpenLayers动态修改GeoServer发布的地图样式_openlayers wms sld_giscoder的博客-程序员秘密

流程思路1.改写GeoServer相应的SLD,使其支持动态修改样式;2.修改前端请求WMS服务参数。修改GeoServer的SLD该部分在GeoServer官网上有说明,想了解更多请访问GeoServer官网:https://docs.geoserver.org/stable/en/user/styling/sld/extensions/substitution.html#sld-var...

Golang垃圾回收机制详解_enable write barrier_思维的深度的博客-程序员秘密

Golang 从第一个版本以来,GC 一直是大家诟病最多的。但是每一个版本的发布基本都伴随着 GC 的改进。下面列出一些比较重要的改动。v1.1 STWv1.3 Mark STW, Sweep 并行v1.5 三色标记法v1.8 hybrid write barrierGC 算法简介这一小节介绍三种经典的 GC 算法:引用计数(reference counting)、标记-清扫(ma...

/home/ubuntu/anaconda3/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541:_三月微暖寻春笋的博客-程序员秘密

/home/ubuntu/anaconda3/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)

程序员开发的“逆天”软件_R语言中文社区的博客-程序员秘密

我有一个师兄一个很神奇的师兄之所以说他神奇是因为他真的很神奇师兄是个典型的学霸本科跟我一样是学土木工程的,后来考研又跨专业考到了计算机,毕业后成为一名程序员。他说你知道我为什么做程序员么?因为我可以随心所欲的开发我自己想出来的东西。这让我有一种征服世界的感觉。年轻,敢想敢做,没什么不可以~1师兄刚上班的时候经常因为睡懒觉而迟到,所以经常被领导骂,他想了很多办法都没有解决,后来他自己开发了一个闹钟系

HDU 4975 最大流+判断环_Dan__ge的博客-程序员秘密

点击打开链接题意:给定的分别是每行值的和,每列值的和,每个元素的值在0~9之间,问有多少种情况符合条件,多种,一种和不可能分别输出三种情况思路:刚读完题根本没有思路,看了网上的才知道用网络流,那样的话就好办了,建个源点,与每行建一条流量为行和的边,每一列与汇点建一条流量为列和的边,每行与每列建一条流量为9的边,跑最大流后判断是否满流就行了,但是要怎么判断有没有多组解呢,当残余网络中有环时,

随便推点

大数据经典学习路线_Geek.Fan的博客-程序员秘密

1.Linux基础和分布式集群技术学完此阶段可掌握的核心能力:熟练使用linux,熟练安装Linux上的软件,了解熟悉负载均衡、高可靠等集群相关概念,搭建互联网高并发、高可靠的服务架构;学完此阶段可解决的现实问题:搭建负载均衡、高可靠的服务器集群,可以增大网站的并发访问量,保证服务不间断地对外服务;学完此阶段可拥有的市场价值:具备初级程序员必要具备的Linux服务器运维能力...

C语言引用方式传参与传值方式传参_c语言引用传参_HangoverLG的博客-程序员秘密

1.引用方式传参引用相当于外部变量的别名,实际操作的就是该变量,即函数内对变量进行修改的话,在外部变量也会被相应修改。2.传值方式传参:实际上是复制了一个外部变量的副本进入函数中, 在函数内操作的为该副本,对该变量的修改并不会修改函数外部的变量。3.特殊情况:如果传值方式传入的是指针,那么如果单纯修改指针,那么在跳出函数后,该指针指向不受影响,但是如果修改的是指针指向的值,那么外部的指针所指向的内容也是相应修改的。原因:使用指针进行传参,也就是在函数内部复制了指针的副本,所以在函数内修改指针并

macbook 换固态硬盘 光驱位机械硬盘自动加载卸载_kq_job的博客-程序员秘密

所以就想既然硬盘是放在光驱位,能不能想光驱一样弹出,加载。试了下,可以弹出硬盘,但加载硬盘找了好久才发现可以再磁盘管理中加载光驱位的硬盘。但每天都要做这种重复性的工作,太非劲,作为程序员怎么能忍受呢。所以研究了下,写了个shell脚本,每次开机自动卸载光驱硬盘,需要使用光驱硬盘的时候点击运行脚本就自动加载,非常方便,把硬盘保护好好的,再也不用担心震动损坏磁盘

推荐文章

热门文章

相关标签