(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76358391冷血之心的博客)
马上就要秋招了,新的一轮笔试面试马上就要开始轰炸了,在这关键的节骨眼上,要做到查缺补漏,夯实基础,特此总结~
-
Java基础概念
-
Java和C++的区别:
- 都是面向对象的语言,都支持封装、继承和多态
- 指针:
- Java不提供指针来直接访问内存,程序更加安全
- 继承:
- Java的类是单继承的,C++支持多重继承
- Java通过一个类实现多个接口来实现C++中的多重继承
- Java中类不可以多继承,但是!!!接口可以多继承
- 内存:
- Java有自动内存管理机制,不需要程序员手动释放无用内存
-
Java中值传递和引用传递:
- 值传递:
- 对象被值传递,意味着传递了对象的一个副本,即使副本被改变,也不会影响源对象。
- 引用传递:
- 对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象的改变会反映到所有的对象上。
- 值传递:
-
创建对象的4种方式:
- new语句创建对象
- 使用反射创建对象
- 调用对象的clone()方法创建对象
- 使用反序列化,调用java.io.ObjectInputStream对象的readObject()方法
- 内部类可以访问创建它的外部类对象的成员,包括私有成员
-
JDK中常用的包:
- java.lang:唯一一个不需要导入就可以用的包,基础类
- java.io
- java.net
- java.util
- java.sql
-
JDK,JRE和JVM的联系和区别:
-
JDK:
- java开发工具包,是java开发环境的核心组件,并提供编译、调试和运行一个java程序所需要的所有工具,可执行文件和二进制文件,是一个平台特定的软件
-
JRE:
- java运行时环境,是JVM的实施实现,提供了运行java程序的平台。JRE包含了JVM,但是不包含java编译器/调试器之类的开发工具
-
JVM:
- java虚拟机,当我们运行一个程序时,JVM负责将字节码转换为特定机器代码,JVM提供了内存管理/垃圾回收和安全机制等。这种独立于硬件和操作系统,正是java程序可以一次编写多处执行的原因
-
区别:
- JDK用于开发,JRE用于运行java程序
- JDK和JRE中都包含JVM
- JVM是java编程语言的核心并且具有平*立性。
-
JDK:
-
Java和C++的区别:
-
面向对象编程:
-
覆盖和重载
- 覆盖:
- 子类对父类方法的一种重写,只能比父类抛出更少的异常,访问权限不能比父类的小。
- 被覆盖的方法不能是private的,否则只是在子类中重新定义了一个方法
- 重载:
- 表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数、顺序和类型不同)
- 重载的三个条件:参数类型不同、参数个数不同、参数顺序不同
- 覆盖:
-
构造器:
- 构造函数不可以被继承,所以不可以覆盖,只可以重载
- 一个类,如果构造函数被private修饰,则为不明确的构造函数,即其不可以被子类继承(原因下边解释)
-
java的初始化顺序:
- 初始化父类中的静态成员变量和静态代码块
- 初始化子类中的静态成员变量和静态代码块
- 初始化父类的普通成员变量和代码块,再执行父类的构造方法
- 初始化子类的普通成员变量和代码块,再执行子类的构造方法
- (如果父类构造函数是私有的,则不可以被执行,所以解释了为什么父类不可以被继承)
-
equals和hashcode的关系:
- 当两者equals时,则hash code 值一定相同,反之不成立。
-
覆盖和重载
-
字符串:
-
String s = new String("xyz");创建了几个字符串对象?
- 答:两个对象,一个是静态存储区的“xyz”,一个是用new创建在堆上的对象。
-
String s = "Hello" ;s = s+"world";则原始的String对象中的内容到底变了没有?
- 没有,String是不可变类。在这段代码中,s原先指向一个String对象,内容是hello,然后我们对s进行了+操作。s指向了另外一个String对象,内容是hello world。原来的那个对象还在内存,只不过引用变量s不再指向它了。
-
String s = “a”+"b"+"c"+"d";共创建了多少个对象?
- 答案:1个对象。由于编译器对字符串常量直接相加的表达式进行了优化。编译时即可去掉+号,直接将其编译成一个常量相连的结果。
-
String s = new String("xyz");创建了几个字符串对象?
-
Java中NIO学习笔记:
- NIO在JDK1.4中引入,提供了高速、面向块的I/O
-
流与块的比较:
- 原来的IO和NIO的最重要区别就是数据打包和传输的方式,前者以流的方式处理数据,后者以块的方式处理数据
- 面向流的IO系统一次一个字节的处理数据,面向块的IO系统每一步中产生或者消费一个数据块。
- 核心概念:
-
缓冲区(Buffer):发送给一个通道的所有对象都必须首先放在缓冲区中。
-
状态变量:
- 每一个读/写操作都会改变缓冲区的状态。通过记录和跟踪这些变化,缓冲区就可能够内部地管理自己的资源。
-
position
- 缓冲区实际就是数组,position变量指定了下一个字节将放到数组的哪一个元素中
-
limit
- 该变量表明还有多少数据需要取出或者还有多少空间可以放入数据
-
capacity
- 该变量表明可以储存在缓冲区中的最大数据容量,即底层数组的大小。
-
访问方法:
-
flip()方法:
- 当我们将缓冲中的数据输出到通道中前,要调用flip()方法,该方法的功能如下:
- 将limit设置为当前的position
- 将position设置为0
-
clear方法:
- 调用缓冲区的clear()方法,以便缓冲区接收更多的字节。clear方法功能如下:
- 将limit设置为与capacity相同
- 将position设置为0
- 调用缓冲区的clear()方法,以便缓冲区接收更多的字节。clear方法功能如下:
- 当我们将缓冲中的数据输出到通道中前,要调用flip()方法,该方法的功能如下:
-
flip()方法:
-
状态变量:
- 通道(Channel):从通道中读取任何数据也必须首先读取到缓冲区里。
-
选择器(Selector):
- Selector是异步I/O中的核心对象。Selector就是您注册对各种I/O事件的兴趣的地方,而且当那些事件发生时,就是这个对象告诉您所发生的事件。
- 创建选择器:Selector s = Selector.open()
- 我们将对不同的通道对象调用register()方法,以便注册我们对这些对象中发生的I/O事件的兴趣。register()的第一个参数就是这个Selector对象。
-
缓冲区(Buffer):发送给一个通道的所有对象都必须首先放在缓冲区中。
- NIO的大致流程:
- 输入文件->缓冲区->通道->缓冲区->程序处理数据->缓冲区->通道->缓冲区->输出文件
- NIO读取文件示例:
- NIO写入文件示例:
如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~
本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。