文章目录
- 1、访问修饰符public,private,protected,以及不写(默认)时的区别?
- 2、面向对象的特征有哪些方面?
- 3、java8中基本类型
- **4、数据类型转换**
- **5、&和&&的区别?**
- **6、jvm模型**
- **7、switch可用变量**
- **8、用最有效率的方法计算2乘以8**
- **9、在Java中,如何跳出当前的多重嵌套循环?**
- **10、构造器(constructor)是否可被重写(override)?**
- **11、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?**
- **12、是否可以继承String类?**
- **13、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?**
- **14、String和StringBuilder、StringBuffer的区别?**
- **15、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?**
- **16、描述一下JVM加载class文件的原理机制?**
- **17、char 型变量中能不能存贮一个中文汉字,为什么?**
- **18、阐述final、finally、finalize的区别**
- **19、Java中如何实现序列化,有什么意义**
- **20、JSP中的四种作用域**
- 22、面向对象设计原则
- 23、Object 类包含哪些方法?
- **24、java四种引用**
- **25、java类初始化执行顺序**
- **26、java内部类**
- 27、接口与抽象类的区别
- 28、运行时异常与一般异常有何异同?
- 29、Java 中堆和栈有什么区别?
- 30、可以将 int 强转为 byte 类型吗?如果该值大于 byte 类型的范围,将会出现什么现象?
- 31、a.hashCode() 有什么用?与 a.equals(b) 有什么关系?
- 32、字节流与字符流的区别
1、访问修饰符public,private,protected,以及不写(默认)时的区别?
2、面向对象的特征有哪些方面?
( 1)继承:就是保留父类的属性,开扩新的东西。通过子类可以实现继承,子类继承父类的所有状态和行为,同时添加自身的状态和行为。
(2)封装:就是类的私有化。将代码及处理数据绑定在一起的一种编程机制,该机制保证程序和数据不受外部干扰。
(3)多态:是允许将父对象设置成为和一个和多个它的子对象相等的技术。包括重载和重写。重载为编译时多态,重写是运行时多态。
方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载.
3、java8中基本类型
名称 | 字节数 | 取值范围 |
---|---|---|
byte | 1 | -128~127 |
short | 2 | -32768~32767 |
int | 4 | -231 ~ 231 |
long | 8 | -263 ~ 263 -1 |
float | 4 | -2 |
double | 8 | 双精度、64 位 |
char | 2 | 最小值是 \u0000(即为0);最大值是 \uffff(即为65,535, 216 -1) |
boolean | 1 | false、true |
4、数据类型转换
a.高位转低位需要强制转换
b.低位转高位自动转.
short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
前面一句中,s1 = s1 + 1需要进行强转,写成s1 = (short)(s1 + 1)。
short s1 = 1; s1 = s1 + 1;中,1 是int 型 s1 short型 通过 + 运算后s1 自动转为int 型 所以错!
后面一句没有错是因为Java语言规范中讲到,复合赋值(E1 op=E2)等价于简单赋值(E1=(T)((E1) op (E2))),而(s1 += 1)表达式使用的是复合赋值操作符,复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。
5、&和&&的区别?
当&与&&同为逻辑运算符时,它们都用于连接两个Boolean类型的表达式,当&和&&的两端表达式同时为真时,表达式的结果为真,只要有一端为假,那么表达式结果为假
区别是:
& 无论左边结果是什么,右边还是继续运算;
&&当左边为假,右边不再进行运算。
但是两者的结果是一样的。
&和 | 做位运算符,做二进制位之间的与运算:
比如 6&3=110&011=010=2
6|3=110|011=111=7
6、jvm模型
堆 | 存放对象 | |
方法区 | 所有线程共享的内存区域、存储已被虚拟机加载的类信息、常量、静态变量,常量池是其一部分,字符串就放在常量池中 | |
虚拟机栈 | 描述的是Java方法执行的内存模型 | |
本地方法栈 | 虚拟机使用到的native方法服务,可能底层调用的c或者c++ | |
程序计数器 | 当前线程的行号指示器 |
7、switch可用变量
- char byte short int (包括包装类)
- 不可作用于long double float boolean,包括他们的包装类
- String(jdk1.7之后才可以作用在string上)
- 枚举类
8、用最有效率的方法计算2乘以8
2 << 3 , << 符号规则: m<<n 等价于 M * 2n
9、在Java中,如何跳出当前的多重嵌套循环?
- 外面的循环语句前定义一个标号 里面使用break + 标号,类似goto语法
- 自己定义规则 使用break一层层跳出循环
10、构造器(constructor)是否可被重写(override)?
Constructor(构造器)不能被继承,所以不能被override(重写),但是可以被overloading(重载)。
11、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
答:不对,有相同的 hash code
这是java语言的定义:
- 对象相等则hashCode一定相等;
- hashCode相等对象未必相等
12、是否可以继承String类?
里边有final关键字,所以不能被继承
13、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。
14、String和StringBuilder、StringBuffer的区别?
首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String
String最慢的原因:
String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的
2. 再来说线程安全
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
15、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
- 重载和重写都是多态性的体现,区别是重载是编译时的多态性,重写是运行时的多态性;
- 重载:只发生在一个类中,通过同名方法名不同参数类型或者参数个数来区分
- 重写:发生在父类和子类之间,重写要求子类的重写方法必须和父类被重写方法有相同的返回类型,比父类的方法更好访问,不能比父类被重写的方法声明更多的异常,而重载没有返回类型的特殊要求
- 重载的方法能否根据返回类型进行区分?
不可以,如果用返回类型区分 如果同一个类中public void test1(){}和publiv String test1(){return “”;}(编译不通过)假如编译通过,当提出方法时 类.test1 无法识别调用的是哪个方法
16、描述一下JVM加载class文件的原理机制?
Java的类加载器有三个,对应Java的三种类:(java中的类大致分为三种: 1.系统类 2.扩展类 3.由程序员自定义的类 )
- Bootstrap Loader // 负责加载系统类 (指的是内置类,像是String,对应于C#中的System类和C/C++标准库中的类)
- ExtClassLoader // 负责加载扩展类(就是继承类和实现类)
- AppClassLoader // 负责加载应用类(程序员自定义的类)
加载时先从上面找起 若父加载器找到了目标类 则子加载器不再寻找,意味着与jdk定义一个同名类,那么加载器将只会加载jdk的类
加载步骤:
-
装载:查找和导入class文件;
-
连接:
(1)检查:检查载入的class文件数据的正确性;
(2)准备:为类的静态变量分配存储空间;
(3)解析:将符号引用转换成直接引用(这一步是可选的)
-
初始化:初始化静态变量,静态代码块。
这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动作。
17、char 型变量中能不能存贮一个中文汉字,为什么?
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字, 所以,char型变量中当然可以存储汉字
18、阐述final、finally、finalize的区别
- final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。
- finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
- finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调用System的gc()方法的时候,由垃圾回收器调用finalize(),回收垃圾。
19、Java中如何实现序列化,有什么意义
1.实现序列化:
- 让类实现Serializable接口,该接口是一个标志性接口,标注该类对象是可被序列
- 然后使用一个输出流来构造一个对象输出流并通过writeObect(Obejct)方法就可以将实现对象写出
- 如果需要反序列化,则可以用一个输入流建立对象输入流,然后通过readObeject方法从流中读取对象
2.作用:
4. 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,可以对流化后的对象进行读写操作,也可以将流化后的对象传输与网络之间;
5. 为了解决对象流读写操作时可能引发的问题(如果不进行序列化,可能会存在数据乱序的问题)
6. 序列化除了能够实现对象的持久化之外,还能够用于对象的深度克隆
20、JSP中的四种作用域
page | 只在当前页面有效 |
request | 。一次请求的生命周期从客户端发起到服务器接收并响应该请求,或者将该请求forward到另一个页面或者Servlet进行处理而结束 |
session | 向服务器发送第一个请求开始,只要页面不关闭,或者会话未过期(默认30分钟),或者未调用HttpSession的invalidate()方法,接下来的操作都属于同一次会话的范畴 |
application | 整个Web应用的全局变量 |
21、JSP九大内置对象
1 | out | |
2 | request | |
3 | response | |
4 | session | |
5 | config | ServletConfig |
6 | application | |
7 | exception | |
8 | page | page对象是当前页面转换后的Servlet类的实例 |
9 | pageContext | 页面上下文,该对象主要用于访问JSP之间的共享数据。 |
22、面向对象设计原则
1. **单一职责原则**(Single-Resposibility Principle):一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。
2. **开放封闭原则**(Open-Closed principle):软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。
3. Liskov替换原则(Liskov-Substituion Principle 里式替换):子类必须能够替换其基类。这一思想体现为对继承机制的约束规范,只有子类能够替换基类时,才能保证系统在运行期内识别子类,这是保证继承复用的基础。
4. **依赖倒置原则**(Dependecy-Inversion Principle):依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。
5. **接口隔离原则**(Interface-Segregation Principle):使用多个小的专门的接口,而不要使用一个大的总接口
23、Object 类包含哪些方法?
protected Object clone() throws CloneNotSupportedException | 创建并返回此对象的副本。 |
public boolean equals(Object obj) | 判断另一对象与此对象是否「相等」。 |
protected void finalize() throws Throwable | 当垃圾回收机制确定该对象不再被调用时,垃圾回收器会调用此方法。 |
public final Class getClass() | 返回此对象的运行时类。 |
public int hashCode() | 返回此对象的散列码值。 |
public String toString() | 返回此对象的字符串表示形式。 |
Object 类的 notify,notifyAll 和 wait 方法都在同步程序中独立运行线程的活动方面发挥了作用,这将在后面的课程中讨论,在此不做介绍。其中有五种方法:
public final void notify() | |
public final void notifyAll() | |
public final void wait() | |
public final void wait(long timeout) | |
public final void wait(long timeout, int nanos) |
24、java四种引用
强引用 | 只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象 |
软引用 | 软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象 |
弱引用 | 当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示 |
虚引用 | 在任何时候都可能被垃圾回收器回收,用java.lang.ref.PhantomReference类表示。 |
25、java类初始化执行顺序
class A{
int x = init("A x");
static int Y = st("A static param");
static {
System.out.println("A static");
}
public A() {
System.out.println("A construct");
}
public int init(String name) {
System.out.println(name);
return 0;
}
public static int st(String name) {
System.out.println(name);
return 0;
}
}
class B extends A{
int x = init("B x");
static int Y = st("B static param");
static {
System.out.println("B static");
}
public B() {
System.out.println("B construct");
}
}
执行结果:
A static param
A static
B static param
B static
A x
A construct
B x
B construct
26、java内部类
定义:
- 静态内部类:使用static修饰的内部类
- 方法内部类:定义在方法里的类
- 匿名内部类: 没有名字的方法内部类
- 成员内部类: 成员内部类内部不允许存在任何static变量或方法
public class Demo {
//静态内部类 相当于static修饰的变量 具有static典型特征
static class Inner1{}
// 成员内部类 有类的基本特征 初始化时要先创建外部类 new Demo().new Inner2();
class Inner2{}
// 匿名内部类 使用接口定义类
Runnable Inner3=new Runnable() {
@Override
public void run() {}
};
public static void main(String[] args) {
new Demo().new Inner2();
// 局部内部类 不可以使用private public等权限修饰符修饰
class Inner4{}
}
}
27、接口与抽象类的区别
- 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
- 类可以实现很多个接口,但是只能继承一个抽象类
- 类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
- 抽象类可以在不提供接口方法实现的情况下实现接口。
- Java接口中声明的变量默认都是public static final 的,并且只能是public。抽象类可以包含非final的变量。
- Java接口中的成员函数默认是public abstract ,其他修饰符会报错。抽象类的成员函数可以是private,protected或者是public。
- 接口是绝对抽象的,不可以被实例化,抽象类也不可以被实例化。
- 一个类实现接口的话要实现接口的所有方法,而抽象类不一定
28、运行时异常与一般异常有何异同?
java异常分3大类 Error、Exception、RuntimeException,
- Exception以及子类称为受检异常,编译器强制要求可能抛出这种异常的地方代码必须明确捕获或者继续往外抛,例如IOException、SQLException
- RuntimeException 以及派生于Error类称为运行时异常,编译器不强制要求明文捕获这种异常,也不用往外抛
29、Java 中堆和栈有什么区别?
- 最主要的区别就是栈内存用来存储局部变量和方法调用。
而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。 - 独有还是共享
栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存。
而堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问。 - 异常错误
如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出java.lang.StackOverFlowError。
而如果是堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError。
30、可以将 int 强转为 byte 类型吗?如果该值大于 byte 类型的范围,将会出现什么现象?
ava 中 int 是 32 位的,而 byte 是 8 位的,所以,如果强制转化是,int 类型的高 24 位将会被丢弃,byte 类型的范围是
从 -128 到 128。
31、a.hashCode() 有什么用?与 a.equals(b) 有什么关系?
hashcode()方法提供了对象的hashCode值,是一个native方法,返回的默认值与System.identityHashCode(obj)一致。
通常这个值是对象头部的一部分二进制位组成的数字,具有一定的标识对象的意义存在,但绝不定于地址。
作用是:用一个数字来标识对象。比如在HashMap、HashSet等类似的集合类中,如果用某个对象本身作为Key,即要基于这个对象实现Hash的写入和查找,那么对象本身如何实现这个呢?就是基于hashcode这样一个数字来完成的,只有数字才能完成计算和对比操作。
hashcode是否唯一
hashcode只能说是标识对象,在hash算法中可以将对象相对离散开,这样就可以在查找数据的时候根据这个key快速缩小数据的范围,但hashcode不一定是唯一的,所以hash算法中定位到具体的链表后,需要循环链表,然后通过equals方法来对比Key是否是一样的。
equals与hashcode的关系
equals相等两个对象,则hashcode一定要相等。但是hashcode相等的两个对象不一定equals相等。
32、字节流与字符流的区别
字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以
33 jdk线程池
固定线程池:newFixedThreadPool 队列:LinkedBlockingQueue
单线程池:newSingleThreadExecutor 队列:LinkedBlockingQueue
缓存线程池:newCachedThreadPool 队列:SynchronousQueue
调度线程池:newScheduledThreadPool 队列:DelayedWorkQueue