JAVA部分:
//jdk、jre、jvm三者的关系是什么?
1.jdk是整个Java的核心,包含了jre、Java开发工具和Java基础类库;
2.jre是Java运行时环境,包含了jvm和Java核心类库;
3.jvm是Java虚拟机,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,它是整个Java
实现跨平台运行的最核心的部分,能够运行以Java语言写的程序。
//jvm由哪些部分组成(基础)?
jvm由类装载器、执行引擎、运行时数据区组成。
参考:https://blog.csdn.net/know9163/article/details/80574488
//堆和栈的区别?
1.栈:存放所有局部变量(基本数据类型变量和对象的引用变量);(线程私有的)
2.堆:存放new出来的对象和数组以及全局变量;(线程共有;堆中所有的实体都有内存地址值,栈内存中的引用通过地址值指向该地址)
//方法区?
1.方法区同堆一样,是jvm中一块内存区域,且线程共享;
2.方法区用来存储类信息、常量、静态变量(类变量)、方法。
参考:Java方法区、栈及堆_非丨空的博客-CSDN博客_java方法区
//常量池?
1.静态常量池:class文件中的常量池,包括两种常量,字面量和符号引用,字面量比较接近Java语言层面的常量,也就是我们
常提到的常量,如static final String str= “常量”,符号引用则是编译层面的概念,包括三类常量:类和接口的全限定名,字段
的名称和描述符,方法的名称和描述符
2.运行时常量池,属于方法区的一部分,class文件常量池中的字面量和符号引用在类加载完成进入方法区后被存到运行时
常量池中,运行时常量池具有动态性,Java允许编译期常量池的内容进入运行时常量池,运行时产生的常量也可放入池中,
如String的intern方法(调用intern方法,编译器会将字符串添加到常量池中,并返回指向该常量的引用)
3.注意:常量池是介于栈和堆外的另一种独立的内存管理空间,相同内容常量池中永远只有一份,基本数据类型、对象的引用
都存在栈中,执行速度快;包装类型,对象存储,new出来的对象都是存储在堆中,Byte,Short,Integer,Long,Character这5
种整型的包装类只是在对应值小于等于127时才可使用对象池。超过了就会自动申请空间创建对象。而String是个较为特殊的
包装类型,直接用=“”创建的数据是存放在常量池,且无论数据大小都不会申请空间创建,除非使用new关键字。
//静态变量(类变量)-->静态代码块-->构造代码块(按运行顺序排列)
1.静态变量(类变量)在类加载时被调用;
2.静态代码块构在类加载时被调用;
3.构造代码块在每次创建对象时被调用;
参考:构造代码块与静态代码块(静态初始化块)_非丨空的博客-CSDN博客
//守护线程与非守护线程?
1.守护线程指为其他线程服务的线程,非守护线程又叫用户线程
2.当所有非守护线程结束后,无论有没有守护线程,jvm都会自动退出;
3.可在start()
方法前,调用setDaemon(true)开启一个守护线程。
//int和integer的区别?
1.integer是int的包装类,int是基本数据类型;
2.integer需要实例化后才能使用,int可以直接使用;integer的默认值为null,int的默认值为零;
3.当new一个Integer integer时,integer实际上是Integer对象的引用,存在栈中,然后堆内存中会生成一个integer对象,并分
配一个地址,由integer指向该地址;而int则是直接存储数据值。
//==和equals的区别?
1.==比较的是基本数据类型的值是否相等、引用类型变量的地址是否相等;
2.equals属于object方法,默认情况下等同于==;重写情况下,如String方法的equals,比较的是字符串内容是否相同。
//hashCode?
hashCode()是object中的方法,返回的是一个对象地址的哈希值,同一个对象的哈希码一定相等,不同对象的哈希码也有可能
相等,并且默认如下规则:
1.两个对象equals,hashCode一定相等;
2.两个对象不equals,hashCode有可能相等;
3.两个对象hashCode相等,不一定equals;
4.两个对象hashCode不相等,一定不equals;
由此:如果重写equals方法,也需要重写hashCode方法
//多态?
1.实现多态的三个条件是继承、重写、父类引用指向子类对象;
2.父类引用指向子类对象,指声明是父类,实际指向的是一个子类的对象;
3.简单描述就是:在实际执行期间判断所指向对象的实际类型,根据其实际类型调用其相应的方法。
4.增强类型扩展性,降低类型之间耦合,利于维护。
//内部类
1.定义:把定义在另一个类的内部的类叫做该类的内部类;
2.访问规则:内部类可以直接访问外部类的成员变量,包括私有成员变量;外部类访问内部类必须创建对象;
3.分类:成员内部类,可以使用外部类中所有的成员变量和成员方法;常用修饰符private;
创建对象时:
//成员内部类不是静态的:
外部类名.内部类名 对象名 = new 外部类名.new 内部类名();
//成员内部类是静态的:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
成员内部类经典题(填空),请在三个println 后括号中填空使得输出25,20,18
class Outer {
public int age = 18;
class Inner {
public int age = 20;
public viod showAge() {
int age = 25;
System.out.println(age);//空1
System.out.println(this.age);//空2
System.out.println(Outer.this.age);//空3
}
}
}
局部内部类,定义在一个方法或作用域里面的类;局部内部类访问局部变量需要加final修饰;
静态内部类,使用static 修饰的内部类(一般类不能使用static进行修饰);
不能直接使用外部类的非静态成员变量和成员方法,必须使用对象调用;
非静态内部类会隐式的持有外部类的引用;
匿名内部类,使用new 类名或接口的方式创建的类叫做匿名内部类,是内部类的简化写法,本质是继承该类或实现接
口的子类匿名对象;
4.使用内部类的原因:
封装性;
实现多继承;
匿名内部类实现回调;
解决继承和实现接口出现同名方法的问题。
参考:java内部类有什么作用? - 知乎
//多线程
1.开启方式:继承Thread类和实现runnable接口,区别:runnable是数据共享的,Thread数据不共享;
2.常用方法:sleep()---start()---不需要手动唤醒,不释放对象锁;wait()---notify()、notifyAll()---需要notify唤醒,释放对象锁,需要在同步代码块中执行;
3.线程池:
corePoolSize: 线程池中核心线程的数量。
maximumPoolSize:线程池中最大线程数量。
keepAliveTime:非核心线程的超时时长,当系统中非核心线程闲置时间超过keepAliveTime之后,则会被回收。如果ThreadPoolExecutor的allowCoreThreadTimeOut属性设置为true,则该参数也表示核心线程的超时时长。
unit:keepAliveTime这个参数的单位,有纳秒、微秒、毫秒、秒、分、时、天等。
workQueue:线程池中的任务队列,该队列主要用来存储已经被提交但是尚未执行的任务。存储在这里的任务是由ThreadPoolExecutor的execute方法提交来的。
threadFactory:为线程池提供创建新线程的功能,