欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

Java面试日常总结大杂烩

发布时间:2025/3/12 32 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Java面试日常总结大杂烩 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

日常总结大杂烩:


一。 取出特定行数的数据

1. select* from 表名 limit m,n;

2. select * from 表名  limit [offset,] rows;


1. m代表从m+1条记录行开始检索,n代表取出n条数据。(m可设为0)如:select * from表名 limit 6,5;表示:从第7条记录行开始算,取出5条数据 


2.值得注意的是,n可以被设置为-1,当n为-1时,表示从m+1行开始检索,直到取出最后一条数据。如:SELECT * FROM 表名 limit 6,-1;表示:取出第6条记录行以后的所有数据。 


3.若只给出m,则表示从第1条记录行开始算一共取出m条如:SELECT * FROM 表名 limit 6;表示:取出前6条记录行。


二。 ArrayList list = new ArrayList(20);中的list扩充几次()

A 0     B 1     C 2      D 3

答案:A

ArrayList动态扩容机制

初始化:有三种方式

1. 默认的构造器,将会以默认的大小来初始化内部的数组:public ArrayList();

2. 用一个ICollection对象来构造,并将该集合的元素添加到ArrayList:  public ArrayList(Collection<? extends E> c)

3. 用指定的大小来初始化内部的数组: public ArrayList(int initialCapacity) 

  
这里我们来重点关注一下无参数构造器的实现过程:

ArrayList list=new ArrayList(); 这种是默认创建大小为10的数组,每次扩容大小为1.5倍 (10*1.5=15)
ArrayList list=new ArrayList(20); 这种是指定数组大小的创建,创建时直接分配其大小,没有扩充。 
所以,扩充为0次

链接:https://www.nowcoder.com/questionTerminal/85bf28c36fa14484b950f07d269dcd49
来源:牛客网

本题需要注意的是:调用的是带参的构造方法。 另外也要注意: 1、如果不指定容量,而初始大小为10,动态增长时,增长到当前容量的1.5倍。 2、与之类似的还有,HashMap的初始大小为16,增长时,直接容量翻倍*2,如源代码。
123456789void addEntry(int hash, K key, V value, int bucketIndex) {    if ((size >= threshold) && (null != table[bucketIndex])) {        resize(2 * table.length);        hash = (null != key) ? hash(key) : 0;        bucketIndex = indexFor(hash, table.length);    }    createEntry(hash, key, value, bucketIndex);}
3、Vector的初始大小为10,如果没有指定每次增长的大小,则默认是翻倍增长。

4.补充:hashtable是2倍+1,concurrenthashmap也是2倍




三。List list=new ArrayList()怎么理解??? 


List是接口,ArrayList是List的实现类。

至于为什么是写成List list = new ArrayList()而不是ArrayList arrayList = new ArrayList()有如下的原因:
 1 接口有什么好处,这种定义方式就有什么好处当然你可以用 ArrayList   list   =   new   ArrayList()但是一般不这么用

 2 设计模式中有对依赖倒置原则。程序要尽量依赖于抽象,不依赖于具体。从Java语法上,这种方式是使用接口引用指向具体实现。

比如,你若希望用LinkedList的实现来替代ArrayList的话,只需改动一行即可:List   list   =   new   LinkedList();而程序中的其它部分不需要改动,这样比较灵活

这个如果你想把存储结构该为LinkedList的时候,只要把List  list=new ArrayList()改为List list=new LinkedList()而其他的所有的都不需要改动。这也是一种很好的设计模式.一个接口有多种实现,当你想换一种实现方式时,你需要做的改动很小.
 3 面向接口编程
 4 提高程序宽展性,以后修改维护好些



总结一下:

ArrayList不是继承List接口,是实现了List接口。
你写成ArrayList arrayList = new ArrayList();这样不会有任何问题。和List list = new ArrayList();相比这2个写是有区别的。

      arrayList是一个ArrayList对象,它可以使用ArrayList的所有方法。(包括list接口中没有定义的方法)
      List是接口,它是不可以被实例化的(接口是个抽象类),所以必须以它的实现类去实例化它。list对象虽然也是被实例化为ArrayList但是它实际是List对象,list只能使用ArrayList中已经实现了的List接口中的方法,ArrayList中那些自己的、没有在List接口定义的方法是不可以被访问到的。
      我们说,用接口去做是有它的好处的,如果你把类型定义成ArrayList(也就是一个具体的实现类)那么你就只能接收这一种类型的数据了,如果你要是定义为List那么你不仅可以接收ArrayList的对象还可以接收LinkedList的对象,这样你的程序就灵活了

参考:https://blog.csdn.net/llayjun/article/details/46812151



四。 ,下列说法正确的是()

A.一个文件里可以同时存在两个public修饰的类

B.构造函数可以被重写(override)

C.子类不能访问父类非public和protected修饰的属性

D.final修饰的类可以被继承

答案:C

        一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必须与之一致,否则无法编译,如果源文件中没有一个public类,则文件名与类中没有一致性要求。至于main()不是必须要放在public类中才能运行程序。

  重写是子类继承父类后对父类的方法进行修改。方法名,参数,返回值必须一样。 不能重写被标示为final的方法。如果不能继承一个方法,则不能重写这个方法。

扩展:重写override,重载overload的区别

   java的方法重载

        就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法,而且返回值类型可以相同也可以不相同,这也是面向对象的多态性。

   java的方法重写

        父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。

        若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类

        子类函数的访问修饰权限不能少于父类的

        重写方法只能存在于具有继承关系中,重写方法只能重写父类非私有的方法。




五。 关于 JAVA 堆,下面说法错误的是( )

A.所有类的实例和数组都是在堆上分配内存的        

B.对象所占的堆内存是由自动内存管理系统回收

C.堆内存由存活和死亡的对象,空闲碎片区组成       

D.数组是分配在栈中的

答案:D

        首先数组是分配在堆中的,故D的说法不正确。

        Java堆的结构:JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。




六。 在使用super 和this关键字时,以下描述正确的是()

A.在子类构造方法中使用super()显示调用父类的构造方法;

    super()必须写在子类构造方法的第一行,否则编译不通过
B.super()和this()不一定要放在构造方法内第一行
C.this()和super()可以同时出现在一个构造函数中
D.this()和super()可以在static环境中使用,包括static方法和static语句块

答案:A

        Java关键字this只能用于方法方法体内当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this。因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this。

        super关键字和this作用类似,是被屏蔽的成员变量或者成员方法或变为可见,或者说用来引用被屏蔽的成员变量和成员成员方法。

        不过super是用在子类中,目的是访问直接父类中被屏蔽的成员,注意是直接父类(就是类之上最近的超类)



七。 下列语句哪一个正确()

A.Java程序经编译后会产生machine code

B.Java程序经编译后会产生byte code

C.Java程序经编译后会产生DLL

D.以上都不正确

答案:B

        Java字节码是Java源文件编译产生的中间文件

        java虚拟机是可运行java字节码的假想计算机 java的跨平台性也是相对与其他编程语言而言的 。


        先介绍一下c语言的编译过程:c的文件经过C编译程序编译后生成windows可执行文件exe文件然后在windows中执行。

        再介绍java的编译过程:java的文件由java编译程序将java字节码文件(class文件)在java虚拟机中执行。机器码是由CPU来执行的;Java编译后是字节码。

        电脑只能运行机器码。Java在运行的时候把字节码变成机器码。C/C++在编译的时候直接编译成机器码


 八。  下列哪一种叙述是正确的()

A.abstract修饰符可修饰字段、方法和类

B.抽象方法的body部分必须用一对大括号{ }包住

C.声明抽象方法,大括号可有可无

D.声明抽象方法不可写出大括号

答案:D

        abstract修饰符用来修饰类和成员方法 

        用abstract修饰的类表示抽象类,抽象类位于继承树的抽象层,抽象类不能被实例化。 

        用abstract修饰的方法表示抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能,但不提供具体的实现。 

        Abstract是Java中的一个重要关键字,可以用来修饰一个类或者一个方法。

        修饰一个方法时,表示该方法只有特征签名(signature),没有具体实现,而是把具体实现留给继承该类的子类,所以不能有大括号。



九。 下列说法正确的有()

A.class中的constructor不可省略

B.constructor必须与class同名,但方法不能与class同名

C.constructor在一个对象被new时执行

D.一个class只能定义一个constructor

答案:C 

        这里可能会有误区,其实普通的类方法是可以和类名同名的,和构造方法唯一的区分就是,构造方法没有返回值。 



十。 GC线程是否为守护线程()

答案:是

        线程分为守护线程和非守护线程(即用户线程)。

        只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。

        守护线程最典型的应用就是 GC (垃圾回收器)


十一。  关于sleep()和wait(),以下描述错误的一项是( )

A. sleep是线程类(Thread)的方法,wait是Object类的方法;

B. sleep不释放对象锁,wait放弃对象锁;

C. sleep暂停线程、但监控状态仍然保持,结束后会自动恢复;

D. wait后进入等待锁定池,只有针对此对象发出notify方法后获得对象锁进入运行状态。

答案:D

        sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。

        wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。


十二。 

方法resume()负责恢复哪些线程的执行( )

A,通过调用stop()方法而停止的线程。

B,通过调用sleep()方法而停止的线程。

C,通过调用wait()方法而停止的线程。

D,通过调用suspend()方法而停止的线程。

答案:D

        suspend可以挂起一个线程,就是把这个线程暂停了,它占着资源,但不运行,用resume是恢复挂起的线程,让这个线程继续执行下去。


十三。 Hashtable和HashMap的异同

同:都使用哈希表来存储键值对,在数据结构上基本相同,都创建了一个继承自Map.Entry的私有内部类Entry,每一个Entry对象表示存储在哈希表中的一个键值对。

1. Hashtable是同步的,线程安全的(就是一些公开的方法比如get()使用了synchronized描述符,而遍历视图比如keySet使用了Collection.synchronizedSet进行同步包装);而HashMap不是同步的,线程不安全

2. Hashtable不支持nullkey和nullvalue,它会抛出异常,而HashMap支持,因为HashMap在实现的时候,将null的hashCode值定为0,从而将其存放在哈希表的第0个bucket中

3. 、Hashtable已经被淘汰了,尽量少用,不需要线程安全就用HashMap,需要就用ConcurrentHashMap。

4.,Hashtable产生于JDK1.1,而HashMap产生于JDK1.2,HashMap比Hashtable出现的晚一点

5. HashMap继承自抽象类AbstractMap,而Hashtable继承自抽象类Dictionary,而Dictionary类是一个已经废弃的类


十四。 并发操作会带来哪些数据不一致性? A不可修改、不可重复读、脏读、死锁 B丢失修改、脏读、死锁 C不可重复读、脏读、死锁

D 丢失修改、不可重复读、脏读


脏读:就是指当一个事务对数据进行了修改但还没有提交到数据库时,另一个事务访问并使用了这个数据。
不可重复读:在一个事务内两次读数据之间,第二个事务访问该数据并进行了修改。
丢失修改:两个事务读入同一数据并修改,T2提交的结果破坏了T1提交的结果。例如T1读A修改为A-1,T2也读A修改为A-1(实际上应该是读A-1,修改为A-2)
幻影读:同一事务在两个不同的时间段执行相同的查询条件得到的结果不一致。
注意区分:
不可重复读的重点是修改 
同样的条件 ,   你读取过的数据 ,   再次读取出来发现值不一样了 
幻读的重点在于新增或者删除 
同样的条件 ,   第 1 次和第 2 次读出来的记录数不一样。

十五。下列的()原始类型在使用流时可以互换。
A.byte和boolean 
B.char和int
C.byte和char
D.String和char

正确答案:B
B。【解析】本题考查Java语言中字节类型的概念。在Java语言中,byte是字节类型,用1字节表示;boolean是布尔类型,用true和false表示,它们的表示方法并不一样,也不提供它们之间的转换,选项A错误。Java内部用整数来表示char,通常可以在方法调用和其他语句中互换使用char和int,选项B正确。char用2字节表示,byte字节类型用1字节表示,Java内部也不允许互换使用它们,选项C错误。String在Java语言中是一个类,它提供对字符串的一系列操作,而char是Java语言中的一个基本类型,它不是一个类,两者有本质的区别,故而它们是不能互换使用的,选项D错误。需要注意的是,在Java语言中提供的类都是以大写字母开头,基本类型都用小写字母表示。

总结

以上是生活随笔为你收集整理的Java面试日常总结大杂烩的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。