最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

焦点信息:java基础面试题

来源:博客园


【资料图】

java基础面试题

1.java的一次编写处处运行,是如何实现

JAVA之所以能实现一次编译,到处运行,是因为JAVA在每个系统平台上都有JAVA虚拟机(JVM),JAVA编译的中间文件class是由JAVA虚拟机在运行时动态转换为对应平台的机器代码

2.为什么Java没有全局变量?

Global variables(全局变量) 是指可以全局访问的变量, Java不支持全局变量,原因如下:1. 全局变量破坏了引用的透明性。2. 全局变量制造了命名空间冲突。可以使用properties类将想要全局有效的变量值写在properties文件中,那么在何处用时都从此properties文件中读取这个变量的值就可以了,此值在任何时候都可以修改的

3.说明一下public static void main(String args[])这段声明里每个关键字的作用

Public 是一个访问权限(访问修饰符)公共 static  修饰的成员称为类成员或者静态成员void   当方法定义时用void修饰时,表示没有返回值String  类来创建和操作字符串

4.Java是否存在内存泄漏?

java中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是java中的内存泄露,一定要让程序将各种分支情况都完整执行到程序结束,然后看某个对象是否被使用过,如果没有,则才能判定这个对象属于内存泄露。

5.==与equals的区别

"= ="除了比较基本数据之外都是比较的内存地址"equals"除了没有没有重写equals方法的类之外都是比较的内容

6.java中有几种类型的流?

Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。

7.&和&&的区别

1、&与&&都可以用作逻辑与的运算符,当两边的结果都为true时,运算结果才为true,否则只要有一方运算结果是false,运算结果就为false。2、&&在开发过程中用到的概率比&大,因为&&具有短路的功能,只要第一个表达式是false,就不会再进行判断。例如:if(str!=null && !str.equals("")){}当str==null时,后面的表达式就不会继续执行,但是if(str!=null & !str.equals("")){}当str==null时,程序会报空指针异常,因为&不具有短路的功能。3、&同时也是位运算符,就是我们通常所说的按位与运算,当&的左右两边都是Boolean型表达式时或Boolean值时,就执行按位与运算。

8.构造器(constructor)是否可被重写(override),其规范是什么?

1、构造器(构造方法)Constructor不能被继承,因此不能重写Override,但可以被重载Overload(不同参数即可)。2、每一个类必须有自己的构造函数,在创建对象时自动调用,如果添加有参构造函数后,默认无参构造函数则被覆盖。子类不会覆盖父类的构造函数,但是在创建子类对象的时候,会自动调用父类构造函数。

9.JAVA 的反射机制的原理

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制    JAVA反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理

10.静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?

内部类是类中类(内部类不为同一包的其他类可见,具有很好的封装性),分为静态内部类,成员内部类,局部内部类以及匿名内部类;局部内部类写在方法里面;用到最多的就是匿名内部类。    1. 静态的内部类称为嵌套类,嵌套类不能直接引用外部类的non-static属性和方法,创建嵌套类对象时不依赖外部类对象;    2. 静态内部类没有了指向外部的引用,和C++的嵌套类很相像了,Java内部类和C++嵌套类最大的不同在于是否具有指向外部引用这点;    3. 在任何非静态内部类中,都不能有静态数据、静态方法或者又一个静态内部类(也就是不止一层),然后静态内部类可以拥有这一切。

11.如何将String类型转化成Number类型。

Integer类的valueOf方法可以将String转成Number

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

对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上。

13.java的访问修饰符是什么?

在Java编程语言中有四种权限访问控制符,这四种访问权限的控制符能够控制类中成员的可见性。public是公共的,被public所修饰的成员可以在任何类中都能被访问到。protected是受保护的,受到该类所在的包所保护。friendly是友好的,即在成员的前面不写任何的访问修饰符的时候,默认就是友好的。所谓友好的,是对同一package的类友好。private是私有的,即只能在当前类中被访问到,它的作用域最小。

14.java的基础数据类型有哪些?

byte(字节)   short(短整型)  int(整型)  long(长整型)  float(浮点型)  double(双精度)    char(字符型)  boolean(布尔型)

15.hashCode()和equals()方法的重要性体现在什么地方?

Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。

16.switch中用于判断的表达式,可以用哪些数据类型?

1.int2.char3.byte4.short5.枚举6. String:PS:对JDK版本有要求,必须为1.7及以上版本

17.char型变量中能不能存贮一个中文汉字?为什么?

Java里采用了Unicode编码格式,Unicode编码中一个char型占用2个字节,而一个汉字也是占用2个字节,所以可以存储中文汉字。备注:C语言里,char占用1个字节,不用存汉字。

18.静态变量和实例变量的区别?

在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。   在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

19.是否可以从一个static方法内部发出对非static方法的调用?

不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。

20.Integer与int的区别?

1、int是基本数据类型,Integer是包装类;2、int的默认值是0,Interger的默认值是null;

21.Overload和Override的区别。参数列表相同,返回值不同的方法,是否是重载方法?

Overload是重载的意思,Override是覆盖的意思,也就是重写。重载是指在一个类里,方法名相同,参数不同;重写是指子类继承父类,子类里重新编写了父类中的同名(同参数)方法,也就是覆盖了父类的方法;不是!因为重载必须要求参数列表不同!

22.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)?

接口可以继承多个接口。抽象类可以实现(implements)接口,抽象类是可继承具体类。备注:只要明白了接口和抽象类的本质和作用,这些问题都很好回答。只有记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法。

23.面向对象有哪三大特性?

1、面向对象有三大特性,分别是:封装、继承和多态。2、封装:面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个类中,有些属性是不希望公开的,或者说被其他对象访问的,所以我们使用private修饰该属性,使其隐藏起来;类中提供了方法(用public修饰),常用的是get、set方法,可以操作这些被隐藏的属性,其他类可以通过调用这些方法,改变隐藏属性的值!封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。3、继承:在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,使用extends关键字实现继承;子类中可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。4、多态:多态就是在声明时使用父类,在实现或调用时使用具体的子类;即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性,多态增强了软件的灵活性和扩展性。这里可以举个例子,比如声明时使用的是动物类,调用时传递的是一个猫类(动物类的子类)的对象,具体执行父类里动物——吃的方法时,实际执行的是猫——吃的方法。

24.abstract class和interface有什么区别?

1、抽象类里面可以用普通方法,而接口中的方法全部都是抽象的;2、在应用范围上来说,接口往往在程序设计的时候,用来定义程序模块的功能,方便各模块协同工作;抽象类是对相似类进行抽象,形成一个抽象的父类可供重用!

25.如何理解Java中的Serialization和Deserialization

串行化(serialization)是指将一个对象的当前状态转换成字节流(a stream of bytes)的过程,而反串行化(deserialization)则指串行化过程的逆过程,将字节流转换成一个对象,打回原形。

26.String是最基本的数据类型吗?

1、String是个类,不是基本数据类型;2、基本数据类型包括byte、int、char、long、float、double、boolean和short。

27.String s = new String("zx");创建了几个字符串对象

两个对象,要理解这个,就要知道string类的工作原理。publicclassStringTest{publicstaticvoidmain(String[]args){Strings1="Hello";Strings2="Hello";Strings3=newString("Hello");System.out.println("s1和s2引用地址是否相同:"+(s1==s2));System.out.println("s1和s2值是否相同:"+s1.equals(s2));System.out.println("s1和s3引用地址是否相同:"+(s1==s3));System.out.println("s1和s3值是否相同:"+s1.equals(s3));}}输出结果:s1和s2 引用地址是否相同:trues1和s2 值是否相同:trues1和s3 引用地址是否相同:falses1和s3 值是否相同:true

28.String 和StringBuffer的区别

1.String是个不可变长度的字符串,而StringBuffer是个可变长度的字符串;2.在对String类进行操作时(例如增加字符串),实际上是在内存中产生一个新的String对象;而StringBuffer是给原来的对象增加字符串,不是新创建一个对象;

29.数组有没有length()这个方法?String有没有length()这个方法?

数组没有length()这个方法,有length的属性。String有length()这个方法。

30.final,finally,finalize的区别。

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用

31.Error,Exception,RuntimeException区别

Error(错误)表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件问题。比如:内存资源不足等。对于这种错误,程序基本无能为力,除了退出运行外别无选择,它是由Java虚拟机抛出的。Exception(违例)表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。Exception又分为运行时异常,受检查异常。运行时异常,表示无法让程序恢复的异常,导致的原因通常是因为执行了错误的操作,建议终止程序,因此,编译器不检查这些异常。受检查异常,是表示程序可以处理的异常,也即表示程序可以修复(由程序自己接受异常并且做出处理), 所以称之为受检查异常。Exception体系包括RuntimeException体系和其他非RuntimeException的体系:① RuntimeException:RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。②其他非RuntimeException(IOException等等):这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。

32.Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用

throws是获取异常throw是抛出异常try是将会发生异常的语句括起来,从而进行异常的处理,catch是如果有异常就会执行他里面的语句,而finally不论是否有异常都会进行执行的语句。

33.throw和throws有什么区别?

throws是用来声明一个方法可能抛出的所有异常信息,而throw则是指抛出的一个具体的异常类型。

34.请说一下你常用的几种异常?

空指针异常;  NullPointerException数组下标越界; ArrayIndexOutOfBoundsException类型转换异常; ClassCastException算数异常,例如除数为零;ArithMeticExceptionIO异常,比如说找不到文件; FileNotFoundException找不到类异常;  ClassNotFoundExceptionsql异常,例如sql语句不能正常运行;…

35.线程的基本概念?线程的基本状态以及状态之间的关系

1、是程序执行流的最小单元。在单个程序中同时运行多个线程完成不同的工作,称为多线程。2、开始时:就绪状态,等待cpu调用后进入运行状态,运行过程中遇到阻塞事件,进入阻塞状态,等待阻塞事件结束后,重新进入就绪状态;如果没有阻塞事件,运行结束后,则进入结束状态。

36.sleep() 和 wait() 有什么区别?

sleep就是暂停当前线程一段时间,把cpu让给其他线程使用,到时后会自动恢复。调用sleep不会释放对象锁。 wait方法导致本线程放弃对象锁,进入等待,只有等到本对象的notify方法(或notifyAll)后本线程才进入就绪状态,等待执行

37.多线程有几种实现方法?

1.继承Thread类 2.实现Runnable接口 3.实现Callable接口 4.使用线程池

38.线程池的作用

提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应的速度

39.启动一个线程是用run()还是start()?

启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。

40.线程的基本状态以及状态之间的关系

1、新建状态(New):新创建了一个线程对象。2、就绪状态(Runnable):也叫可运行状态。线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:①等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。②同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。③其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

41.Set和List的区别,List和Map的区别?

1、Set是无序的,元素不可重复;List是有序的,元素可以重复;2、List存储的是单个对象的集合(有序的),Map存储的是键值对为对象的集合(无序的)

42.同步方法、同步代码块区别?

1.同步方法    即有synchronized关键字修饰的方法。   由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,     内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。2.同步代码块  即有synchronized关键字修饰的语句块。  被该关键字修饰的语句块会自动被加上内置锁,从而实现同步

43.描述Java 锁机制

java中所说的锁就是指的内置锁,每个java对象都可以作为一个实现同步的锁,虽然说在java中一切皆对象, 但是锁必须是引用类型的,基本数据类型则不可以 。每一个引用类型的对象都可以隐式的扮演一个用于同步的锁的角色,执行线程进入synchronized块之前会自动获得锁,无论是通过正常语句退出还是执行过程中抛出了异常,线程都会在放弃对synchronized块的控制时自动释放锁。 获得锁的唯一途径就是进入这个内部锁保护的同步块或方法 

44.Comparable和Comparator接口是干什么的?列出它们的区别

它们都是用于对类的对象进行比较和排序使用的接口。Comparable是排序接口,位于java.lang包下,若一个类实现了Comparable接口,且重写了compareTo方法,就意味着该类支持排序,常结合Collections.sort或Arrays.sort对集合或数组内的元素进行排序。Comparator是比较接口,位于java.util包下,我们如果需要控制某个类对象的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

45.Java集合类框架的最佳实践有哪些?

首先Java中的集合框架体系非常强大和完善,主要用于程序中的数据存储,从最顶层主要分为了Collection和Map接口,我们平时使用的集合类都是从这两个类别中扩展开来,正确选择要使用的集合的类型对性能非常重要。比如:1)元素的大小是固定的,而且能事先知道,我们就应该用Array而不是ArrayList。2)如果我们大概知道存储的数量,可以在使用集合时先给予一个初始容量大小,从而有效避免集合自动增长的算法而造成的空间浪费,如new ArrayList(30)。 3)为了类型安全,提高存取效率和可读性,我们优先使用泛型,并且还能有效避免ClassCastException类型转换异常。4)有时为了提高数据的快速定位查找,可优先使用Map键值对集合,因为Map集合在数据的查找上效率非常高,但是如果要保证数据的顺序,最好使用List5)使用JDK提供的不变类作为Map的键可以避免为我们自己的类实现hashCode()和equals()方法。6)底层的集合实际上是空的情况下,返回长度是0的集合或者是数组,不要返回null

46.HashMap和Hashtable的区别

1、HashMap和HashTable都是键值对数据结构,且都实现了Map接口,存储的元素无序;2、HashMap非线程安全的,而HashTable是线程安全的(HashTable里面的方法使用Synchronize关键字修饰),所以HashMap的效率高于HashTable。3、HashMap允许空键空值,HashTable则不允许

47.HashSet和TreeSet有什么区别?

相同点:1、单列存储   2、元素不可重复不同点:1、底层数据结构不同(HashSet===哈希表结构   TreeSet===二叉树结构)        2、数据唯一性依据不同(HashSet通过重写hashcode和equals     TreeSet通过compareable接口)3、有序性不同,HashSet无序,TreeSet有序

48.说出ArrayList,Vector, LinkedList的存储性能和特性。

1、ArrayList和LinkedList、Vector都实现了List接口;2、ArrayList和Vector底层是用数组实现的,而LinkedList使用双向链表实现的,在集合插入、删除元素时,ArrayList需要移动数组元素性能较差;但是在查询时,因为是连续的数组,所以查询速度快;LinkedList正好相反。3、在容量增长上,ArrayList增长原来50%,Vector集合增加容量原来的一倍。4、安全性方面Vector能够保证线程安全,但是效率比ArrayList要低。

49.Java 8 新特性有哪些

1.Lambda 表达式− Lambda允许把函数作为一个方法的参数,用更简洁的语法实现以前复杂的功能代码2.方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。3.接口中可以使用default关键字声明一个默认实现方法。4.新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。5.新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。6.加强对日期与时间的处理。7.Optional 类用来解决空指针异常。8.Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。

50.描述Java 动态代理

代理模式是常用的java设计模式之一,java中的代理实现主要有基于接口的jdk动态代理和基于类的cglib动态代理,代理的特点就是会为目标对象产生代理对象,从而在调用实际目标对象方法时实现无侵入式的代码扩展,比如一些框架中的拦截器机制、springAOP面向切面机制都是基于动态代理模式实现的,其次也可以更安全的保护目标对象。动态代理的目的主要就是为了解决一些安全性问题(不让客户直接调用目标对象的功能,而是相当于通过中介),其次就是可以在调用目标功能方法之前、之后额外添加一些功能,比如日志、事务等,并且还能阻止调用功目标功能,从而实现权限控制等。

51.为什么要使用单例模式

1、避免在开发程序的时候,创建出一个类的多个实例(占用空间,性能问题),所以使用单例模式,保证该类只创建一个对象;2、一般单例模式通常有两种形式:它的构造函数为private的,必须有一个静态方法,静态方法返回自己的实例;实行形式有两种,懒汉式和饿汉式;所谓的饿汉式就是在声明实例的时候直接初始化对象,而懒汉式是先声明一个空对象,在静态方法中实例化该对象并返回。//构造方法私有化,让外界无法创建对象private Test() {}//在当前类中声明静态对象,并提供公共静态方法让外界调用获取对象private static Test t;public static Test getInstance(){if(t==null){t=new Test();}return t;}

52.Java中有哪些常用排序方式,使用Java实现冒泡排序

排序主要用于将一组无需数据进行升序/降序排列,Java中有很多种排序方法,如:冒泡排序,选择排序,插入排序,快速排序等,其中在大量数据无需数据中效率最高的属于快速排序,比如实际工作中如果需要对数据排序,我们可以借助JDK中自带的Arrays.sort方法,它内部采用了快速排序,效率非常高,当然也可以自己实现xxxxxxxxxx手写一下排序主要用于将一组无需数据进行升序/降序排列,Java中有很多种排序方法,如:冒泡排序,选择排序,插入排序,快速排序等,其中在大量数据无需数据中效率最高的属于快速排序,比如实际工作中如果需要对数据排序,我们可以借助JDK中自带的Arrays.sort方法,它内部采用了快速排序,效率非常高,当然也可以自己实现冒泡排序就自己手写一下。。。。。。

53.Java中垃圾回收有什么目的?什么时候进行垃圾回收?

Java语言中一个显著的特点就是引入了垃圾回收机制(简称GC),使c语言程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。简单的理解,就是当对象失去引用后,系统会在调度的时间对它所占用的内存进行回收。

54.如何实现对象克隆

实现对象克隆有两种方式:1). 实现Cloneable接口并重写Object类中的clone()方法;  2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。

55.Java设计模式有哪些?

Java中有23种设计模式,我觉得理解设计模式对我们程序中的类和类的设计、依赖关系,扩展性,灵活性起着非常重要的作用,比如spring框架中都大量使用了设计模式,我比较熟悉的设计模式有:1.单例设计模式2.工厂设计模式(简单工厂、抽象工厂、工厂方法)3.代理设计模式4.观察者设计模式5.适配器模式6.原型模式

56.GC是什么?为什么要有GC?

GC是垃圾回收的意思(gabage collection),内存处理器是编程人员容易出现问题的地方,忘记或者错误的内存回收导致程序或者系统的不稳定甚至崩溃,java的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,java语言没有提供释放已分配内存的显式操作方法。

60. Java中是如何支持正则表达式

Java中的String类提供了支持正则表达式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()。此外,Java中可以用Pattern类表示正则表达式对象,它提供了丰富的API进行各种正则表达式操作。

61.Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?

Math.round(11.5)等于11 原因:5+0.5后是12再向下取整是12;Math.round(-11.5)等于-11 原因:5+0.5后是-11再向下取整-11

62.JDBC连接数据库的步骤?

JDBC是java连接及操作数据库的一种技术,使用步骤如下:1、加载JDBC驱动程序;  Class.forName(“com.mysql.jdbc.Driver”)2、创建数据库的连接对象;    Connection conn = DriverManager.getConnection(“jdbc:mysql://localhost:3306/数据库名”,”root”,”123456”);3、创建一个执行sql命令的Statement或PreparedStatement或者CallableStatement对象4、执行SQL语句;        增删改操作executeUpdate()返回int       查询操作executeQuery()返回结果集ResultSet5、返回并处理结果;        如果是查询需要对结果集逐行处理:while(rst.next())6、关闭连接;                conn.close()

63.Class.forName()方法有什么作用?

通过一个字符串加载一个类到java虚拟机中,返回与给定的字符串名称相关联类或接口的Class对象,该方法使用时会抛出ClassNotFoundException,即类无法找到异常

64.JDBC能否处理Blob和Clob

Blob是指二进制大对象(Binary Large Object),而Clob是指大字符对象(Character Large Objec),因此其中Blob是为存储大的二进制数据而设计的,而Clob是为存储大的文本数据而设计的。JDBC的PreparedStatement和ResultSet都提供了相应的方法来支持Blob和Clob操作。

65.JDBC中的PreparedStatement相比Statement的好处

1、PreparedStatement是Statement的子接口;2、PreparedStatement支持SQL语句中使用占位符,能够避免SQL注入,安全性更好;3、PreparedStatement对SQL语句有预编译的功能,所以性能更好;

66.解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法

通常我们定义一个基本数据类型的变量,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、”hello”和常量都是放在静态区中。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。String str = new String("hello");上面的语句中变量str放在栈上,用new创建出来的字符串对象放在堆上,而”hello”这个字面量放在静态区。

67.怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串

String s1 = "你好";String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");

68.列出一些你常见的运行时异常

ArithmeticException(算术异常)   5/0ClassCastException (类转换异常)IllegalArgumentException (非法参数异常)IndexOutOfBoundsException (下标越界异常)NullPointerException (空指针异常)SecurityException (安全异常)NumberFormatException   (数字格式异常 Integer.parseInt(“a1b2”))FileNotFoundException (文件找不到异常)ClassNotFoundException (类找不到异常)

69.List、Set、Map是否继承自Collection接口?

List、Set 是,Map 不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形

70.Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别

sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复。wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。

71.线程的sleep()方法和yield()方法有什么区别?

① sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;② 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;③ sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;④ sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。

72.请说出与线程同步以及线程调度相关的方法

- wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;- sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常;- notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关;- notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;

73.举例说明同步和异步

同步:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程,如果某个操作非常耗时,则会使后续的功能处于等待状态,产生假死/阻塞效果。异步:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。 区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式。银行的转账系统,对数据库的保存操作等等,都会使用同步交互操作,其余情况都优先使用异步交互。Java中的某个方法可以通过Synchronized关键字使其变为同步,从而解决线程中的异步资源安全问题。

74.Java中如何实现序列化,有什么意义?

Java中将一个类实现Serializable接口(实际是空接口,起标识作用),则该类的对象就可以被序列化。序列化就是将类的对象进行流化,被流化后的对象可以在网络中传输或者以文件的形式进行保存,然后在需要的时候可以进行反序列化,将流化的对象还原为原始对象,并且数据都保持原来的状态。具体操作是使用writeObject()方法进行写,然后使用时再通过readObject()方法进行对象读取还原。

75.获得一个类的类对象有哪些方式?

- 方法1:类型.class,例如:String.class- 方法2:对象.getClass(),例如:”hello”.getClass()- 方法3:Class.forName(),例如:Class.forName(“java.lang.String”)

76.如何通过反射创建对象

- 方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance()- 方法2:通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInstance(“Hello”);

java基础部分背完再背javaweb

关键词: 有什么区别 设计模式 就绪状态