1、Java8种基本数据类型;
- byte: 1字节
- short: 2字节
- int: 4字节
- long: 8字节
- double:8字节
- float:4字节
- char:2字节(C语言中是1字节)可以存储一个汉字
- boolean:1字节 false/true(理论上占用1bit,1/8字节,实际处理按1byte处理)
2、int与integer的区别
- int是基本数据类型 默认值 0;
- Integer是int 的封装类 默认值 null;
- int和Integer都可以表示某一个数值;
- int和Integer不能够互用,因为他们是两种不同的数据类型;
例子:
Integer integer = new Integer(1);
int i=i;
一版来讲上面的写法才是正确的,但我们在实际工作中的写法如下:
int i = 0;
Integer j = 0; (由于有自动装箱和拆箱,故这么写没问题)
3、String、StringBuffer、StringBuilder区别
- .可变与不可变
- 是否多线程安全
- 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方法用的还是 == ,也就是比较的两个对象的引用是否相等,
今天就这样吧,快下班了,后续逐渐加吧;