1、JAVA 中的几种基本数据类型是什么,各自占用多少字节。
java语言中有8中数据类型,分为四大类型:
逻辑类型:boolean
整数类型:
byte,分配1字节内存,占8位
short,分配2字节内存,占16位
int,分配4字节内存,占32位
long,分配8字节内存,占64位
浮点类型:
float,分配4字节,占32位,实际储存8位有效数字
double,分配8字节内存,占64位,实际存储16位有效数字
字符类型:
char,分配2字节内存,占15位,变量范围:0-65535
2、String 类能被继承吗,为什么。
不能被继承,因为String类有final修饰符,而final修饰的类是不能被继承的。
3、String,Stringbuffer,StringBuilder 的区别。
String:String的值是不可变的,这就导致每次对String操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间。
String是不可变的,即一旦一个String对象被创建以后,包含在这个对象中的字符串序列是不可改变的,直至这个对象被销毁;重新赋值后,并不是对原来堆中实例对象进行重新赋值,而是生成一个新的实例对象,之前的实例对象仍然存在,如果没有被再次引用,则会被垃圾回收。
StringBuffer:StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象,每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。
线程安全的,多线程操作字符串。
StringBuilder:可变类,速度更快,线程不安全,单线程操作字符串。
运行速度比较:StringBuilder>StringBuffer>String。
如果要操作少量的数据用String,多线程操作字符串缓冲区下操作大量数据StringBuffer,单线程操作字符串缓冲区下操作大量数据StringBuilder。
4、什么是线程安全的,什么是线程不安全的
线程安全:指的是多个线程在执行同一段代码的时候采用加锁机制,使每次的执行结果和单线程执行的结果是一样的,不存在执行线程时出现意外结果。
线程不安全:是指不提供加锁保护机制,有可能出现多个线程先后更改数据造成所得到的的数据是脏数据。
线程安全是编程中的术语,指某个函数,函数库在并发环境中被调用时,能够正确处理多个线程之间的共享变量,使程序功能正确完成。
5、ArrayList 和 LinkedList 有什么区别
数据结构不同,ArrayList是Array(动态数组)的数据结构,LinkedList是Link(链表)的数据结构,当ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动,代价比较高,适合随机查找和遍历,不适合插入和删除。LinkedList适合数据的动态插入和删除,随机访问和遍历速度比较慢,另外,它还提供了List接口中没有定义的方法,专门操作表头和表位元素,可以当作堆栈、队列和双向队列使用。
6、讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函 数,字段,当 new 的时候,他们的执行顺序。
父类静态变量-父类静态代码块-子类静态变量-子类静态代码块-父类非静态变量(父类实例成员变量)-父类构造函数-子类非静态变量(子类实例成员变量)-子类构造函数。
7、用过哪些 Map 类,都有什么区别,HashMap 是线程安全的吗,并发下使用的 Map 是什 么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。
HashMap根据键的hashCode值存储数据,非线程安全,如果需要满足线程安全,可以用Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap;HashMap最多只允许一条记录的键为null,允许多条记录的值为null;HashMap里面是一个数组,然后数组中每个元素是一个单向链表,每个元素是嵌套类Entry的实例,Entry包含四个属性:key,value,hash值和用于单向链表的next
capacity:当前数组容量,始终保持2^n,可以扩容,扩容猴数组大小为当前的2倍
loadFactor:负载因子,默认为0.75
threshold:扩容的阈值,等于capacity*loadFactor
java8对HashMap进行了一些修改,最大的不同就是利用了红黑树,所以其由数组+链表+红黑树组成。
ConcurrentHashMap支持并发操作,整个ConcurrentHashMap由一个个Segment分段锁组成,Segment通过继承ReentrantLock来进行加锁,实现线程安全,并行度默认是16。
HashTable继承自Dictionaryl类,线程安全的,不允许记录的键或值为空,支持线程的同步,即任一时刻只有一个线程能写HashTable,因此也导致了HashTable在写入时会比较慢。
TreeMap实现SortedMap接口,能够把保存的记录根据键排序,默认是按键值的升序排序,当用Iterator遍历TreeMap时,得到的记录是排过序的。
LinkHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。一般在遍历的时候会比HashMap慢。