单例模式
单例模式源码
public class Runtime {
//2.创建静态的全局唯一的对象
private static Runtime currentRuntime = new Runtime();
//1.私有化构造方法,不让外部来调用
/** Don't let anyone else instantiate this class */
private Runtime() {}
//3.通过自定义的静态方法获取实例
public static Runtime getRuntime() {
return currentRuntime;
}
1.饿汉式:不管你用不用这个类的对象,都会直接先创建一个
2.懒汉式:先不给创建这个类的对象,等你需要的时候再创建
枚举
枚举类是一种特殊形式的Java类,枚举类的对象个数是有限且明确的
枚举的作用:“是为了做信息的标志和信息的分类”
简单地说就是枚举是一个被命名的整数常数的集合,用于声明一组带标识符的常数
特点:一是让数值看起来更直观,二是圈定一个范围,是数值被限定在这个范围中。
- 枚举是单例模式的。你在枚举类中定义了多少个就会实例化多少个。
枚举和集合的区别
用于声明一组带标识符的常数,比如 RED(“红色”,1), YELLOW(“黄色”,3),等 而数组只能定义具体的值
instanceof的使用
用于检查引用变量是否包含给定类型的对象引用,但通常情况下是包含有父子类的时候使用,多数情况下是在向下转型的时候
在向下转型的时候我们进行强制类型转换的时候,使用instanceof关键字就可以很好地检查类型转换是否有效(原因:先进行有效性检验,再进行类型转换,更加安全)
向上转型
向上转型,通过子类对象 (小范围) 实例化父类对象 (大范围) , 这种属于自动转换。
Parent p=new Child();
向下转换
具体实现是将父类引用在还原为子类对象,那么这时候势必会涉及到强制类型转换,
public class Main {
public static void main(String[] args) {
Aminal aminal1=new Cat("小黄",3); //向上转型
Cat cat=(Cat) aminal1; //向下转型
cat.play();
Aminal aminal2=new Dog("小黑",6); //向上转型
Dog dog=(Dog) aminal2; //向下转型
dog.play();
}
2、什么是Java?
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
3、JVM、JRE和JDK的关系
JDK : (Java开发工具包)。JDK是整个JAVA的核心,包括了Java运行环境(JRE),一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。
JRE:(java运行时环境)。也就是我们说的JAVA平台,所有的Java程序都要在JRE下才能运行。包括JVM和JAVA核心类库和支持文件。与JDK相比,它不包含开发工具——编译器、调试器和其它工具。
JVM:Java Virtual Mechinal(JAVA虚拟机)。JVM是JRE的一部分,它是一个虚构出来的计算机,是通过仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 的主要工作是解释自己的指令集(即字节码)并映射到本地的 CPU 的指令集或 OS 的系统调用。
4、Java语言有哪些特点?
简单易学(Java语言的语法与C语言和C++语言很接近)
面向对象(封装,继承,多态)
平台无关性(Java虚拟机实现平台无关性:不同的OS(操作系统)都有与之对应的JVM)
支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的)
支持多线程(多线程机制使应用程序在同一时间并行执行多项任)
健壮性(Java语言的强类型机制、异常处理、垃圾的自动收集等)
安全性
5、Java 8的接口新增了哪些特性?
lambada表达式
Lambda 表达式是一个匿名函数,是一种没有声明的方法,即没有访问修饰符,返回值声明和名称,但它有参数列表、函数主体、返回类型。
Lambda 表达式举例:
(int a, int b) -> { return a + b; }
创建对象
()-> new apple();
//使用Lambda
Runnable r1 = () -> System.out.println("Hello World 1");
//打印 "Hello World 1"
函数式接口:在java中指:有且仅有一个抽象方法的接口,Java 8中专门为函数式接口引入了一个新的注解: @FunctionalInterface 。该注解可用于一个接口的定义上
方法引用:作用是简化lambada在调用已经存在的方法时的表达式。
1.静态方法引用(类名::静态方法名)
2.对象名::实例方法名
3.类的实例方法引用(类名::实例方法名)
6、ArrayList和LinkedList有什么区别?
ArrayList是数组的数据结构,LinkedList是链表的数据结构。
插入、删除数据时,LinkedList的效率比较高,因为ArrayList要移动数据。
LinkedList比ArrayList开销更大,因为LinkedList的节点除了存储数据,还需要存储引用。
抽象类为什么不能实例化
1。对象实例化的时候,关键字new向JVM申请内存,这个类的成员(成员变量,成员方法)会被保存到内存中。而抽象类,没有具体的成员(成员变量,成员方法),没办法准确分配内存。
2。抽象类中的方法实现交给子类来完成
.当一个子类继承了抽象父类以后,有两种解决方案:
*方案一:变成抽象子类,“躺平,我也不实现,继续抽象”
方案二:实现抽象父类中的所有的抽象方法,“父债子偿”/
8、抽象类和接口有什么区别?
抽象类要被子类继承,接口要被子类实现。
抽象类可以有构造方法,接口中不能有构造方法。
抽象类中可以有普通成员变量,接口中没有普通成员变量,它的变量只能是公共的静态的常量
一个类可以实现多个接口,但是只能继承一个父类,这个父类可以是抽象类。
接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。
抽象级别(从高到低):接口>抽象类>实现类。
抽象类主要是用来抽象类别,接口主要是用来抽象方法功能。
抽象类的关键字是abstract,接口的关键字是interface
9、静态代理和动态代理的区别?
静态代理中代理类在编译期就已经确定,而动态代理则是JVM运行时动态生成,静态代理的效率相对动态代理来说相对高一些,但是静态代理代码冗余大,一单需要修改接口,代理类和委托类都需要修改。
10、JDK动态代理和CGLIB动态代理的区别
JDK动态代理只能对实现了接口的类生成代理,而不能针对类。
CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法。因为是继承, 所以该类或方法最好不要声明成final。
12、Java中IO流分为几种?
Java中的流分为两种:一种是字节流,另一种是字符流。
IO流分别由四个抽象类来表示(两输入两输出):InputStream,OutputStream,Reader,Writer。
13、final 在 java 中有什么作用?
final 修饰的类叫最终类,该类不能被继承。
final 修饰的方法不能被重写。
final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。
14、java 中的 Math.round(-1.5) 等于多少?
等于 -1。
Math.round四舍五入,如果参数是负数,则往大的数如,Math.round(-1.5)=-1,比如Math.round(-1.3)=-1,如果是正数则按照四舍五入进行输出结果比如Math.round(1.5)则结果为2,Math.round(1.3)=1
15、String 属于基本的数据类型吗?
String 不属于基本类型,基本类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。
16、String str="i"与 String str=new String(“i”)一样吗?
不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。
17、多线程有什么好处?
多线程最大的好处就是:
更好地利用CPU
简单的程序设计
程序更多的响应
多任务下CPU资源分配公平性
19、arraylist和linkedlist区别?
arraylist底层是 动态数据,查询快和插入数组最后面较快。
注意:数据插入非尾部,涉及到下标index移位linkedlist底层是链表,插入和查询头部元素较快。
注意:linkedlist如果查询头部元素还是比较快的。
20、java 中操作字符串都有哪些类?它们之间有什么区别?
答:String、StringBuffer、StringBuilder可以操作拼接字符串
区别:String是不可变的对象,对每次对String类型的改变时都会生成一个新的对象,StringBuffer和StringBuilder是可以改变对象的。
对于操作效率:StringBuilder > StringBuffer > String
对于线程安全:StringBuffer 是线程安全,可用于多线程;StringBuilder 是非线程安全,用于单线程
22、两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
答:不对!hashCode()相同,不代表两个对象就相同。hashCode值是从hash表中得来的,hash是一个函数,该函数的实现是一种算法,通过hash算法算出hash值,hash表就是hash值组成的,一共有8个位置。
因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。
23、int和Integer有什么区别,为什么要使用包装类?
数据类型不同:int 是基础数据类型,而 Integer 是包装数据类型;
默认值不同:int 的默认值是 0,而 Integer 的默认值是 null;
内存中存储的方式不同:int 在内存中直接存储的是数据值,而 Integer 实际存储的是对象引用,当 new 一个 Integer 时实际上是生成一个指针指向此对象;
实例化方式不同:Integer 必须实例化才可以使用,而 int 不需要;
变量的比较方式不同:int 可以使用 == 来对比两个变量是否相等,而 Integer 一定要使用 equals
来比较两个变量是否相等。
为什么要使用包装类
答:java是面向对象编程,为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型,比如int的包装类就是Integer,Java 为每个原始类型提供了包装类型:
- 原始类型: boolean,char,byte,short,int,long,float,double
- 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
25、面向对象的三个特征是什么?什么是 封装、继承、多态?
答:面向对象的三个基本特征:封装、继承、多态
1)、封装(英语:Encapsulation)是指,一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
2)、继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等,继承可以理解为一个对象从另一个对象获取属性的过程。
3)、**多态性是对象多种表现形式的体现。比如我们说"宠物"这个对象,它就有很多不同的表达或实现,比如有小猫、小狗、蜥蜴等等。**那么我到宠物店说"请给我一只宠物",服务员给我小猫、小狗或者蜥蜴都可以,我们就说"宠物"这个对象就具备多态性。
26、列出一些你常见的运行时异常?
答:- ClassNotFoundException(类找不到异常)
- ClassCastException (类转换异常)
- IllegalArgumentException (非法参数异常)
- IndexOutOfBoundsException (下标越界异常)
- NullPointerException (空指针异常)
- SecurityException (安全异常)
27、常用数据结构
答:集合,线性结构(数组,队列,链表和栈),树形结构,图状结构。
28、Comparator 与Comparable 有什么不同?
答:Comparable 接口用于定义对象的自然顺序,是排序接口,而 comparator 通常用于定义用户定制的顺序,是比较接口。
29、Java 中堆和栈有什么区别?
答:JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存局部变量、方法返回值,而对象实例和数组总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。
30、JVM分为哪些区,每一个区是干嘛的?
1)、方法区(method):被所有的线程共享。方法区包含所有的类信息和静态变量。
2)、堆(heap):被所有的线程共享,存放对象实例以及数组,Java堆是GC的主要区域。
3)、栈(stack):每个线程包含一个栈区,栈中保存一些局部变量等。
4)、程序计数器:是当前线程执行的字节码的行指示器。
31、解释堆空间和GC是什么?
答:Java 进程的时候,会为它分配内存。内存的一部分用于创建堆空间,当程序中创建对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一个进程,回收无效对象的内存用于将来的分配。
32、同步和异步有何异同,在什么情况下分别使用他们?举例说明
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
33、sleep()和 wait()的区别?
sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,将执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用 sleep 不会释放对象锁。
wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出 notify 方法(或 notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
34、Java 中实现多态的机制是什么?
方法的重写 Overriding 和重载 Overloading 是 Java 多态性的不同表现。重写 Overriding是父类与子类之间多态性的一种表现,重载 Overloading 是一个类中多态性的一种表现。
37、如果去掉了main方法的static修饰符会怎样?
答:程序能正常编译。运行时会抛NoSuchMethodError异常。
38、GC是什么?为什么要有GC?
答:GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
41、get 和 post请求的区别
答:get:
1、请求的参数会附加在URL之后,多个参数用 & 连接。
2、因为URL的长度限制,get 方式传输的数据大小有所限制。
3、安全性低,因为传输的数据会显示在请求的URL中。
post:
1、将请求参数放置在 HTTP 数据包,发送给服务器。
2、传送的数据量比较大
3、安全性较高
42、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
答:不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,然后在调用静态方法时可能对象并没有被初始化。
43、程序中可以允许多个类同时拥有都有main方法吗?
答:可以。当程序运行的时候,我们会指定运行的类名。JVM只会在你指定的类中查找main方法。因此多个类拥有main方法并不存在命名冲突的问题。
44、什么是反射API?它是如何实现的?
答:反射是指在运行时能查看一个类的状态及特征,并能进行动态管理的功能。这些功能是通过一些内建类的反射API提供的,比如Class,Method,Field, Constructors等。使用的例子:使用Java反射API的getName方法可以获取到类名。
47、为什么需要hashCode?
答:1.通过hashCode可以很快的查到小内存块。
2.通过hashCode比较比equal方法快,当get时先比较hashCode,如果hashCode不同,直接返回false。
48、Super与this表示什么?
答:Super表示当前类的父类对象(super只能在非抽象类中,因为抽象类不能实例化)
This表示当前类的对象
说明:在静态方法中不能使用Super与this
50、IO 和 NIO 的区别,NIO的优点
答:1、IO是面向流的,NIO是面向缓冲区的。
2、IO是阻塞的,NIO是非阻塞的。
3、NIO有选择器机制,可以让一个线程来监视多个IO通道。
NIO的优点:
1、不需要使用 read() 或者 write() 就可以处理文件内容。
2、NIO的处理效率很快。
51、谈谈对Java中多态的理解?
答:多态是指允许不同子类型的对象对同一消息作出不同的响应。
多态包括编译时多态和运行时多态。
方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。
运行时多态是面向对象最精髓的东西,要实现运行时多态需要:
方法重写:子类继承父类并重写父类中已有的或抽象的方法。
对象造型:将父类型的引用指向子类型的对象,这样父类的引用调用同样的方法时即会根据子类对象的不同而表现出不同的行为。
52、Integer内部缓存?
答:Integer类内部有一个staitic 的Integer数组,存储的是一些已经完成初始化的Integer对象,一般值为(-128~127),若用==比较,则有时候会因为值不在缓存中而返回false,所以应该用equals比较。
53、什么是拆装箱?
拆箱:把包装类型转成基本数据类型
装箱:把基本数据类型转成包装类型
54、接口有什么特点?
接口中声明全是public static final修饰的常量
接口中所有方法都是抽象方法
接口是没有构造方法的
接口也不能直接实例化
接口可以多继承