Java基础部分
1. Java跨平台原理
Java通过不同的系统、不同版本、不同位数的Java虚拟机(JVM)来屏蔽不同的系统指令集差异,而对外统一的接口(Java API)。对开发者而言,按照接口开发即可。部署系统则只需要在不同的环境中安装对应版本的虚拟机即可。
2. 搭建一个Java开发环境
- 下载适用开发环境的jdk安装,配置好
JAVA_HOME
,java应用(eclipse、tomcat等)会依赖于这个变量。 - 下载安装eclipse,设置workspace的默认编码。
- 下载安装tomcat,把tomcat集成到eclipse中。
- 安装其他开发插件。
3. Java基础类型、占用字节及默认值
数据类型 | 大小(二进制位) | 范围 | 默认值 |
---|---|---|---|
byte | 1字节(8bit) | -128~127 | 0 |
short | 2字节(16bit) | -32768~32767 | 0 |
int | 4字节(32bit) | -2(31) ~ 2(31)-1 | 0 |
long | 8字节(64bit) | -2(31) ~ 2(31)-1 | 0 |
float | 4字节(32bit) | -2(63) ~ 2(63)-1 | 0.0f |
double | 8字节(64bit) | -2(63) ~ 2(63)-1 | 0.0d |
char | 2字节(16bit) | \u0000~\uffff | \u0000 |
boolean | 1字节(1bit) | true/false | false |
4. 面向对象的特征
面向对象的四大特征:封装、抽象、继承、多态。
- 封装:将对象封装为一个高度自治和相对封闭的个体,对象状态(属性)由这个对象自己的行为(方法)来读取和改变。
- 抽象:把现实生活中一些事物相似和共性之处归为一类,忽略和当前主题无关的方面,抽象为类。
- 继承:把一个已经存在的类所定义的内容作为自己的内容,并且可以加入自己的内容,或者修改原来的方法使之适用于当前特殊的需要。
- 多态:父类或者接口定义的引用变量可以指向子类或者具体实现类的实例对象,而程序调用的方法在运行期才动态绑定。就是引用变量所指向的具体类型实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
5. 装箱与拆箱
- 装箱:把基本的数据类型转换成对于的包装类型。
- 拆箱:就是把包装类型转换为基本数据类型。
Integer i=1;//自动装箱,实际编译会调用Integer.valueOf方法来装箱
int j= i;//自动拆箱 实际在编译调用intValue int j = i.intValue();
- Java是面向对象的语言,而基本数据类型,不具备面向对象的特性。
- 缓存值:对象缓存,基本数据类型会有对象缓存。
Integer i=1;
Integer j=1;
i==j;//对象相等,是因为存在缓存值对象,所以i、j指向同一个对象
6. ==和equals方法的区别
-
== 用来判断两个变量之间的值是否相等,
如果是基本数据类型的变量值直接比较值,引用类型比较要比较对应的引用的内存地址的首地址。 - equals 用来比较两个对象是否一样,判断某些特征是否一样,实际上是调用对象的equals方法进行比较。
7. String 、StringBuilder、StringBuffer的区别
- 都是用来表示和操作字符串,也就是多个字符的集合的类。
- String 是内容不可变的字符串。底层使用的是一个不可变的字符数组(final char[]);
- StringBuilder、StringBuffer是内容可改变的字符串,底层使用的是可变的字符数组(没有使用final来修饰)。
- 拼接字符串不能使用String进行拼接,要使用StringBuilder、StringBuffer来拼接。因为String会创建很多新对象,StringBuilder、StringBuffer不会。
- StringBuilder是线程不安全的,效率高;
StringBuffer是线程安全的,效率低,底层有加同步锁。
8. Java中的集合
- Java中的集合分为value、key-value(collection Map)两种。
- 存储值分为List和Set
- List 是有序的,可以重复。
- Set 是无序的,不可重复的,根据equals和hashcode判断,因此一个对象要存储在Set里面,必须重写equals和hashcode的方法。
- 存储key-value的为Map
9. ArrayList与linkedList的区别
- ArrayList底层使用的是数组,linkedList使用的是链表。
- 数组具有索引,查询特定的元素比较快,而插入和删除元素比较慢(数组在内存中是一块连续内存时,如果插入或删除是需要移动内存的)。
- 链表不要求内存是连续的,在当前元素下存放上一个或下一个元素的地址,查询时需要从头部开始,一个个的查找,所以查询效率低。插入时不需要移动内存只需要改吧引用指向即可,所以插入或删除效率高。
- 使用场景
- ArrayList使用在查询比较多,但是插入和删除比较少的情况。
- linkedList 使用在查询比较少,插入和删除比较多的情况。
10. HashMap与HashTable的区别,及ConcurrentHashMap
- 相同点
- 都可以用来存储key-value的数据
- 不同点
- HashMap是可以可以把null作为key或value的,而hashtable是不可以的。
- HashMap是线程不安全的,效率比较高。hashTable是现场安全的,但是效率低。
- ConcurrentHashMap
通过把整个Map分为N个Segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。
11. 实现一个拷贝文件的工具类,使用字节流还是字符流
拷贝的文件不确定是只包含字符流,有可能包含字节流(图片、声音、影像等),为考虑通用性,要使用字节流。