1、说一下Java中的8种基本数据类型
- java八种基本数据类型分为四类八种,四类分别为整型、浮点型、布尔型、字符型;八种分别为byte、short、int、long、float、double、boolean、char;
- java八种基本数据类型的字节数:分别为1、2、4、8个字节;1字节(byte、boolean)、 2字节(short、char)、4字节(int、float)、8字节(long、double);
- 整数的默认类型为int,浮点数的默认类型为double;
- 八种基本数据类型的包装类:除了char的是Character、int类型的是Integer,其他都是首字母大写
关于值的范围问题,需要注意char类型是无符号的,不能为负,所以是0开始的;
2、基本数据类型和string有什么区别?
(1)从存储位置上来说:
基本数据类型存储在栈区,String属于对象类型存储在堆区。
(2)从参数传递方面来说:
基本数据类型采用的是值传递,而String采用的是引用传递。
不过由于String内部实现采用了final关键字,这就导致对于String的每次更改都是在创建新的String对象,所以如果一个函数对传进来的String类型做了更改实际上是不会影响到传进来前的String对象的值得。
3、说一下jvm并且对各个部分进行一下解释和自己的理解;
程序计数器:当前线程所执行的字节码的行号指示器,用于记录正在执行的虚拟机字节指令地址,线程私有。
Java虚拟栈:存放基本数据类型、对象的引用、方法出口等,线程私有。
Native方法栈:和虚拟栈相似,只不过它服务于Native方法,线程私有。
Java堆:java内存最大的一块,所有对象实例、数组都存放在java堆,GC回收的地方,线程共享。
方法区:存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码数据等。(即永久带),回收目标主要是常量池的回收和类型的卸载,各线程共享
- Java堆 = 老年代 + 新生代
- 新生代 = Eden + S0 + S1
- 当 Eden 区的空间满了, Java虚拟机会触发一次 Minor GC,以收集新生代的垃圾,存活下来的对象,则会转移到 Survivor区。
- 大对象(需要大量连续内存空间的Java对象,如那种很长的字符串)直接进入老年态;
- 如果对象在Eden出生,并经过第一次Minor GC后仍然存活,并且被Survivor容纳的话,年龄设为1,每熬过一次Minor GC,年龄+1,若年龄超过一定限制(15),则被晋升到老年态。即长期存活的对象进入老年态。
- 老年代满了而无法容纳更多的对象,Minor GC 之后通常就会进行Full GC,Full GC 清理整个内存堆 – 包括年轻代和年老代。
- Major GC 发生在老年代的GC,清理老年区,经常会伴随至少一次Minor GC,比Minor GC慢10倍以上。
5、hashmap和hashtable的区别解释一下
(1).继承父类不同
Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类;但二者都实现了Map接口。
(2)线程的安全性
- 1. HashTable是同步(方法中使用了Synchronize)的;而HashMap是未同步(方法中缺省Synchronize)的。
- 2.Hashtable 线程安全,因为它每个方法中都加入了Synchronize,在多线程并发的环境下,可以直接使用Hashtable,不需自己在加同步;
- HashMap线程不安全,因为HashMap底层是一个Entry数组,当发生hashmap冲突的时候,hashmap是采用链表的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入。
(3)是否有contains方法
- 1.HashTable有一个contains(Object value)方法,功能和containsValue方法(Object value)功能一样。
- 2.HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。
(4)可否允许有null值
key、value都是对象,但是不能拥有重复key值,value值可以重复出现。
- 1.Hashtable中,key和value都不允许出现null值。
- 2.HashMap允许null值(key和value都可以),因为在HashMap中null可以作为健,而它对应的值可以有 多个null。
(5)遍历方式内部实现不同
1.HashTable使用Enumeration,HashMap使用Iterator。
(6)hash值不一样
1.HashTable直接使用对象的hashCode,如下:
//hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
2.HashMap要重新计算key值和hash值,如下:
复制代码
int hash = hash(k);
int i = indexFor(hash, table.length);
static int hash(Object x) {
int h = x.hashCode();
h += ~(h << 9);
h ^= (h >>> 14);
h += (h << 4);
h ^= (h >>> 10);
return h;
}
static int indexFor(int h, int length) {
return h & (length-1);
}
(7)数组初始化和扩容不同
- 1.HashTable中hash数组默认大小是11,增加的方式是 arr*2+1。
- 2.HashMap中hash数组的默认大小是16,而且一定是2的指数。
6、抽象类和接口
接口和抽象类 是java面向对象设计的两个基础机制;
接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到api定义和实现分离的目的;接口不能实例化;不能包含任何非常量成员;同时没有非静态方法的实现,也就是说要么都是抽象方法,要么是静态方法。java标准类库中,定义了非常多的接口,比如java.util.List
抽象类是不能被实例化的类,使用abstract关键字修饰class,其目的主要是代码重用,除了不能实例化,形式上和一般的java类并没有太大的区别,可以有一个或者多个抽象方法,也可以没有抽象方案,抽象类大多数用户抽取相关的java类的共用方法实现或者共同的成员变量,然后通过继承的方式达到代码重用的目的java标准库中,比如collection 框架,很多通用部分就被抽取成为抽象类,例如:java.util.AbstractList
java类实现interface 使用implement关键词,继承abstract class 则是使用extends关键词。
接口和抽象类有什么区别? - 产品哥的回答 - 知乎 https://www.zhihu.com/question/20149818/answer/153188511
7、多线程:synchronize和lock的作用是什么
8、多个线程同时读一个数组的数据需要加锁吗?假如有别的线程需要修改数组数据,不加锁会怎样
那么问题来了,多线程执行程序一定比单线程快吗?答案是不一定。
1.多线程增大了CPU上下文切换的开销,会导致程序执行变慢
2.若同步不当,会有死锁的后果,导致程序瘫痪
9、类的属性(其实就是面向对象的特性)
10、String、StringBuilder和StringBuffer的区别
String 是java语言非常基础和重要的类,提供了构造和管理字符串的各种基本逻辑,它是典型的Immutable类,被声明成为final calss,所有的属性也都是final的,也由于它的不可变性,类似拼接,裁剪字符串等动作,都会产生新的String对象,由于字符串的普遍性,所以相关操作的效率往往对应用性能有明显的影响。
StringBuffer是为解决上面提到拼接产生太多中间对象的问题而提供的一个类,我们可以用append或者add的方法,把字符串添加到已有序列的末尾或者指定位置,StringBuffer本质上是一个线程安全的可修改的字符序列,它保证了线程安全,也随之带来了额外的性能开销,所以除非有线程安全的需要,不然还是推荐使用它的后继者,StringBuilder.
StringBuilder 是java1.5中新增的,在能力上和StringBuffer没有本质区别,但是它去掉了线程安全的部分,有效减少了开销,是绝大部分情况下进行字符串拼接的首选。
常考基础:
- Java中的int和Integer
int是我们常说的整形数字,是java的8个原始数据类型(byte、short、int、long、boolean、char、float、double)之一,java语言虽然号称一切都是对象,但是原始数据类型是例外。
Integer 是int对应的包装类,它有一个int类型的字段存储数据,并且提供了基本操作,比如数学运算,int和字符串之间的转换等,在java5中引入了自动装箱和自动拆箱功能,java可以根据上下文,自动进行转换,极大地简化了相关编程。
关于Integer 的值缓存,这涉及到java5中另外一个改进,构建Interger对象的传统方式是直接调用构造器,直接new一个对象,但是根据实践,我们发现大部分数据操作都是集中在有限的,较小的数值范围,因而,在java5中新增了静态工厂方法valueOf,在调用它的时候会利用一个缓存机制,带来了明显的性能改进,按照Javadoc,这个值默认缓存是-128到127之间。
深入加强:
- jvm组成、GC调优;垃圾处理器 和垃圾清除算法
- 双亲委派机制 、类加载过程
- 多线程、并发相关(常问,加分项,小编直接说不太会)
- 强引用、软引用、弱引用、幻想引用的区别
- 知道哪些设计模式,手写单例等
- Spring 相关,ioc 、 aop的理解