Java基础

1 int 和 Integer 有什么区别;Integer的值缓存范围
ans:int 是基本数据类型,用作变量时直接在栈上保存数值,初始化时变量值为0;
Integer 是 java.lang 包中提供的数据类,使用时和Java对象是一样保存在堆中,但是Java 对其做了优化,会缓存范围在 -128~127 的对象,这个范围的Integer对象都是同一个缓存的对象。
装箱&拆箱:Java为了方便这两个类型的数据转换,会自动为这两类数据的赋值进行转换,叫做装箱/拆箱。给一个 Integer 对象赋一个 int 值得时候,会调用 Integer 类的静态方法 valueOf()。
参考:https://www.jianshu.com/p/9bd18eae9a1a

2 说说反射的用途及实现
ans: 反射能够使程序在运行期获得对象自身的信息,并且可以操作类或对象内部的属性和方法。可以用来查看对象信息,可以支持Java的其他特性,例如序列化。IDE的补全提示功能也是使用了反射,各种通用框架也常用到反射(例如Spring)。
反射API 主要由四部分组成:Class、Field、Method、Constructor.
Class保存类的信息,可以通过名字获取类型信息。
可以通过 Field 获得和修改对象数据成员。
可以通过 Method 查询和调用对象的函数,
Constructor 负责管理构造器,可以用来创建对象实例。
参考:https://www.sczyh30.com/posts/Java/java-reflection-1/

3 容器相关
ans:
List:LinkedList 使用双向链表实现,更适合频繁增删元素的场景,LinkedList也可以用做栈、队列。
ArrayList 使用数组实现,更适合随机访问操作多一些的场景,初始大小是10,每当空间被填满就增至原大小的1.5倍。
Vector 是线程安全版本的ArrayList,效率较低,单线程场景下一般不使用。

Map:HashMap 使用散列表实现,每个桶使用链表实现。增删和查询的开销较小,一般是map首选。初始大小是16,默认装填因子是0.75,Map中元素总数超过阈值后扩大至原来的两倍。使用时需要实现类的hashCode() 和 equal() 方法。
Hashtable 是线程安全版本的HashMap,效率较低,单线程场景下一般不使用。
TreeMap 使用红黑树实现,有序的map。用户可以自定义compare()方法,决定key的顺序,也可以使用默认的比较器。唯一持有subMap()方法,它返回一个子树。
LinkedHashMap 是HashMap的子类,内部维护一个链表,记录键值对的插入顺序。
ConcurrentHashMap 是新的线程安全的散列表,写操作时每次仅锁住一个桶,与Hashtable的每次锁住整张表相比性能有大幅提升;value的值被设置volatile因此读操作可以保证能看到最新的值。扩容时所有写操作的线程参与到扩容工作中,完成后再进行操作(JDK8)。
参考:https://www.cnblogs.com/lfs2640666960/p/9621461.html
https://stackoverflow.com/questions/40471/differences-between-hashmap-and-hashtable

4 Http 请求的 GET 和 POST 方式的区别
ans:GET 和 POST 都是http协议的两种方法。GET的参数包含在URL中,POST通过request body传递参数。通常使用GET请求获取服务起的数据,而POST请求则用于提交更新/增加数据的请求。这主要是因为GET请求可能会被浏览器缓存,同时它将参数放在URL中可能会被爬虫利用,安全性较低。
此外,GET请求只会发送一个TCP数据包给服务器,而POST请求可能会发送两个TCP数据包:浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据),依赖于浏览器的实现。
参考:https://www.cnblogs.com/logsharing/p/8448446.html
https://stackoverflow.com/questions/3477333/what-is-the-difference-between-post-and-get

5 什么是Java序列化和反序列化;如何实现Java序列化 / 描述Serializable接口的作用
ans: 序列化是将对象转换为字节序列,从字节序列转回对象就是反序列化。
Java中只要让类实现serializable接口就能实现对象的序列化。要序列化一个对象,首先要创建OutputStream对象,然后将其封装在ObjectOutputStream中,再调用writeObject()方法即可。反序列化要创建InputStream对象,然后将其封装在ObjectInputStream中,再调用readObject()方法。
需要注意的是:对一个serializable对象还原的过程中,没有使用任何构造器,完全以它存储的二进制位来还原。但必须确保该读取程序的CLASSPATH中包含有类的class文件,否则会抛出ClassNotFoundException。
影响序列化:
(1)如果不想让类中的某个成员变量被序列化,可以用关键字transient修饰它。
(2)如果想在序列化/反序列化过程中插入一些额外的工作,那么可以实现Externalizable接口来替代serializable接口,Java会在序列化过程中调用用户自定义的writeExternal()和readExternal()方法。
与serializable不同,实现Externalizable接口的类,在序列化过程中,是利用默认构造器重新创建一个新的对象。
(3)还可以直接覆盖serializable接口的readObject()和writeObject()方法,但访问权限是private,它们是通过反射被调用的
(4)单例对象也能被序列化,且反序列化回来之后与原对象并不是同一个。
关于 serialVersionUID:
序列化的版本号,在反序列化期间使用该版本号来验证序列化对象的发送方和接收方已经为该对象加载了与序列化兼容的类。如果接收方为对象加载的类与对应发送方的类具有不同的serialVersionUID,那么反序列化将导致InvalidClassException。为了保证在类变化之后也能使旧版本的数据反序列化成功,建议用户显式地声明它自己的serialVersionUID,方法是声明一个名为serialVersionUID的字段,该字段必须是静态的、final的并且类型为long。
参考:http://blogjava.net/jiangshachina/archive/2012/02/13/369898.html
https://www.cnblogs.com/xdp-gacl/p/3777987.html
https://stackoverflow.com/questions/285793/what-is-a-serialversionuid-and-why-should-i-use-it

6 谈谈 final、finally、finalize的区别
ans: final 关键字用于控制成员变量、方法,或者类是否可以被覆写或继承。用final修饰一个变量,那么这个变量一旦被初始化,便是不可改变的。用final修饰方法时,表示不允许任何从此类继承的类来覆写这个方法。用final修饰类时,表示该类无法被继承。
finally 是用于Java异常处理中,finally 结构使代码总会执行,而不管是否有异常发生。常用于清理非内存资源(如关闭文件描述符)。
finalize() 是一个方法,是在垃圾收集器删除对象之前调用,但Java不保证??,一般最好不要覆盖 finalize() 方法。
参考:https://www.jianshu.com/p/f2b10fd2f23c

7 try、catch、finally都有return语句时执行哪个。
ans: 如果try/catch语句块中都没有异常,那么他们的return语句会执行,但不会跳回上一级调用的方法并返回值,而是先执行finally,执行finally的return语句,再将这个值返回。
参考:http://www.voidcn.com/article/p-ymzpuars-ph.html

8 IO和NIO的区别
ans: Java IO 的设计是使用数据流的概念,阻塞式IO,一次处理一个字节/字符,不缓存数据,不能在数据流中“移动”。
IO API 分为面向字节的InputStream/OutPutStream 和 面向字符的Reader/Writer 两类。使用时需要多个filter对象配合来达到期望的功能,例如 in = new DataInputStream(new BufferedInputStream(new FileInputStream("file.txt")))。
NIO 的核心是Buffer 、Channel、Selector 三个部分组成的多路复用IO模型。非阻塞式,一次处理一个缓存块,可以在buffer中移动,但由于Buffer中是底层字节,需要用户做数据处理的工作。
NIO API 使用时 在Selector注册Channel,由Selector监听Channel,当数据准备好时通知用户线程,用户可以用Buffer从Channel中读写数据。
由于IO是阻塞式的,当数据未准备好时就需要线程等待,当请求较多时可能有大量线程被阻塞,浪费系统资源。NIO只需要Selector一个线程监视所有请求,在有大量请求时资源消耗比IO更少。

9 ==和equals的区别。
ans: 基本数据类型使用“==” 符号时,比较的是他们的值,而这个符号使用在对象时,比较的是对象的地址。因此Java为Object加入了equal方法(默认实现仍然是"=="),用于比较两个对象的内容,用户可以覆盖这个方法自定义“相等”的语义,例如Integer、String 等类都覆盖了这个方法,改为比较值而不是地址。
另外,如果覆盖了equals(), 那么最好同时覆写hashCode(),如果两个对象的equals方法显示它们是等价的,那么hashCode()方法返回的结果应当相同,反之则未必。
参考:http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html
https://stackoverflow.com/questions/7520432/what-is-the-difference-between-and-equals-in-java

10 String和StringBuilder、StringBuffer的区别。
ans: String 是不可变对象,在每次对 String 进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String。
StringBuffer 和 StringBuilder 都是可变字符串对象,内部保存一个字符数组,当需要拼接字符时,会自行扩展空间。StringBuffer是线程安全的,而StringBuilder不是,因此StringBuilder的效率高一些。
Java对String也做了一些优化,在compile阶段会自动将“字符串+字符串”这样的类型直接合并成一个字符串。此外,String 的 “+”操作也是利用StringBuffer 的 append() 实现的。
参考:http://www.runoob.com/w3cnote/java-different-of-string-stringbuffer-stringbuilder.html
https://www.journaldev.com/538/string-vs-stringbuffer-vs-stringbuilder

11 重载和重写的区别
ans: 重载(Overload),多个同名函数同时存在,但他们具有不同的函数签名,即入参不同
重写(Override)是子类覆盖父类的方法,参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。

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

推荐阅读更多精彩内容