JAVA基础知识整理(一)

来源:互联网 发布:linux 打印输出到文件 编辑:程序博客网 时间:2024/05/17 09:16

1.八种基本数据类型的大小以及他们的封装类(顺带了解自动拆箱与装箱)。

原始类型 大小 包装类型 char 2字节 Character boolean 1字节 Boolean byte 1字节 Byte short 2字节 Short int 4字节 Integer long 8字节 Long float 4字节 Float double 8字节 Double

从Java 5开始,引入了自动装箱/拆箱机制,使得二者可以互换,细节值得注意:

public class Solution {    public static void main(String[] args) {        Integer a = new Integer(3);        Integer b = 3; // 将3自动装箱成Integer类型,new一个Integer对象        Integer c = 3; // 如果整型字面量的值在-128到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象        int d = 3;        Integer e = 200;        Integer f = 200;        System.out.println(a == b); // a和b是不同对象的引用,返回false        System.out.println(b == c); // 3在-128到127之间,故c装箱时不再new对象,b和c指向同一个对象,返回true        System.out.println(b == d); // 自动拆箱,基本类型的比较,返回true        System.out.println(e == f); // 200不在-128到127之间,故e和f分别指向不同的对象,返回false    }}

2.equal与==区别(问的很多)
基本类型之间的比较一般是用==,但是注意float和double类型的精度问题以及NaN、正无穷大、负无穷大、-0.0、0.0的比较问题。
引用类型的比较一般是用equal,尤其是字符串,因为==是指对象地址之间的比较,而对象地址之间的比较一般是无意义的。

3.object有哪些公共方法

1.clone方法
保护方法,实现对象的浅复制。
主要是JAVA里除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递,我们有时候不希望在方法里将参数改变,这是就需要在类中复写clone方法。
2.getClass方法
final方法,获得运行时类型名。
3.toString方法
该方法用得比较多,一般子类都有覆盖。
4.finalize方法
该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
5.equals方法
该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。
6.hashCode方法
该方法用于哈希查找,可以减少在查找中使用equals的次数,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。
如果不重写hashcode(),在HashSet中添加两个equals的对象,会将两个对象都加入进去。
7.wait方法
wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。
调用该方法后当前线程进入睡眠状态,直到以下事件发生。
(1)其他线程调用了该对象的notify方法。
(2)其他线程调用了该对象的notifyAll方法。
(3)其他线程调用了interrupt中断该线程。
(4)时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
8.notify方法
该方法唤醒在该对象上等待的某个线程。
9.notifyAll方法
该方法唤醒在该对象上等待的所有线程。

4.i++是否是原子操作,与++i有什么区别
原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)

1.i++分为三个阶段:
内存到寄存器
寄存器自增
写回内存
这三个阶段中间都可以被中断分离开.
2.++i首先要看编译器是怎么编译的
如果在单核机器上,不加锁不会有问题,但到了多核机器上,需要加锁。

i++ 与 ++i 的主要区别有两个:
(1.)i++ 返回原来的值,++i 返回加1后的值。
(2.) i++ 不能作为左值,而++i 可以。
左值是对应内存中有确定存储地址的对象的表达式的值,而右值是所有不是左值的表达式的值。

5.hashcode作用
hashcode方法返回该对象的哈希码值。
hashCode()方法可以用来来提高Map里面的搜索效率的,Map会根据不同的hashCode()来放在不同的位置,Map在搜索一个对象的时候先通过hashCode()找到相应的位置,然后再根据equals()方法判断这个位置上的对象与当前要插入的对象是不是同一个。
所以,Java对于eqauls方法和hashCode方法是这样规定的:
   *如果两个对象相同,那么它们的hashCode值一定要相同;
   *如果两个对象的hashCode相同,它们并不一定相同。

0 0
原创粉丝点击