java基础
1.jdk、jre、jvm
jdk:java开发工具包,提供java开发环境和java运行环境,包含了jre和javac编译器以及Javadoc等工具
jre:java运行时环境,为java运行提供所需环境,包括jvm、java类库,java命令的基础构件。
jvm:java虚拟机,可以运行java字节码文件,针对不同的操作系统有不同的实现,目的是为了使用相同的字节码文件,给出相同的结果,是java一次编译,随处运行的关键。
2.java语言的特点:
简单易学,面向对象,平台无关,可靠,安全,支持多线程,支持网络编程,编译与解释并存。
##3.面向对象和面向过程的区别:
面向过程:面向过程的性能要高于面向对象
面向对象:面向对象易维护,易复用,易扩展。面向对象中的封装、继承、多态、抽象的特性,可以设计出耦合性较低的程序
4.字符常量和字符串常量
形式上:字符常量为’’引起的单个字符,字符串常量是””引起的多个字符
含义上:字符常量相当于一个整型值(ASCII),可以进行运算,字符串常量代表一个内存地址,占两个字节
5.构造器Constructor是否可以被override?
构造器constructor不能被override(重写),只能被重载
6.重载和重写的区别
重载:发生在同一个类中,方法名必须相同,参数类型、个数、顺序不能相同,与方法的返回值和修饰符无关
重写:子类对父类中允许访问的方法进行重新编写,发生在子类中;方法名、参数列表必须相同,返回值和抛出的异常的范围小于等于父类,访问修饰符范围大于等于父类。方法的重写只改变行为,不改变外貌。
7.java面向对象的三大特性
封装、继承、多态、(抽象)
封装:将属性私有化,提供方法供外部访问
继承:使用已有的类为基础创建新类,新的子类拥有父类的所有属性和方法,但父类的私有属性和方法子类不能够访问,只是拥有;子类可以增加自己的属性和方法,对父类进行扩展,子类也可以重写父类的方法。
多态:程序中定义的引用变量所指向的具体类型对象,在调用方法时,不能够确定用哪个类的方法,是由程序运行期间才能决定。实现多态的方式:继承(多个子类对同一方法重写)和接口(接口中的方法);向上转型:父类引用指向子类对象(减少重复代码,提高系统扩展性);向下转型:前提父类对象引用指向子类对象,向下转型只能转型为本类对象。
8.String、StringBuffer、StringBuilder的区别
String类中使用final关键字修饰字符数组来保存字符串,因此String是不可变的
StringBuffer和StringBuilder都继承自AbstractStringBuilder类,在AbstractStringBuilder类中也使用字符数组来修饰字符串,但没有使用final关键字修饰,因此是可变的。
String中的对象是不可变的,相当于是个常量,线程安全。AbstractStringBuilder定义了一些字符串基本操作:append、insert、indexof等公共方法,StringBuffer对方法加了同步锁,线程安全。StringBuilder非线程安全。
String每次修改都会生成一个新的String对象。StringBuffer的性能较低于StringBuilder。
9.自动拆箱与装箱
装箱:将基本类型用它们对应的引用类型包装起来。
拆箱:将包装类型转换为基本数据类型
10.在一个静态方法内调用一个非静态成员为什么是非法的
静态方法可以不通过对象进行调用,在对象实例化前就已经加入内存中。
11.java中一个不做事且没有参数的构造方法的作用
java程序在执行子类的构造函数之前会先用super()方法初始化父类,如果父类中只定义了有参构造函数,没有定义无参构造函数且子类调用super()方法是,也没有传参,就会发生错误(编译时)
12.接口和抽象类的区别
接口中的方法不能有实现,抽象类可以有非抽象方法
接口中除了static、final变量,不能有其他变量,抽象类不一定
一个类可以通过implements实现多个接口,但只能通过extends继承一个抽象类,接口也可以使用extends关键字进行扩展接口
接口中的方法默认访问修饰符为public,抽象类可以有public、protected、default修饰
抽象是对类的抽象是一种模板设计,接口是对行为的抽象,是一种规范。
13.抽象类能使用final修饰吗?
不能;定义抽象类就是让其他类继承的,如果定义为final该类就不能被继承,这样就产生了矛盾。
14.成员变量和局部变量的区别
成员变量属于类中的变量,局部变量是定义在方法或者方法的参数。
成员变量可以被public、private、static、final等修饰符修饰,局部变量不能被访问控制修饰符和static修饰,但可以被final修饰。
如果成员变量被static所修饰,那么它属于类变量;如果没有被static所修饰,它属于对象;对象存在堆中,局部变量存在栈内存中。
成员变量随着对象的创建而存在,局部变量随着方法的调用而存在。
15.创建一个对象用什么运算符?对象实体和对象引用有什么不同?
创建一个对象使用new进行创建;对象引用指向对象实体,一个对象引用只能指向一个或零个对象实体,而一个对象实体可以被n个对象应用所指向。
16.什么是方法的返回值?返回值在类的方法里的作用是什么?
方法的返回值是某个方法执行后所产生的结果,返回值的作用是获取产生的结果,以便于进行其他操作。
17.一个类的构造方法的作用是什么?若一个类没有声明构造方法,该程序能不能正确执行
类的构造方法是为了初始化对象,每个类都有一个默认的无参构造函数。
18.静态方法和实例方法有何不同
静态方法属于类方法,可以使用类名.方法名调用,也可以使用对象名.方法名调用;但实例方法只能使用对象名.方法名调用;静态方法只能访问静态成员和方法,实例方法都可以访问。
19.对象的相等和他们的引用相等,两者有什么不同?
对象的相等比较的是对象的内容是否相等,引用相等比较的是内存地址是否相等。
20.调用子类构造方法之前会先调用父类没有参数的构造方法的目的
帮助子类完成初始化工作
21.==与equals
==:引用数据类型:判断两个对象的内存地址是否相等;基本数据类型:判断的是值是否相等
equals:默认情况下比较的是引用,如果重写了equals方法一般比较的是内容是否相等;如果没有重写equals方法,则相当于==。
22.final关键字的作用
final修饰的类叫最终类,该类不能被继承,final类中的方法都会隐式的指定为final方法
final修饰的属性常量,常量必须初始化,初始化之后不能进行修改(基本类型不能改变数值,引用类型不能指向写的对象)
final修饰的方法不能被重写
private方法都隐式的指定为final修饰
23.常见关键字
static:可以修饰成员变量,方法,常量,代码块;静态成员是全局的,归类所有,不依赖特定的对象,被所有的类对象所共享;只要类被加载,就可以使用类名进行调用。
同一个类的一个方法调用另一个方法时,如果被调用方法为普通方法,默认用this作为顶用者,如果别调用的方法是静态方法,则默认使用类作为调用者。
没有static修饰的方法属于该类的对象,不属于这个类的本身,因为没有static修饰的方法只能使用对象作为调用者,不能使用类作为调用者
this:this方法总是指向调用该方法的对象;this可以代表任何对象,当this出现在某个方法体中时,它代表的对象是不确定的,但它的类型是确定的,他所代表的是当前类的实例。
super:可以用来调用直接父类中的属性、方法、构造方法;
24.如何将字符串反转
使用StringBuilder或者StringBuffer的reverse()方法
25.String类中常用方法
indexOf():返回指定字符串的索引
charAt():返回指定索引处的字符
replace():字符串替换
trim():去除字符串两端的空格
length():返回字符串长度
subString():截取字符串
split():分割字符串,返回一个字符串类型数组
equals():字符串比较
isEmpty():判断是否为空
compareTo():比较两个字符串
toCharArray():返回一个char数组
getBytes():返回一个byte类型数组
26.hashCode与equals
hashCode()方法的作用是获取哈希码,返回一个int类型的整数。哈希码的作用是确定该对象在哈希表中的索引位置。
equals判断两个对象是否相等,如果未重写equals方法则比较的是引用是否相同。
相关规定:如果两个对象相等,则hashCode()一定也相等;两个对象相等,对两个对象分别调用equals方法都返回为true;两个对象的hashCode值相等,它们不一定相等;equals方法被覆盖时,hashCode方法也必须被覆盖;hashCode()默认行为是对堆上的对象产生独特值,如果没有重写hashcode(),该Class对象无论如何都不会相等(即使这两个对象指向相同的数据)
HashSet()中存储自定义对象时,HashMap中键为自定义对象时,需要重写equals和hashCode方法;HashSet底层为HashMap实现set接口,HashMap底层是数组+链表+红黑树;元素添加时需要获取hash值判断该对象的索引位置,如果该索引处有元素存在,会调用equals方法进行判断,如果相同就不会添加,如果不同就会添加到最后。
线程
1.何为进程
进程是程序的一次执行过程,是系统运行程序的基本单位,进程是动态的;系统运行一个程序即是一个进程从创建、运行到消亡的过程。
java中,启动main函数时其实就是启动了一个jvm的进程,而main函数所在的线程就是这个进程中的一个线程,也称主线程。
2.何为线程
线程与进程相似,但线程是一个比进程更小的执行单位,一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比进程小得多。线程也被称为轻量级进程。
3.线程、进程、程序的基本概念
线程与进程相似,但线程是一个比进程更小的执行单位;一个进程的执行过程中可以产生多个线程。同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程或是各个线程之间切换工作时,负担要比进程小得多,线程也被称为轻量级进程。
进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的,系统运行一个程序即是一个进程从创建运行到消亡的过程。
程序是含有指令和数据文件,被存储在磁盘或其他的数据存储设备中;程序是静态的代码
一个进程是一个执行中的程序,他在计算机中一个指令接着一个指令地执行,同时每个进程还占某些系统资源(CPU时间,内存空间,文件,输入输出设备的使用权等等)。线程是进程划分成的更小的运行单位,线程和进程的最大的不同在于基本上各进程是独立的,而线程不一定,因为同一进程中的线程极有可能会相互影响。
进程属于操作系统范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。
4.线程有哪些基本状态
| 状态 | 状态 | 描述 |
|---|---|---|
| NEW | 初始状态 | 线程被构建,但是还没有调用start()方法 |
| RUNNABLE | 运行状态 | java线程将操作系统中的就绪和运行两种状态,统称为“运行中” |
| BLOCKED | 阻塞状态 | 线程阻塞于锁 |
| WATING | 等待状态 | 线程进入等待状态,进入该状态表示当前线程需要等待其他线程做出一些特定动作(通知或中断) |
| TIME_WATING | 超时等待状态 | 该状态不同于WATING,它是可以在指定的时间自行返回的 |
| TERMINATED | 终止状态 | 表示当前线程已经执行完毕 |
线程在声明周期中并不是固定处于某一状态而是随着代码的执行在不同状态之间切换