学习一门语言基础是非常重要的,因此本文总结了一些常见的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. Python-函数-Day4

    1.函数 1.1.集合 主要作用: 去重 关系测试, 交集\差集\并集\反向(对称)差集 a = {1,2,3,4} b ={3,4,5,6} a {1, 2, 3, 4} type(a) <c ...

  2. MySQL中使用sql语句获得表结构

    最近在研究PHP,那么就必须涉及到mysql.其中一个功能通过表数据自动生成页面,紧接着发现在一张空表中无法读取数据(因为人家刚刚新建,就是空的没有数据) 延伸出来便是直接查表结构获得字段名,再进行处 ...

  3. ajax中设置contentType: “application/json”的作用

    最近在做项目交互的时候,刚开始向后台传递数据返回415,后来百度添加了 contentType:"application/json"之后返回400,然后把传输的数据格式改为json ...

  4. 英语词汇(2)fall down,fall off和fall over

    一.fall down,fall off和fall over都表示"摔倒.跌倒"的意思,但它们各自的含义不同. 1.fall over 落在...之上, 脸朝下跌倒 fall ov ...

  5. 阿里云API网关(2)开放 API 并接入 API 网关

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  6. 数据结构与算法 —— 链表linked list(03)

    继续关于linked list的算法题: 删除排序链表中的重复元素 给定一个排序链表,删除所有重复的元素使得每个元素只留下一个. 案例: 给定 1->1->2,返回 1->2 给定  ...

  7. vi和vim编辑器

    VI vi是一种计算机文本编辑器,由美国计算机科学家比尔·乔伊(Bill Joy)完成编写,并于1976年以BSD协议授权发布. VIM Vim是从vi发展出来的一个文本编辑器.其代码补完.编译及错误 ...

  8. React-Native(五):React Native之Text学习

    本章节主要学习Text的布局,仿照网易新网: 代码: /** * Sample React Native App * https://github.com/facebook/react-native ...

  9. 如何在jenkins的maven项目中,用mvn命令行指定findbugs的黑名单规则文件

    一:问题背景 最近在研究jenkins的过程中,针对maven项目,打算添加findbugs进行静态检查,但我不太想在项目的pom中进行修改,最好可以只修改jenkins的job配置,即配置外部化. ...

  10. web前端HTML基础

    一.HTML介绍 HTML全称是(Hypertext Markup Language, HTML)又称为超级文本标记语言,它主要his一种用于创建网页的标记语言,在本质上是浏览器可以识别的规则,我们按 ...