J2SE基础面试题总结

1.九种基本数据类型的大小,以及它们的封装类

Java有九种基本数据类型,分别是:byte、short、int、long、char、float、double、boolean和void。

数据类型 大小 最小值 最大值 包装类型
byte 1个字节 -2^7 2^7-1 Byte
short 2个字节 -2^15 2^15-1 Short
int 4个字节 -2^31 2^31-1 Int
long 8个字节 -2^63 2^63-1 Long
char 2个字节 Unicode 0 Unicode 216 -1 Character
float 4个字节 IEEE754 IEEE754 Float
double 8个字节 IEEE754 IEEE754 Double
boolean 未强制定义 - - Boolean
void - - - Void

boolean

Java规范没有强制指定boolean类型变量所占用的空间,虽然boolean变量只需要1位即可保存,但是计算机在分配内存时一般最小单位是字节,所以boolean变量大部分时候实际占用8位。

类型转换

  • 自动类型转换:从小类型到大类型可以自动完成。
    byte->short->int->long->float->double
    char->int
  • 强制类型转换:从大类型到小类型需要强制转换符,有可能会丢失精度。

Java基本类型大小与平台无关

Java基本类型占用的大小是按照占用的字节数个数来决定的,比如64位就是占用8个字节,因此能做到平台无关。

使用封装类的目的

在Java中使用基本类型来存储语言支持的基本数据类型,这里没有采用对象是考虑到性能因素。因为即使是最简单的数学计算,使用对象来处理也会有一些开销,但这对于数据计算没有必要。但是在Java中,集合类中存放的都是对象,为了使集合类也能够存放基本数据类型,Java提供了对应的包装类。

2.switch能否用string做参数?

在Java1.5之前只能用int类型,因为char、byte和short可以自动转换为int,所以也可以用,而float和double不能自动转换为int,所以不能直接作为参数。
在Java1.5后加入了枚举类型,在Java7后可以用String做参数。

3.equals和==的区别

equals比较的是对象是否相等,调用的是对象的equals方法,可以由开发者重写。而==判断的是地址是否相同。

4.object有哪些公用方法?

主要有wait()、notify()、notifyAll()、hashCode()、toString()、equals()、getClass()、clone()、finalize()9个方法。

4.1 wait()、notify()和notifyAll()

  • wait()方法一直等待直到获得锁喝着被中断。
  • notify()唤醒在该对象上等待的某个线程。
  • notifyAll()唤醒在该对象上等待的所有线程。

在并发编程中,这三个方法针对的都是同一个对象。也就是说同一个object调用notify()或者totifyAll()唤醒的是同一个object中wait()的线程,而不是别的线程。wait()释放锁,sleep()不释放锁。

4.2 hashCode()和equals()

equals()用来判断两个对象是否相等,可重写。hashCode()用来计算哈希值确定存放地址。
当equals()方法被重写时需要重写hashCode()方法,因为相同的对象的hashCode也一定相等。但hashCode相等的两个对象却不一定相同。不然会导致存储数据的不唯一(存储了两个equals相等的数据)。

4.3 toString()

该方法用的较多,也比较简单,一般都有覆盖

4.4 clone()

实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法。clone()会在堆中分配一个区域,来存放该对象的备份,并建立一个新的引用指向该对象。即对象实例相等,引用不相等。
注意:clone()只是简单复制一个对象,如果该对象中还包括对其他对象的引用,那么clone()直接复制这个应用,即两个内存区域的引用指向同一个对象

4.5 finalize()

当垃圾回收器确定不存在对该对象的引用时,即对象处于可恢复状态时,由垃圾回收器调用此方法。有可能在调用finalize()后该对象又变成可达状态。该方法用于释放资源,何时被调用具有不确定性。开发者不应主动调用该方法,应交给垃圾回收器调用。

4.6 getClass()

final方法,获得运行时类型。

5. Java的四中引用,强弱软虚,用到的场景

  • 强引用:new一个对象,并用一个引用变量指向它。强引用的对象处于可达状态,不可以被垃圾回收机制回收。
  • 软引用:只有软引用的对象,在系统内存充足时,不会被系统回收,程序也可以使用该对象。当系统内存不足时,系统会回收它。软引用常用于内存敏感的程序中。
  • 弱引用:与软引用相似,但是引用级别更低。不管系统内存空间是否充足,在系统进行垃圾回收时都会被回收。
  • 虚引用:类似于完全没有引用,不能通过虚引用获得一个对象。主要用于跟踪对象被垃圾回收的状态,必须和引用队列配合使用。

应用场景:软引用和虚引用可以用于cache,因为cache不能保证绝对的可靠,因此可以用weakHashMap来当缓存,这样垃圾回收器可以自动进行回收。如果是重要的数据,则不能用weakHashMap。

6. hashCode的作用

用来配合基于散列的集合的,如HashMap,HashSet,hashTable之类的。用于计算散列值,确定存储的槽位。

  • 为什么需要hashCode,有了equals不就可以了吗?
    hashCode默认都是地址,即一个数值类型的数据,比较hashCode比比较对象是否相等要容易的多。而两个对象equals时其hashCode必定相同,当hashCode不同时两个对象必定不同。当插入一个新的对象到集合中时,先比较hashCode是否与集合中的任一对象相同,若不同则直接插入,不需要在进行equals比较,若hashCode相同在进行equals比较,这样可以大大降低复杂度,提高查找效率。
将对象放入集合中的流程

7. ArrayList、LinkedList、Vector的区别

  • 数组实现。ArrayList和Vector底层采用数组的形式存储数据。因此查找的效率比较高,插入和删除效率比较低。而且Vector是线程安全的,在很多方法中都加了一个synchronized,将方法锁起来,因此效率比较低。(细节的话它们的扩容因子不一样大,ArrayList是1.5倍,Vector是2倍)。
  • 链表实现。LinkedList采用双向链表实现,它继承了List和Queue两个接口,查找速度稍微低一些,但插入和删除效率高。同时由于继承了Queue,还可以当做队列来使用。
  • 扩容问题。ArrayList和Vector使用数组实现,因此存在resize问题(扩容)。即重新计算数据大小,将原来的数据拷贝到新的数据中,因此比较耗时。而LinkedList采用链表形式,不存在resize问题,因此对于增长较快的应该采用LinkedList。
  • 实现形式。set和list都继承了collection接口,但是list是有序的,一般采用数组或链表实现;而set是无序的,一般采用hash实现。

8.String、StringBuffer和StringBuilder的区别

  • String类是不可变的。
    • String类内部用final char[]实现。String不可变的关键是SUN公司的工程师在后面所有String的方法里很小心的没有动char[]里的元素。
    • 同时String类是不可变的(final修饰String),每次操作都会返回一个新的数组对象。
  • StringBuffer和StringBuilder是可变的。
    • 它们的操作每一次都返回该字符串吧本身(return this)
    • 都继承了AbstractStringBuilder,在AbstractStringBuilder中,char[]没有用final修饰。
  • StringBuffer是线程安全的,StringBuilder是线程不安全的,也就是StringBuffer中很多方法中都加了synchronized对方法进行加锁,因此效率比较低。
  • String对象在进行连接操作时,会用String字符串创建一个StringBuilder对象,在调用其append方法来连接两个字符串。因此在需要进行大量连接操作的时候,要使用StringBuilder或StringBuffer,节省资源消耗。
  • 包装类Integer、Character之类的也是不可变的,它们像String一样,除了自身用final修饰,内部的int和char基本类型的变量也是用final修饰的。

9. Map、Set、List、Queue、Stack的特点与用法

  • Map:以键值对形式存入数据,键可以为null。
  • Set:继承collection接口,数据没有顺序,不能重复,可以存入null。Set是通过包装一个所有value都为null的Map实现的。
  • Stack: 栈,继承了Vector类,因此Stack类是用数组实现的,且线程安全。
  • Queue: 队列,LinkedList继承了Queue接口,可以用LinkedList创建队列。

10. HashMap和HashTable的区别

HashMap不是线程安全的,HashTable是线程安全的。HashMap允许key或value为null,HashTable不允许。同时HashTable继承Dictionary类,而hashMap,继承AbstractMap类,但是都实现Map接口。
住过HashMap要实现同步,可以用Collection.sychronbizedMap(HashMap),这样就能够达到HashTable的效果。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,079评论 0 62
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,209评论 11 349
  • 所有知识点已整理成app app下载地址 J2EE 部分: 1.Switch能否用string做参数? 在 Jav...
    侯蛋蛋_阅读 2,412评论 1 4
  • 踏着时间的年轮,80后已不再是主流,90后的网红达人一批批兴起,这就意味着80和90后的今天,一部分献给神圣的事业...
    悟静dy阅读 298评论 0 1