Java开发校招面试考点(不熟悉的知识点)

1、匿名内部类的特点

2、接口中的成员变量默认是?,以及为什么?

3、Java中是否可以覆盖(override)一个private或者是static或者final的方法?

4、 我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,请你讲讲如何输出一个某种编码的字符串?

5、不可变类

6、请解释Java中的概念,什么是构造函数?什么是构造函数重载?什么是复制构造函数?

7、反射

8、内部类

9、可以修饰类的修饰符

10、为什么接口的成员变量默认都是public static final的

11、Java中是否可以覆盖(override)一个private或者是static或者final的方法?

12、B树、B+树、B*树

13、请简述一下线程的sleep()方法和yield()方法有什么区别?

14、Java中有几种方法可以实现一个线程?

15、sleep、suspend、yield、stop、wait

16、请简短说明一下你对AQS的理解。

17、JVM内存结构

18、垃圾收集算法

19、垃圾收集器

20、空间分配担保

21、请问java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

22、MyISAM与InnoDB的理解

23、视图

24、drop,delete与truncate的区别

25、强一致性、弱一致性、最终一致性

26、连续分配、非连续分配

27、TCP/IP体系结构

28、各层协议

29、CSMA/CD

30、A/B/C类地址

31、IP地址和MAC地址的区别

32、icmp协议

33、UDP,TCP的特点

34、停止等待协议、连续ARQ协议、TCP的流量控制、TCP的拥塞控制

答案
1、
1)匿名内部类不能有构造函数
2)匿名内部类不能定义静态成员、方法、类
3)匿名内部类不能被public、protected、private以及static修饰符的。
4)只能创建匿名内部类的一个实例(因为匿名内部类没有名字,所以只能在new的时候创建一个实例)
5)一个匿名内部类一定在new后面,这个匿名内部类继承一个父类或者实现一个接口。
6)匿名内部类为局部内部类,所以局部内部类的所有限制对匿名内部类都生效。

2、public static final,
public:使接口的实现类可以用这个变量。
static:static修饰就表示它属于类的,随的类的加载而存在的,如果是非static的话,就表示属于对象的,只有建立对象时才有它,而接口是不能建立对象的,所以接口的常量必须定义为static.
final:final修饰就是保证接口定义的常量不能被实现类去修改,如果没有final的话,由子类随意去修改的话,接口建立这个常量就没有意义了。

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

4、

Public String translate (String str) {
 String tempStr = “”;
 try {
 tempStr = new String(str.getBytes(“ISO-8859-1″), “GBK”);
 tempStr = tempStr.trim();
 }
 catch (Exception e) {
 System.err.println(e.getMessage());
 }
 return tempStr;
 }

String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,与getBytes相对的,可以通过new String(byte[], decode)的方式来还原。
故tempStr = new String(str.getBytes(“ISO-8859-1″), “GBK”);是将ISO-8859-1类型的编码转换成了GBK类型。

5、所有基本类型的包装类都是不可变类,String也是不可变类。

6、当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。
Java中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。
构造函数必须与类名相同
构造函数不能有返回值(返回值也不能为void)
构造函数不能被继承
子类可以通过super显式的调用父类的构造函数
构造函数的权限修饰符的默认修饰符和当前类的权限修饰符一致

Java不支持像C++中那样的复制构造函数。

7、
反射机制允许程序在运行时进行自我检查,同时也允许对其内部成员进行操作。
一、反射的功能有四种
1、得到一个对象所属的类
2、获得一个类的所有成员变量和方法
3、在运行时创建对象
4、在运行时调用对象的方法

想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是字节码文件对象。

二、获取字节码文件对象的三种方式。
1、Class clazz1 = Class.forName(“全限定类名”);  
在这里插入图片描述
2、Class clazz2 = 类.class;   
在这里插入图片描述
3、Class clazz3 = 实例.getClass();    
在这里插入图片描述
我们一般选中第一种方式(Class.forName(“全限定类名”))。

8、
内部类有4种:
静态内部类、成员内部类、局部内部类、匿名内部类。

1、成员内部类
成员内部类是最普通的内部类,它的定义为位于另一个类的内部,形如下面的形式:

class Circle {
    double radius = 0;
     
    public Circle(double radius) {
        this.radius = radius;
    }
     
    class Draw {     //内部类
        public void drawSahpe() {
            System.out.println("drawshape");
        }
    }
}

2、静态内部类:
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。
静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法

public class Test {
    public static void main(String[] args)  {
        Outter.Inner inner = new Outter.Inner();
    }
}
 
class Outter {
    public Outter() {
         
    }
     
    static class Inner {
        public Inner() {
             
        }
    }
}

3、局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

class People{
    public People() {
         
    }
}
 
class Man{
    public Man(){
         
    }
     
    public People getWoman(){
        class Woman extends People{   //局部内部类
            int age =0;
        }
        return new Woman();
    }
}

4、匿名内部类
匿名内部类也就是没有名字的内部类正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写。
本质:匿名内部类会隐式的继承一个类或者实现一个接口,或者说,匿名内部类是一个继承了该类或者实现了该接口的子类匿名对象。
匿名内部类的前提条件:必须继承一个父类或实现一个接口
实例1:不使用匿名内部类来实现抽象方法

abstract class Person {
    public abstract void eat();
}
class Child extends Person {
    public void eat() {
        System.out.println("eat something");
    }
}
public class Demo {
    public static void main(String[] args) {
        Person p = new Child();
        p.eat();
    }
}

运行结果:eat something

实例2:匿名内部类的基本实现

abstract class Person {
    public abstract void eat();
}
public class Demo {
    public static void main(String[] args) {
        Person p = new Person() {
            public void eat() {
                System.out.println("eat something");
            }
        };
        p.eat();
    }
}

运行结果:eat something

实例3:在接口上使用匿名内部类

interface Person {
    public void eat();
}
public class Demo {
    public static void main(String[] args) {
        Person p = new Person() {
            public void eat() {
                System.out.println("eat something");
            }
        };
        p.eat();
    }
}

注意:
1)匿名内部类不能有构造函数
2)匿名内部类不能定义静态成员、方法、类
3)匿名内部类不能被public、protected、private以及static修饰符的。
4)只能创建匿名内部类的一个实例(因为匿名内部类没有名字,所以只能在new的时候创建一个实例)
5)一个匿名内部类一定在new后面,这个匿名内部类继承一个父类或者实现一个接口。
6)匿名内部类为局部内部类,所以局部内部类的所有限制对匿名内部类都生效。

9、
外部类只能被public、默认访问权限(即default)、abstract、final修饰,不能被private和protect修饰。(原因:https://blog.csdn.net/yangyong0717/article/details/78379760)
成员内部类和静态内部类可以被public、默认访问权限(即default)、private、protect、abstract、final修饰。**

这些修饰符只能修饰成员变量,不能修饰局部变量。
局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
匿名内部类也不能被public、protected、private以及static修饰符的。(在某种情况下,匿名内部类也可以认为是一个局部变量)

10、public:使接口的实现类可以用这个变量。
static:static修饰就表示它属于类的,随的类的加载而存在的,如果是非static的话,就表示属于对象的,只有建立对象时才有它,而接口是不能建立对象的,所以接口的常量必须定义为static.
final:final修饰就是保证接口定义的常量不能被实现类去修改,如果没有final的话,由子类随意去修改的话,接口建立这个常量就没有意义了。

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

12、https://blog.csdn.net/u014138443/article/details/89741129

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

14、有三种实现方法,分别是1、继承Thread类,重写run()方法(Thread类其实也是实现Runnable接口的一个实例)。2、实现Runnable接口,重写run()方法。3、实现Callable接口,重写call()方法。实现Callable接口的好处是当任务结束后可以提供一个返回值。

15、
sleep/suspend/yield不释放锁
stop/wait释放锁

16、
https://www.cnblogs.com/waterystone/p/4920797.html

17、
程序计数器
java虚拟机栈:存储局部变量表,操作栈,动态链接,方法出口等信息,局部变量表里面存储的是各种基本数据类型、对象引用等
本地方法栈
堆:所有对象实例和数组都在堆上分配。
方法区:用于存储已被虚拟机加载的类信息、常量、静态变量

18、
一、标记清除算法
二、复制算法(Copying)
三、标记-整理算法
四、分代收集算法

19、
Serial收集器
CMS收集器:以获取最短回收停顿时间为目标的收集器,CMS收集器是基于标记清除算法实现的
G1收集器

20、
只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小就会进行Minor GC,否则将进行Full GC。

21、
字节流,字符流。
字节流:InputStream(字节输入流)、OutputStream(字节输出流);
字符流:Reader(字符输入流)、Writer(字符输出流);
字节流和字符流的区别:字节流不用缓存,字符流用到了缓存

22、Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,

22、
关于二者的对比与总结:
1、InnoDB是聚集索引,支持事务,支持行级锁;
2、MyISAM是非聚集索引,不支持事务,只支持表级锁。
3、 MyISAM 强调的是性能,每次查询具有原子性,其执行速度比InnoDB类型更快
4、 MyISAM不支持外键,而InnoDB支持外键。
5、MyISAM更适合读密集的表,而InnoDB更适合写密集的的表。

23、视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询;对视图的更新将对基表进行更新;

24、
drop直接删掉表
truncate删除表中所有的数据,且不能回滚
delete删除表中数据,可以加where字句,可以回滚。

25、
对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性,如果能容忍后续的部分或者全部访问不到,则是弱一致性。如果经过一段时间后要求能访问到更新后的数据,则是最终一致性。

26、
连续分配
连续分配指程序装入的内存空间是连续的。
连续分配分为:
1、单一连续分配 一个作业进入内存,直到操作完毕才释放内存
2、固定分区分配 将内存空间划分为若干个固定大小的连续存储区,每个存储区的大小可以一样,也可以不一样。容易产生内存碎片。
3、动态分区分配
动态分区分配的分配方法有:首次适应法、最佳适应法、最坏适应法。
缺点是经过一段时间后,会产生大量容量较小的内存,形成内存碎片。
4、 动态重定位分区分配
将内存碎片移动在一起,集中成一个较大的空闲分区,移动的过程就叫紧凑。
紧凑的时机有:立即紧凑、需要时紧凑

非连续分配
分页管理方式
分段管理方式
段页式管理方式

具体内容:
分页管理方式:将内存划分成等长的若干区域,每个区域称为一个物理页面(也称为块)。再将用户程序按照物理页面的大小进行划分,称为逻辑页面,每个物理页面存放一个逻辑页面。块间不连续,但快内连续。
页表存放的是物理块号和程序逻辑页号之间的映射。
快表:用来存放最近访问过的部分页表的项

分段管理方式:将用户的作业按逻辑结构划分为若干相互独立的段,每个段占据一段连续的内存空间,各段之间可以不连续。

段页式管理方式:按照分段式管理方式,将用户的作业按逻辑结构划分为若干相互独立的段,再按照分页管理方式将各段划分成固定页面大小。

27、TCP/IP体系结构
应用层、传输层、网际层、网络接口层

28、
应用层:
1、万维网的HTTP协议
2、支持电子邮件的SMTP协议
3、支持文件传送的FTP协议

传输层:
TCP
UDP

网络层:
IP协议
路由协议
ICMP协议

数据链路层:
CSMA/CD协议
PPP协议(点对点协议)

29、
以太网为了协调总线传输资源的使用,采用了CSMA/CD协议:先听后发,边听边发,碰撞停止,随机重发,使用CSMA/CD的以太网是半双工通信

30、
在这里插入图片描述
在这里插入图片描述
A类地址网络数减2是因为全0和全1都不能分配
B类地址网络数减1是因为最小的地址不分配
C类地址网络数减1是因为最小的地址不分配

A、B、C类主机数数减2是因为全0和全1都不能分配,全0代表本主机,全1代表该网络的所有主机

31、IP地址是网络层以及网络层以上各层适用的地址,而MAC地址是数据链路层和物理层使用的地址

32、
网际控制报文协议,它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。ping就是应用层直接使用网络层ICMP的一个例子,用来探测两个主机之间的连通性。

33、
UDP的特点(用户数据报协议)
1、无连接
2、尽最大努力交付
3、面向报文
4、没有拥塞控制(即网络出现的拥塞不会使源主机的发送速率降低)
5、支持一对一、一对多、多对一的交互通信
6、首部开销小

TCP的特点(传输控制协议)
1、面向连接
2、每一条TCP连接只有两个端点(即点对点)
3、TCP提供可靠交付服务
4、TCP提供全双工通信
5、面向字节流

34、https://blog.csdn.net/u014138443/article/details/90384116

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值