面试基础知识储备

1、Java8种基本数据类型;

  1.   byte:    1字节
  2.   short: 2字节
  3.    int:     4字节
  4.   long:  8字节
  5. double:8字节
  6. float:4字节
  7. char:2字节(C语言中是1字节)可以存储一个汉字
  8. boolean:1字节    false/true(理论上占用1bit,1/8字节,实际处理按1byte处理)

2、int与integer的区别

  1. int是基本数据类型   默认值 0;
  2. Integer是int 的封装类  默认值 null;
  3. int和Integer都可以表示某一个数值;
  4. int和Integer不能够互用,因为他们是两种不同的数据类型;

例子:

Integer integer = new Integer(1);
int i=i;

一版来讲上面的写法才是正确的,但我们在实际工作中的写法如下:

int i = 0;
Integer j = 0; (由于有自动装箱和拆箱,故这么写没问题)

3、String、StringBuffer、StringBuilder区别

  1. .可变与不可变
  2. 是否多线程安全
  3.  StringBuilder与StringBuffer共同点

一、

String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。

StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。

二、

String中的对象是不可变的,也就可以理解为常量,显然线程安全

StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的

StringBuilder并没有对方法进行加同步锁,所以是非线程安全的

三、

StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。

抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。

StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。

最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。

关于这一点,勤看源码就可以清晰明了;

4、List,Set,Map的区别

一、List接口

List是一个继承于Collection的接口,即List是集合中的一种。List是有序的队列,List中的每一个元素都有一个索引;第一个元素的索引值是0,往后的元素的索引值依次+1。和Set不同,List中允许有重复的元素。实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。

二、Set接口

Set是一个继承于Collection的接口,Set是一种不包括重复元素的Collection。它维持它自己的内部排序,所以随机访问没有任何意义。与List一样,它同样运行null的存在但是仅有一个。由于Set接口的特殊性,所有传入Set集合中的元素都必须不同,关于API方面。Set的API和Collection完全一样。实现了Set接口的集合有:HashSet、TreeSet、LinkedHashSet、EnumSet。

三、Map接口

Map与List、Set接口不同,它是由一系列键值对组成的集合,提供了key到Value的映射。在Map中它保证了key与value之间的一一对应关系。也就是说一个key对应一个value,所以它不能存在相同的key值,当然value值可以相同。实现map的集合有:HashMap、HashTable、TreeMap、WeakHashMap。

 

4、voliate关键字的用法及作用

作用:保证了变量的可见性(visibility)。被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象。

说道voliate不得不提的还有(同步块)synchronized

volatile是变量修饰符,而synchronized则作用于一段代码或方法

举个栗子:

https://blog.csdn.net/qq_32886769/article/details/105567756

5、&和&&的区别

& 不管前面的条件是否正确,后面都执行

&& 前面条件正确时,才执行后面,不正确时,就不执行,更有效率

 

6、== 和 equals 的区别

1、定义不同

"equals"在JAVA中是一个方法。

"=="在JAVA中只是一个运算符合。

 

2、==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同 

     ==是指对内存地址进行比较 , equals()是对字符串的内容进行比较

     ==指引用是否相同, equals()指的是值是否相同

看源码;

/**
 * Compares this string to the specified object.  The result is {@code
 * true} if and only if the argument is not {@code null} and is a {@code
 * String} object that represents the same sequence of characters as this
 * object.
 *
 * @param  anObject
 *         The object to compare this {@code String} against
 *
 * @return  {@code true} if the given object represents a {@code String}
 *          equivalent to this string, {@code false} otherwise
 *
 * @see  #compareTo(String)
 * @see  #equalsIgnoreCase(String)
 */
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = length();
        if (n == anotherString.length()) {
            int i = 0;
            while (n-- != 0) {
                if (charAt(i) != anotherString.charAt(i))
                        return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

 

这里摘抄别人的一张图,更加明了;

可以看出来Object类中的equals方法用的还是 == ,也就是比较的两个对象的引用是否相等,

 

 

 

今天就这样吧,快下班了,后续逐渐加吧;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值