1.java基本数据类型:8种
四种整数类型(byte、short、int、long):
byte:8 位,用于表示最小数据单位,如文件中数据,-128~127
short:16 位,很少用,-32768 ~ 32767
int:32 位、最常用,-2^31-1~2^31 (21 亿)
long:64 位、次常用 注意事项: int i=5; // 5 叫直接量(或字面量),即 直接写出的常数。 整数字面量默认都为 int 类型, 所以在定义的 long 型数据后面加 L或 l。
两种浮点数类型(float、double):
float:32 位,后缀 F 或 f,1 位符号位,8 位指数,23 位有效尾数。
double:64 位,最常用,后缀 D 或 d,1 位符号位,11 位指数,52 位有效尾
一种字符类型(char):
char:16 位,是整数类型,用单引号括起来的 1 个字符(可以是一个中文字符),使用 Unicode 码代表字符,0~2^16-1 (65535) 。 注意事项: 不能为 0个字符。
一种布尔类型(boolean):
boolean:true 真 和 false 假。
2.JDK、JRE、JVM关系是什么?
JDK:(Java Development Kit):Java开发工具包,包含编写Java程序所必须的编译、运行等开发工具以及JRE。
JRE:(Java Runtime Environment)即为Java运行环境,提供了运行Java应用程序所必须的软件环境,包含有Java虚拟机(JVM)
和丰富的系统类库。
JVM:(Java Virtual Machines)即为Java虚拟机,提供了字节码文件(.class)的运行环境支持。
关系:JDK包含JRE包含JVM。
3.javac:是java语言编程编译器。
全称java compiler。将java文件编译成字节代码的class文件。
4.面向对象的四大基本特性:
(1)抽象
(2)封装
(3)继承
(4)多态
5.列举几个常见的java的设计模式
工厂模式
抽象工厂模式
单例模式
原型模式
享元模式
策略模式
观察者模式
装饰者模式
桥接模式
组合模式
职责链模式
6.重写(Overriding)和重载(Overloading)的区别?
重写:子类重新定义了父类的方法。方法重写必须有相同的方法名,参数列表和返回类型。
重载:发生在同一个类里面多个方法的方法名相同但是参数列表不同。
7.接口和抽象类的区别是什么?
(1)一个类可以实现多个接口,但是只能继承一个抽象类。
(2)抽象类可以有自己的方法,而接口不能,抽象类中可以包含静态方法,接口内不能包含静态方法。
(3)抽象类里可以有构造方法,而接口内不能有构造方法。
(4)抽象类中的抽象方法的访问类型可以是public ,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为
public abstract类型。
8.15.用最有效率的方法计算2乘以8?
答: 2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。
9.Java8新特性
(1)实现了函数式编程
(2)封装了多线程
(3)流式处理 Streams
10.HashMap与HashTable有什么区别?
11.多线程的实现方式
12.线程的生命周期(5种状态):
(1)新建(New)
(2)就绪(Runnable)
(3)运行(Running)
(4)阻塞(Blocked)
(5)死亡(Dead)
13.List、Set、Map三种集合的区别https://www.cnblogs.com/IvesHe/p/6108933.html
List:1.可以有重复的对象。
2.可以插入多个空值。
3.是有序的,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
常用的实现类有:
ArrayList:的底层是一个object数组,所以是有序的,查找块,增删比较慢,
LinkedList:底层是以链表的形式进行排序的。
Vector:是线程安全的(线程同步的),而arralist线程是异步的也就是说他是不安全的,效率比arralist低
Set: 1.不允许有重复的对象
2. 是无序的,无法保证每个元素的存储顺序,但是TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。
这里的无序是针对放入顺序而言
3. 只允许有一个空值
实现类是:
HashSet:的底层是hashmap,他有着hashmap中键的特性,那就是,无序,不可重复性,和hashmap的区别:hashset键值都不允许重复
TreeSet:实现了sortset接口,sortedset有排序能力,也就意味着treeset也有着排序的能力,他是使用二叉树进行排序的。
14.如何实现多线程?
多线程实现的四种方式:https://blog.csdn.net/u011480603/article/details/75332435
1.继承Thread类,重写run方法
2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target
3.通过Callable和FutureTask创建线程
4.通过线程池创建线程
15.父类与子类之间的调用顺序(打印结果)
a) 父类静态代码块
b) 子类静态代码块
c) 父类构造方法
d) 子类构造方法
e) 子类普通方法
f) 重写父类的方法,则打印重写后的方法
16.是否可以继承String类?
String 类是final类,不可以被继承。
17.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java语言的方法调用只支持参数的值传递。
16.String和StringBuilder、StringBuffer的区别
String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,
StringBuilder和StringBuffer是变量,是可以更改的。
StringBuilder是线程不安全的,而StringBuffer是线程安全的
运行速度:StringBuilder > StringBuffer > String
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
17.int和integer的区别
1、Integer是int的包装类,int则是java的一种基本数据类型
2、Integer变量必须实例化后才能使用,而int变量不需要
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
4、Integer的默认值是null,int的默认值是0
18.接口、抽象类、实体类之间的继承和实现关系
1.接口是否可继承接口?
接口是可以继承接口的:定义一个泛型接口,然后让其他接口去继承它并定义各自的泛型类,这样就方便很多。
2.抽象类是否可实现(implements)接口?
抽象类可以实现接口:抽象类可以有自己的方法实现,所以可以继承接口
3.抽象类是否可继承实体类(concrete class)?
抽象类可以继承实体类,但前提是实体类必须有明确的构造函数。
Object就是个实体类,每个抽象类的条目里都明确写着直接或间接继承自Object。
19. sleep 方法和 wait 方法的区别?
两者都是用来暂停当前运行的线程,sleep()不会释放锁,而 wait() 要释放锁。
20.数组实例化有几种方式?
1.静态实例化:创建数组的时候已经指定数组中的元素
2.动态实例化:实例化数组的时候,只指定了数组长度,数组中所有元素都是数组类型的默认值
21.equals和==的区别?
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。
equals用来比较的是两个对象的内容(值)是否相等
22.如何将字符串反转?
Stringbuilder或者stringbuffer的reverse方法
23.uper与this表示什么?
Super表示当前类的父类对象This表示当前类的对象
大题:
1.手写单例模式(饿汉和饱汉模式)和工厂模式?
第一种:饱汉模式
public class SingleTon {
//将构造函数私有化
private SingleTon(){
}
//实例化放在静态代码块里可提高程序的执行效率,但也可能更占用空间
private final static SingleTon instance = new SingleTon();
public static SingleTon getInstance(){
return instance;
}
}
第二种:饥汉模式
public class SingleTon {
//将构造函数私有化
private SingleTon(){
}
private static instance = null;//new SingleTon();
public static synchronized SingleTon getInstance(){
if(instance == null){
instance = new SingleTon();
}
return instance;
}
}
2.try里有return,若是finally里面有代码会不会执行?什么时候执行?
会执行,在return之前执行
int x = 1;
try {
return x;
}catch (Exception e) {
// TODO: handle exception
}finally {
x+=1;
System.out.println(x);
}
此时输出的x为2
3.冒泡排序
public static void bubbleSort(int []arr) {
for(int i =0;i<arr.length-1;i++) {
for(int j=0;j<arr.length-i-1;j++) {//-1为了防止溢出
if(arr[j]>arr[j+1]) {
int temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
4.mysql级联查询:https://blog.csdn.net/qymufeng/article/details/80934378
5.关于String s = new String("xyz"); 创建几个对象的问题
https://www.cnblogs.com/dangzhenjiuhao/p/4585389.html
6.设计四个线程,其中共两个线程每次对j增加1,另外两个线程每次对j减少1。循环100次,写出程序。
https://blog.csdn.net/ankeyuan/article/details/39671979
7.几个数字的全排列:https://blog.csdn.net/aijiaoxiaodetuzi/article/details/70312437
public static void permutateSequence(char[] strArrs,int i){
char temp;
if(strArrs==null||i>strArrs.length||i<0){
return;
}
else if(i==strArrs.length){
System.out.println(strArrs);
}
else{
for(int j=i;j<strArrs.length;j++){
//交换位置
temp = strArrs[j];//
strArrs[j] = strArrs[i];
strArrs[i] = temp;
//后续元素递归全排列
permutateSequence(strArrs, i+1);
//还原成原来的数组,便于下一次的全排列
temp = strArrs[j];
strArrs[j] = strArrs[i];
strArrs[i] = temp;
}
}
}