「java基础面试栈」java基础知识点面试

博主:adminadmin 2023-01-08 23:39:12 1846

今天给各位分享java基础面试栈的知识,其中也会对java基础知识点面试进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

面试问java里堆和栈的区别,怎么说

Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等 指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时 动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类 型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。

栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:

int a = 3;

int b = 3;

编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。

这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。

要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。

String是一个特殊的包装类数据。可以用:

String str = new String("abc");

String str = "abc";

两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。

而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。

比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。

String str1 = "abc";

String str2 = "abc";

System.out.println(str1==str2); //true

可以看出str1和str2是指向同一个对象的。

String str1 =new String ("abc");

String str2 =new String ("abc");

System.out.println(str1==str2); // false

用new的方式是生成不同的对象。每一次生成一个。

因此用第一种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。

另一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。只有通过new()方法才能保证每次都创建一个新的对象。

由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。

java面试 内存中堆和栈的区别

堆栈,这个在操作系统有讲。。。不好说

动态分配空间是 堆

其它变量是栈,

java基础都有那些?

一、标识符

java对各种变量、方法和类等要素命名时使用的字符序列成为标识符;通俗点,凡是自己可以起名字的地方都叫标识符,都遵守标识符的规则

1.标识符命名规则:

1)标识符由字符、下划线、美元符或数字组成。

2)标识符应以字符、下划线、美元符开头

3)java标识符大小写敏感,长度无限制

4)约定俗成,java标识符选取应该注意“见名知意”且不能与java语言的关键字(eclipes中带颜色的基本都是关键字)重名

二、关键字

java中一些赋以特定含义,用作专门用途的关键的字符串成为关键字(keyword);且大多数编辑器都会将关键字用特殊方式标出 所有java关键字都是小写英文

一些常用关键字:

三、java的基本数据类型

1.java常量

java的常量值用字符串表示,区分为不同的数据类型。如:整型常量:1234实型常量:3.14字符常量:’a’逻辑常量:true、false字符串常量:”HelloWorld”

注意:

1)区分字符常量和字符串常量

字符常量是单引号引起来的单个,字符串常量是双引号引起来的不限长度

由于java采用Unicode编码,每个字符占两个字节,因而可用天十六进制编码形式表示,当然也可以用一个中文表示(单个中文占用两个字节)

2)”常量”这个名次还会用在另外其他语境中表示值不可变的变量

2.java变量

java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。java程序中每一个变量都属于特定的数据类型,在使用前必需对其进行声明,声明格式为:type varName [=value]例如:int i =100;foloat f=12.3f;double d1,d2,d3=0.123;(声明了三个变量,其中d1,d2是默认值,d3=0.123)String s=”hello”

从本质上讲,变量其实是内存中的一小块区域,使用变量名来访问这块区域,因此,每一个变量使用前必需先声明,然后必需进行赋值,才能使用。

1)java变量分类

按被声明的位置划分:

局部变量:方法或语句块内部定义的变量,只能在被定义的方法或语句块内使用

成员变量:方法外部、类的内部定义的变量,可以在整个类中使用,包括类里的方法或语句块内也可以使用

注意:类外面是不能有变量的声明的

按所属的数据类型划分:

基本数据类型变量

引用数据类型变量

四、运算符

java语言支持如下运算符:

算术运算符:+ - * / % ++ --

关系运算符: = = == !=

逻辑运算符:! | ^ ||

位运算符: | ^ ~

赋值运算符:=

拓展赋值运算符:+ = -= *= /=

字符串链接运算符:+

三目条件运算符 ? :

1.算数运算符

注意:

1)

位运算符中的!、、|、^跟罗技运算符相同,只是位运算符是对变量的二进制进行操作,我个人是用不到的,所以不在这里多做介绍

2)

++(—)

在前时先运算再取值

在后时先取值再运算

2.逻辑运算符

例如:

3.扩展赋值运算符

4.字符串连接符

“ + ”运算符两侧的操作数中只要有一个是字符串类型,系统会自动将另一个操作数转换为字符串然后进行连接,例如:

4 + 5 = 94 + “ab” = “4ab”

5.三目条件运算符

语法格式: x ? y : z 其中x为boolean类型表达式,先计算x的值,若为true,则整个三目运算的结果为表达式y的值,否则整个运算结果为表达式z的值。

五、表达式和语句

1.表达式

表达式是符合一定语法规则的运算符和操作数的序列,例如:a5.0 + a(a – b) * c – 4i 30 i %10 !=0

1)表达式的类型和值

表达式中的操作数进行运算得到的结果称为表达式的值

表达式值的数据类型即为表达式的类型

2)表达式的运算顺序

应按照运算符的优先级从高到低的顺序进行

优先级相同的运算符按照实现约定的结合方式进行

我个人觉得运算顺序这块是可以忽略的,首先我的逻辑思维能力不是特别强,另外我的记性也不是特别好,所以如果我需要在表达式中区分优先级的话我会选择加括号。但是我觉得对于一些比较复杂且关键的逻辑运算,如果个人逻辑运算能力加记忆都比较好可以保证不出错的话,善用罗技运算符优先级未尝不是一种不让别人看懂你代码copy的手段。算是一种小小的防护吧,反正我这种人是不会去尝试分析这种代码的,太累

2.分支(条件)语句

ifif  … elseif  … else if … else ifif  … else if … else  if …else

switch () {case xx:

……………case xx:

……………default:

……………}

1.java中switch语句只能探测int类型的值(char类型的值也可以,因为他可以转换城int类型)

2.小心case穿透,所以最好与break连用

3.多个case可以连用,如下的示例代码也可以这样写(当i=1,2,18都会输出18):

3.循环语句

for(…;…;…){……}while(…){……}先判断再执行大括号里面的内容,然后再判断是否要继续执行do{……} whille(…); 先执行大括号里面的内容再判断是否要继续执行

4.break continue语句

break语句用于终止某个语句块的执行。用在循环体语句中么可以强行退出循环continue语句用在循环体语句中,用于终止某次循环过程,跳过循环中continue语句下面未执行的循环,开始下一次循环过程

八、方法

java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,声明格式:[修饰符1  修饰符2  …] 返回值类型  方法名  (形式参数列表)  {

java语句}

形式参数:在方法被调用时用于接受外界输入的数据

实参:调用方法时实际纯给方法的数据

返回值:方法在执行完毕后返回给调用他的环境的数据

返回值类型:实现约定的返回值的数据类型,如无返回值,必需给出返回值类型void

java语言中调用方法:对象名.方法名(实参列表)

实参的数目、数据类型和次序必需和所调用方法声明的形参列表匹配

return语句终止方法的运行并指定要返回的数据

java中进行函数调用传递参数时,遵循值传递的原则:

基本类型传递的是该数据值本身,引用累心美国传递的是对对象的引用,而不是对象本身

例子中的方法1,前面定义的数据类型为void, 所以方法中不能有return返回值,方法4中因为有return返回值,所以前面必需定义为返回值的类型,也就是m4前面那个int

九、递归调用

递归调用是指在方法执行过程中出现该方法本身的调用

先看一个例子,这是一个简单的递归调用:

简单分析下:

1.首先main主方法中输出字符串,内容是test方法当参数等于5的时候的返回值2.然后将参数5传入test方法,返回值是:5 * test(4)3.再次将参数4传入test方法中,返回值是:4 * test(3)4.再将参数3传入test方法中,返回值是:3 * test(2)5.再讲参数2传入test方法中:返回值是:2 * test(1)6.再将参数1传入到方法中:返回值是:1然后程序开始往回走,返回值传入test(1)中得到2*1再往回走,将刚刚得到的2*1传入到test(2)中得到3*2*1还要往回走,将刚刚得到的3*2*1传入到test(3)中得到4*3*2*1还要往回走,将刚刚得到的4*3*2*1传入到test(4)中也就是test(5)的返回值,得到5*4*3*2*1最后将test5的返回值传入到我们的主方法输出于语句中5*4*3*2*1=120,那么我们的输出语句输出的应该为120

这就是简单的递归调用的例子了

再来看一个例子:

非递归的写法:

请自行领悟

最后奉上java基础语法完整学习路线图,除此之外还有精心整理的其他java学习路线图,学习书籍电子书,阿里巴巴手册,视频教程等即可点此领取:

java基础面试题有哪些?

下面是10道java基础面试题,后附答案

1.什么是 Java 虚拟机?为什么 Java 被称作是“平台无关的编程语言”?

Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。

Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。

2.“static”关键字是什么意思?Java 中是否可以覆盖(override)一个 private 或者是static 的方法?

“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。

Java 中 static 方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而 static 方法是编译时静态绑定的。static 方法跟类的任何实例都不相关,所以概念上不适用。

3.JDK 和 JRE 的区别是什么?

Java 运行时环境(JRE)是将要执行 Java 程序的 Java 虚拟机。它同时也包含了执行 applet 需要的浏览器插件。Java 开发工具包 (JDK)是完整的 Java 软件开发包,包含了 JRE,编译器和其他的工具(比如:JavaDoc,Java 调试器),可以让开发者开发、编译、执行 Java 应用程序。

4.是否可以在 static 环境中访问非 static 变量?

static 变量在 Java 中是属于类的,它在所有的实例中的值是一样的。当类被 Java 虚拟机载入的时候,会对 static 变量进行初始化。如果你的代码尝试不用实例来访问非 static 的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。

5.Java 支持的数据类型有哪些?什么是自动拆装箱?

Java 语言支持的 8 中基本数据类型是:

byte

short

int

long

float

double

boolean

char

自动装箱是 Java 编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把 int 转化成 Integer,double 转化成 double,等等。反之就是自动拆箱。

6.Java 支持多继承么?

不支持,Java 不支持多继承。每个类都只能继承一个类,但是可以实现多个接口。

7.Java 中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?

当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java 编译器会为这个类创建一个默认的构造函数。

Java 中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。

Java 不支持像 C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java 不会创建默认的复制构造函数。

8.Java 中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

Java 中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。

9.接口和抽象类的区别是什么?

Java 提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:

接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。

类可以实现很多个接口,但是只能继承一个抽象类

类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。

抽象类可以在不提供接口方法实现的情况下实现接口。

Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。

Java 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 private, protected 或者是 public。

接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含 main 方法的话是可以被调用的。

10.什么是值传递和引用传递?

对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。

对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上。

最后祝你面试顺利!

Java基础面试题都有哪些?

1.java异常机制的原理与应用\x0d\x0a答:每当程序出现异常之后,如果程序没有进行相应的处理,则程序会出现中断现象。\x0d\x0a实际上,产生了异常之后,JVM会抛出一个异常类的实例化对象,如果此时使用了try语句捕获的话,则可以进行异常的处理,否则,交给JVM进行处理。当try语句捕获异常之后,将与catch语句的异常类型进行匹配,如果匹配成功则执行catch内的语句。简单的应用:在所以throws语句的地方加入try-catch。标准应用:try-catch-finally-throw-throws一起使用。 \x0d\x0a\x0d\x0a2. 垃圾回收机制的优点\x0d\x0a答:释放无用的对象所占用的空间。方式:自动回收,手动回收。使用System.gc(),实际上调用Runtime.getRuntime().gc()\x0d\x0a\x0d\x0a3. Error与Exception区别\x0d\x0a答:Error是jvm进行处理,是jvm出错\x0d\x0aexception是可以由程序处理的,可以用try-catch捕获的\x0d\x0a\x0d\x0a4. final,finally,finallize\x0d\x0a答:final定义的变量的值不能改变,定义的方法不能被覆盖,定义的类不能被继承\x0d\x0afinally是异常的统一出口,finallize是垃圾回收前的收尾工作,是Object类定义的\x0d\x0a\x0d\x0a5. Anonymous Inner Class是否可以extends,是否可以implements Interface\x0d\x0a答:允许继承和实现,因为匿名内部类就是在抽象类和接口的基础上发展起来的\x0d\x0a\x0d\x0a6. Static Nested Class 与Inner Class的区别\x0d\x0a答:使用Static定义的Class就是外部类,可以通过外部类. 内部类直接访问\x0d\x0a而Inner Class是不能被外部访问的,只能通过外部类的实例再找到内部类实例。\x0d\x0a\x0d\x0a7. HashMap and HashTable?\x0d\x0a答:HashMap:1) released in jdk 1.2,new Class 2)采用异步处理方式,性能较高,是非线程安全的 3)允许null\x0d\x0aHashTable:\x0d\x0a1)released in jdk 1.0 ,old Class \x0d\x0a2)采用同步处理方式,性能低,是线程安全的\x0d\x0a3)不允许null\x0d\x0a\x0d\x0a8. assert代表什么?\x0d\x0a答:asserts是jdk 1.4之后发布的新关键字,表示断言,即程序执行到某个地方肯定是预计的值,一般开发很少使用。要使用assert,必须加上 -ea参数\x0d\x0a\x0d\x0a9. gc是什么?\x0d\x0a答:gc是garbage collection,垃圾回收,使用gc可以进行垃圾空间的释放\x0d\x0a\x0d\x0a10. String s = new String("xyz")产生了几个对象?\x0d\x0a答:一个匿名对象xyz,在栈空间内。一个new实例化的对象,在堆空间内。\x0d\x0a\x0d\x0a11. sleep() and wait()?\x0d\x0a答:sleep()是Thread类定义方法,表示线程的休眠,可以自动唤醒\x0d\x0await()方法是Object类定义的方法,需要手动notify()和notifyAll()//sleep()不释放资源,wait()释放资源\x0d\x0a\x0d\x0a12. Overload与Override的区别\x0d\x0a答:Overload:重载\x0d\x0a |- 在一个类中定义的若干方法\x0d\x0a |- 所有的方法名相同,但参数类型或个数不同\x0d\x0a |- 只有参数有关,与返回类型无关\x0d\x0aOverride:覆写\x0d\x0a |- 在继承的关系中\x0d\x0a |- 子类定义了父类同名的方法,参数类型或个数最好完全一样。\x0d\x0a |- 访问权限不能更严格\x0d\x0a\x0d\x0a13. abstract class 和 interface有什么区别?\x0d\x0a答:抽象类:\x0d\x0a |-由抽象方法和常量、变量、全局常量、构造方法、普通方法组成\x0d\x0a |-使用abstract声明\x0d\x0a |-子类要通过extends继承抽象类,子类如果不是抽象类,则必须覆写抽象类的全部抽象方法\x0d\x0a |-存在单继承的局限\x0d\x0a |-抽象类可以实现若干个接口\x0d\x0a接口:\x0d\x0a |-由抽象方法和全局常量组成\x0d\x0a |-使用interface关键字\x0d\x0a |-子类要通过implements实现接口,子类如果不是抽象类,则必须覆写抽象类的全部抽象方法\x0d\x0a |-一个子类可以实现多个接口\x0d\x0a |-接口不能继承一个抽象类,但允许继承多个接口

java中堆和栈的区别 面试题

Java 把内存划分成两种:一种是栈内存,另一种是堆内存。

在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。

当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

堆内存用来存放由new创建的对象和数组。 

在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。

在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。

引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。

java中变量在内存中的分配

1、类变量(static修饰的变量):在程序加载时系统就为它在堆中开辟了内存,堆中的内存地址存放于栈以便于高速访问。静态变量的生命周期--一直持续到整个"系统"关闭

2、实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量(比如说类实例),然后根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的"物理位置"。 实例变量的生命周期--当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存

3、局部变量:局部变量,由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放

关于java基础面试栈和java基础知识点面试的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。