发表时间:2022-03-25来源:网络
目录
1.简述static和final的用法?
2.写出冒泡排序的算法
3.abstract class 和 interface 有什么区别?
4.类有哪三个基本特性?各特性的优点?
4.1三个基本特征:类具有封装性、继承性和多态性
4.2优点:
5.Error和Exception有什么区别? 列出你见过的Exception并简要说明
6.java中会存在内存泄露吗?请简单描述
7.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
8.sleep()和wait()有什么区别
9.谈谈java跟你所知道的其它的语言相比,有什么优点?
10.谈谈你对面向对象的理解?
11.简单讲一下java的跨平台原理
12.有了基本数据类型,为什么还需要包装类型?
13.说一下"=="和equals方法究竟有什么区别?
14.讲一下java中的集合
15.ArrayList和LinkedList的区别?
16.讲一下HashMap和HashTable的区别?
17.请说出集合类中List、Map、Set的区别
18.Collection 和 Collections的区别
19.String、StringBuffer和StringBuilder的区别?
20.讲一下线程的几种实现方式?
21.讲一下线程的几种启动方式?
22.有没有使用过线程并发库?
23.静态变量和实例变量的区别
24.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
25.同步和异步有何异同,在什么情况下分别使用他们?举例说明。
26.java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
字节流和字符流的主要区别是什么呢?
27.&和&&的区别?
28.数组有没有length()这个方法? String有没有length()这个方法?
29.构造器Constructor是否可被override?
构造器是干什么用的?
构造器如何工作?
构造器不可被orerride(why)
30.super与this的区别?
31.GC是什么? 为什么要有GC?
32.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类?
33.内部类可以引用他包含类的成员吗?有没有什么限制?
34.Java有没有goto?
35.解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法
36.用最有效率的方法计算2乘以8?
37.在Java中,如何跳出当前的多重嵌套循环?
38.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
39.char 型变量中能不能存贮一个中文汉字,为什么?
40.Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?
41.内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?
42.Java 中的final关键字有哪些用法?
43.写出常见的5个RuntimeException
44.阐述final、finally、finalize的区别。
45.阐述ArrayList、Vector、LinkedList的存储性能和特性
46.Collection和Collections的区别?
47.List、Map、Set三个接口存取元素时,各有什么特点?
48.当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?
49.请说出与线程同步以及线程调度相关的方法。
50.Java中如何实现序列化,有什么意义?
51.如何通过反射创建对象
52.谈谈 JVM 的内存结构和内存分配
53.什么是双亲委派机制
54.Static 关键字有哪些作用?
55.Instanceof 有什么作用?
56.什么是不可变类?
57.强制类型转换的注意事项有哪些?
58.++i与 i++的区别?
59.字符串存储的机制是什么?
static:修饰属性,方法,代码块
(1)静态属性:也可叫类变量类名.属性名来访问(共有的类变量与对象无关,只和类有关)
注意:类中的实例变量是在创建对象时被初始化的,被static修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,类加载的过程是进行一次。也就是类变量只会被创建一次。
(2)静态方法:类名.方法名直接访问
注意:static修饰的方法,不能直接访问本类中的非静态(static)成员(包括方法和属性)本类的非静态方法可以访问本类的静态成员(包括方法和属性),可以调用静态方法。
final:修饰变量,类,方法
(1)修饰变量
被fianl修饰的成员变量就是常量(常量名大写),一旦赋值不能改变
修饰局部变量:修饰基本数据类型 ->变量的值不能改变
修饰引用 ->引用只能指向固定的对象
修饰实例变量:默认值不生效,可以再赋值
(2)修饰方法:不能被子类覆盖
(3)修饰类:不能被继承
在一个final类中的所有方法,默认都是final的
注意:final,不能用来修饰构造方法。
2.再来说线程安全,在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
String:适用于少量的字符串操作的情况,不可变字符串序列
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况,可变字符串序列,效率高
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况,可变字符串序列,效率低
extends Thread
implements Runnable
implements Callable
Runnable和Callable的区别是,
(1)Callable规定的方法是call(),Runnable规定的方法是run()。
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
(3)call方法可以抛出异常,run方法不可以
(4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。
第一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法,然后在run方法里填写相应的逻辑代码。
第二种方法是实现Runnable接口,并编写run方法,相比继承Thread类创建线程的好处是以实现接口的方式创建线程可以对类进行更好的扩展,该类可以继承其他类来扩展自身需求,相比第一种方式更加灵活,扩展性强。
实现Callable接口创建线程与Runnable接口的不同之处在于:如果你想要在线程执行完毕之后得到带有返回值的线程则实现Callable接口
在java5之后,就有了线程池的功能了,在介绍线程池之前,先来简单看一下线程池的概念。假设我开了家咨询公司,那么每天会有很多人过来咨询问题,如果我一个个接待的话,必然有很多人要排队,这样效率就很差,我想解决这个问题,现在我雇几个客服,来了一个咨询的,我就分配一个客服去接待他,再来一个,我再分配个客服去接待……如果第一个客服接待完了,我就让她接待下一个咨询者,这样我雇的这些客服可以循环利用。这些客服就好比不同的线程,那么装这些线程的容器就称为线程池。
静态变量也叫类变量,这种变量前加了static修饰符。可以直接用类名调用,也可以用对象调用,而且所有对象的同一个类变量 都是共享同一块内存空间。
实例变量也叫对象变量,这种变量没有加static修饰符。只能通过对象调用, 而且所有对象的同一个实例变量是共享不同的内存空间的。
区别在于:
静态变量是所有对象共有的,某一个对象将它的值改变了,其他对象再去获取它的值,得到的是改变后的值;
实例变量则是每一个对象私有的,某一个对象将它的值改变了,不影响其他对象取值的结果,其他对象仍会得到实例变量一开始就被赋予的值。
会执行
try{}中的return执行后在没有返回数据时先去执行finally{}中的代码,然后再返回。所以说finally{}在return中间执行
如果数据将在线程间共享.例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取.
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率.
同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;
将需要同步执行的代码加入到同步方法或同步块中(使用synchronized关键字修饰);
B-S模式中,使用Form表单提交数据,发送的就是同步请求,当响应返回后,才可以继续操作
异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。
B-S模式中,使用Ajax向服务器端发送异步请求,在响应没有返回客户端时,客户端可以继续操作,当响应返回客户端后,就能显示结果
区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式。
哪些情况建议使用同步交互呢?比如银行的转账系统,对数据库的保存操作等等,都会使用同步交互操作,其余情况都优先使用异步交互
Java中的流分为两种,一种是字节流,另一种是字符流;分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。
Java中其他多种多样变化的流均是由它们派生出来的.
字节流按照8位传输,字节流是最基本的,所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。
1、字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;
2、 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。
字节流:继承于InputStream \ OutputStream
字节输入流:InputStream,字节输出流:OutputStream
字符流:继承于InputStreamReader \ OutputStreamWriter
字符输入流:Reader,字符输出流:Writer
InputStreamReader 将字节流转换为字符流。是字节流通向字符流的桥梁。
OutputStreamWriter 将字符流转换为字节流。是字符流通向字节流的桥梁。
一.字节流在操作时不会用到缓冲区(内存),是直接对文件本身进行操作的。而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
二.在硬盘上的所有文件都是以字节形式存在的(图片,声音,视频),而字符值在内存中才会形成。(真正存储和传输数据时都是以字节为单位的,字符只是存在与内存当中的,所以,字节流适用范围更为宽广)
三. 字节流(byte stream): 以1字节(8-bit)为单位进行读/写,一次处理一个字节
字符流(character stream):,以字符为单位,一次处理一个字符。
&运算符有两种用法:(1)按位与;(2)逻辑与。
&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大 的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33 & ++y>0) y会增长,If(x==33 && ++y>0)不会增长

数组中没有length()这个方法,但是数组中有length这个属性。用来表示数组的长度。
String中有length()这个方法。用来得到字符串的长度。
构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。
Constructor不能被继承,所以Constructor也就不能被override。每一个类必须有自己的构造函数,负责构造自己这部分的构造。子类不会覆盖父类的构造函数,相反必须负责在一开始调用父类的构造函数。
构造器是用来生成一个类的实例是用来初始化这个实例用的
Java在构造实例时的顺序是这样的:
1、分配对象空间,并将对象中成员初始化为0或者空,java不允许用户操纵一个不定值的对象。
2、执行属性值的显式初始化
3、执行构造器
4、将变量关联到堆中的对象上
而执行构造器的步骤有可以分为以下几步:
1、Bind构造器的参数
2、如果显式的调用了this,那就递归调用this构造器然后跳到步骤5
3、递归调用显式或者隐式的父类构造器,除了Object以外,因为它没有父类
4、执行显式的实例变量初始化(也就是上边的流程中的第二步,调用返回以后执行,
这个步骤相当于在父构造器执行后隐含执行的,看样子像一个特殊处理)
其实你只需要记住一句话:构造器不是方法,那么用来修饰方法特性的所有修饰符都不能用来修饰构造器(并不等于构造器具备这些特性,虽然不能用static修饰构造器,但它却有静态特性)构造器只能用 public private protected这三个权限修饰符,且不能有返回语句。
不同点:
1、super()主要是对父类构造函数的调用,this()是对重载构造函数的调用
2、super()主要是在继承了父类的子类的构造函数中使用,是在不同类中的使用;this()主要是在同一类的不同构造函数中的使用
相同点:
1、super()和this()都必须在构造函数的第一行进行调用,否则就是错误的
注意:super与this不能同时出现的原因是因为都在第一行,谁在第一行谁是正确的
GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc()或Runtime.getRuntime().gc(),但JVM可以屏蔽掉显示的垃圾回收调用。忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的
垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。
在Java诞生初期,垃圾回收是Java最大的亮点之一,因为服务器端的编程需要有效的防止内存泄露问题,然而时过境迁,如今Java的垃圾回收机制已经成为被诟病的东西。移动智能终端用户通常觉得iOS的系统比Android系统有更好的用户体验,其中一个深层次的原因就在于Android系统中垃圾回收的不可预知性。
接口可以继承接口。抽象类可以实现(implements)接口,抽象类可继承实体类,但前提是实体类必须有明确的构造函数
完全可以。如果不是静态内部类,那没有什么限制!
如果你把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通成员变量,而只能访问外部类中的静态成员
goto 是Java中的保留字,在目前版本的Java中没有使用。(根据James Gosling(Java之父)编写的《The Java Programming Language》一书的附录中给出了一个Java关键字列表,其中有goto和const,但是这两个是目前无法使用的关键字,因此有些地方将其称之为保留字,其实保留字这个词应该有更广泛的意义,因为熟悉C语言的程序员都知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字)
通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、”hello”和常量都是放在静态区中。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。
2
上一篇:30道最常问的Java基础面试题
下一篇:Java【基础】面试题
皓盘云建最新版下载v9.0 安卓版
53.38MB |商务办公
ris云客移动销售系统最新版下载v1.1.25 安卓手机版
42.71M |商务办公
粤语翻译帮app下载v1.1.1 安卓版
60.01MB |生活服务
人生笔记app官方版下载v1.19.4 安卓版
125.88MB |系统工具
萝卜笔记app下载v1.1.6 安卓版
46.29MB |生活服务
贯联商户端app下载v6.1.8 安卓版
12.54MB |商务办公
jotmo笔记app下载v2.30.0 安卓版
50.06MB |系统工具
鑫钜出行共享汽车app下载v1.5.2
44.7M |生活服务
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-02-15
2022-02-14