学习一门语言基础是非常重要的,因此本文总结了一些常见的Java基础问题的解答,希望可以帮到大家。

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

9种基本数据类型
基本类型 包装类型 大小
boolean Boolean -
byte Byte 8bit
short Short 16bit
int Integer 32bit
long Long 64bit
float Float 32bit
double Double 64bit
char Character 16bit
void Void -
上面有两个比较值得注意的地方:
一个是boolean的大小并非是确定的,根据网上找来的JVM规范:
Instead, expressions in the Java programming language that operate on boolean values are compiled to use values of the Java virtual machine int data type.  
Where Java programming language boolean values are mapped by compilers to values of Java virtual machine type int, the compilers must use the same encoding. 而:Java virtual machine type int, whose values are 32-bit signed two's-complement integers。
Arrays of type boolean are accessed and modified using the byte array instructions  
In Sun's JDK releases 1.0 and 1.1, and the Java 2 SDK, Standard Edition, v1.2, boolean arrays in the Java programming language are encoded as Java virtual machine byte arrays, using 8 bits per boolean element.
从上文我们可以得知,boolean变量单独声明的时候被当做int变量处理,其大小为32bit,当boolean变量声明数组的时候,每个boolean当做byte变量处理,大小为8bit。
 
另一个是void也是Java的基本类型之一,其对应的包装类是不可实例化的,如下所示:
  1. package java.lang;
  2. /**
  3. * The {@code Void} class is an uninstantiable placeholder class to hold a
  4. * reference to the {@code Class} object representing the Java keyword
  5. * void.
  6. *
  7. * @author  unascribed
  8. * @since   JDK1.1
  9. */
  10. public final
  11. class Void {
  12. /**
  13. * The {@code Class} object representing the pseudo-type corresponding to
  14. * the keyword {@code void}.
  15. */
  16. @SuppressWarnings("unchecked")
  17. public static final Class<Void> TYPE = (Class<Void>) Class.getPrimitiveClass("void");
  18. /*
  19. * The Void class cannot be instantiated.
  20. */
  21. private Void() {}
  22. }
 

2.switch的参数

在Java中,switch后面的括号里放的参数类型只能是int类型,虽然说放入char,byte,short类型也不会报错,但其实是因为char,byte和short类型可以自己转化(宽化)为int类型,实际上最后操作的还是int类型。
原理:在Java的9种基本类型中,boolean和void类型不能进行转换。大小较小的类型向大小较大的类型转换叫宽化(如char转int),宽化会自动在变量前面补零且是安全的,因此可以自动转换。大小较大的类型向大小较小的类型转化叫窄化(如double转int),窄化不能自动转换,必须使用强制类型转换,如:(int)double。
补充:除了int类型外还支持枚举类型。另外在jdk1.7中有了新的特性,支持String类型。
 

3. equals与==的区别

很经典的一个问题了。首先==在Java中,对于基本类型比较的是他们的值是否相等,对于引用类型则比较两个对象是否地址相同,是否为同一引用。equals在Object中的默认实现和==没有区别:
  1. public boolean equals(Object obj) {
  2. return (this == obj);
  3. }

值的注意的是用的较多的String类重写了equals方法:

  1. public boolean equals(Object anObject) {
  2. if (this == anObject) {
  3. return true;
  4. }
  5. if (anObject instanceof String) {
  6. String anotherString = (String)anObject;
  7. int n = value.length;
  8. if (n == anotherString.value.length) {
  9. char v1[] = value;
  10. char v2[] = anotherString.value;
  11. int i = 0;
  12. while (n-- != 0) {
  13. if (v1[i] != v2[i])
  14. return false;
  15. i++;
  16. }
  17. return true;
  18. }
  19. }
  20. return false;
  21. }

从上面方法我们可以看出,首先String比较传入的Object对象是否和当前String为同一引用,是则返回true。如果不是,则判断传入的Object对象是否String对象及其子类实例,如果不是则返回false。再然后如果传入的参数是String的实例,则比较两个String的内容是否完全相同。

 

4. Object有哪些公用方法

Object中的public方法如图所示,简单介绍下每个方法:
  1. Object(),默认构造函数,略
  2. getClass(),native和final方法,返回此对象的运行时类
  3. hashCode(),native方法,返回此对象的哈希码数值
  4. equals(Object),详见上一个问题
  5. toString(),返回一个代表该对象的字符串,此处返回:“类名@16进制哈希码”
  6. notify(),native和final方法,唤醒在此对象监视器上等待的单个线程
  7. notifyAll(),native和final方法,唤醒在此对象监视器等待上的所有线程
  8. wait(),该方法有3个重载,作用是让当前线程处于等待状态,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或超过指定时间,或其他线程中断当前线程。

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

在Java中,对象的引用和JVM的GC有着密切的联系,对于对象我们有4中不同的引用:
    1. 强引用:我们平时普通创建对象的方法就是强引用,普通系统99%以上都是强引用。如果一个对象是强引用创建的,则需要手动置null,JVM的GC才能回收其内存,否则即使是报内存不足,也不会清理具有强引用的对象。
    2. 软引用:通过SoftReference<T>方法创建为软引用,一般JVM的GC不会清理软引用,但会在发生OOM(out of memory)时清理软引用。一般软引用可以用来实现内存敏感的高速缓存。
    3. 弱引用:通过WeakReference<T>方法创建即弱引用,弱引用的生命周期比软引用短很多,如果一个对象只具有弱引用,那么他会在JVM GC时被清理掉。JDK有使用弱引用实现的WeakHashMap,他会在GC时回收掉不怎么使用的键值对。
    4. 虚引用:通过PhantomReference<T>方法创建即为虚引用,虚引用形同虚设,如果一个对象只具有虚引用,那么它就和没有任何引用一样,随时会被JVM当作垃圾进行回收。虚引用主要用来跟踪对象被垃圾回收的活动。

关于一些基础的Java问题的解答(一)的更多相关文章

  1. 关于一些基础的Java问题的解答(七)

    31. 反射的作用与原理 简单的来说,反射机制其实就是指程序在运行的时候能够获取自身的信息.如果知道一个类的名称或者它的一个实例对象, 就能把这个类的所有方法和变量的信息(方法名,变量名,方法,修饰符 ...

  2. 关于一些基础的Java问题的解答(六)

    26. ThreadPool用法与优势 ThreadPool即线程池,它是JDK1.5引入的Concurrent包中用于处理并发编程的工具.使用线程池有如下好处: 降低资源消耗:通过重复利用已创建的线 ...

  3. 关于一些基础的Java问题的解答(四)

    16. Java面向对象的三个特征与含义 java中的面向对象的三大基本特征分别是:封装.继承.多态: 封装:把过程和数据包围起来,对数据的访问只能通过已定义的界面,主要是方便类的修改 继承:对象的一 ...

  4. 关于一些基础的Java问题的解答(五)

    21. 实现多线程的两种方法:Thread与Runable 在Java中实现多线程编程有以下几个方法: 1.继承Thread类,重写run方法 public class Test { public s ...

  5. 关于一些基础的Java问题的解答(三)

    11. HashMap和ConcurrentHashMap的区别   从JDK1.2起,就有了HashMap,正如上一个问题所提到的,HashMap与HashTable不同,不是线程安全的,因此多线程 ...

  6. 关于一些基础的Java问题的解答(二)

    6. Hashcode的作用 官方对于hashCode的解释如下: Whenever it is invoked on the same object more than once during an ...

  7. 黑马程序员:Java基础总结----java注解

    黑马程序员:Java基础总结 java注解   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! java注解 lang包中的基本注解 @SuppressWarnings ...

  8. java面试题—精选30道Java笔试题解答(二)

    摘要: java面试题-精选30道Java笔试题解答(二) 19. 下面程序能正常运行吗() public class NULL { public static void haha(){ System ...

  9. Java基础:Java的四种引用

    在Java基础:java虚拟机(JVM)中,我们提到了Java的四种引用.包括:强引用,软引用,弱引用,虚引用.这篇博客将详细的讲解一下这四种引用. 1. 强引用 2. 软引用 3. 弱引用 4. 虚 ...

随机推荐

  1. kubernetes入门(08)kubernetes单机版的安装和使用

    kubectl get - 类似于 docker ps ,查询资源列表 kubectl describe - 类似于 docker inspect ,获取资源的详细信息 kubectl logs - ...

  2. kubernetes入门(02)kubernetes的架构

    一.kubernetes的主从架构 kubectl,全称 Kubernetes Control Plane,它表示Kubernetes为了实现最终的目标而构建的一组集群范围内的进程,这组进程相互协调, ...

  3. python flask框架 tempates 模版的使用

    在py文件同级下 建立templates文件夹,再文件夹中编写html文件 1 向模版中传递参数: ''' 1 向模板传送 参数 ''' @app.route('/') def index(): na ...

  4. python中导入模块的本质, 无法导入手写模块的解决办法

    最近身边一些朋友发生在项目当中编写自己模块,导入的时候无法导入的问题. 下面我来分享一下关于python中导入模块的一些基本知识. 1 导入模块时寻找路径 在每一个运行的python程序当中,都维护了 ...

  5. 南京邮电大学java程序设计作业在线编程第四次作业

    王利国的的 "Java语言程序设计第4次作业(2018)" 详细 主页 我的作业列表 作业结果详细 总分:100 选择题得分:40  1.下列方法定义中,正确的是() A.doub ...

  6. [论文阅读] Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks(MTCNN)

    相关论文:Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks 概论 用于人脸检测和对 ...

  7. python json.dumps 中的ensure_ascii 参数引起的中文编码问题

    在使用json.dumps时要注意一个问题   >>> import json >>> print json.dumps('中国') "\u4e2d\u5 ...

  8. php过滤表单提交的html等危险代码

    表单提交如果安全做得不好就很容易因为这个表单提交导致网站被攻击了,下面我来分享两个常用的php过滤表单提交的危险代码的实例,各位有需要的朋友可参考. PHP过滤提交表单的html代码里可能有被利用引入 ...

  9. 关于if后面直接加上参数名,不加条件的用法

    <template> <section> <p v-if="aa">{{aa}}</p> <p v-if="bb&q ...

  10. libevent中evmap实现(哈希表)

    libevent中,需要将大量的监听事件event进行归类存放,比如一个文件描述符fd可能对应多个监听事件,对大量的事件event采用监听的所采用的数据结构是event_io_map,其实现通过哈希表 ...