美文网首页
Java基础

Java基础

作者: rabbittttt | 来源:发表于2019-02-15 23:46 被阅读0次

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)是子类覆盖父类的方法,参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。

相关文章

  • Java 基础

    Java 基础01Java开发入门 Java 基础02Java编程基础 Java 基础03面向对象 Java 基础...

  • 技术体系

    一,java核心 java基础,jvm,算法,多线程,设计模式 Java基础:java基础相关,全栈java基础 ...

  • 面试题汇总

    1.Java基础面试问题 Java基础之基础问题 Java基础之面向对象 Java基础之数据结构 Java基础之I...

  • 【Android】知识点汇总,坚持原创ing

    Android基础 Java基础 Java基础——Java内存模型和垃圾回收机制 语法基础 语法基础——C语法基础...

  • Java基础:反射

    反射注解动态代理相关阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 ...

  • Java基础:注解

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 概述 注解...

  • Java基础:动态代理

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 概述 在运行时,...

  • Java 集合类原理

    Java基础——HashMap源码分析 Java基础——HashSet源码分析 Java基础——HashTable...

  • Java基础:类加载器

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 什么是类加...

  • java基础(一)-String、StringBuffer、St

    java基础-String、StringBuffer、StringBuilder java基础小白,初学java,...

网友评论

      本文标题:Java基础

      本文链接:https://www.haomeiwen.com/subject/brcmeqtx.html