1.Java 的跨平台原理.
答: 各操作系统支持的指令集不是完全一致的, 这导致程序在不同的系统上要执行不同的程序代码. Java 开发了适用于不同操作系统的 Java 虚拟机 (JVM) 来屏蔽各个系统之间的差异, 提供统一的接口.
2.Java 中 int 数据占几字节? 有几种基本的数据类型?
答: 有 8 种基本的数据类型, 分别是 boolean,byte,short,int,long,float,double,char, 其中 int 型数据占 4 个字节.
3.Java 种有了基本数据类型, 为什么还需要包装类型?
答: 因为 Java 是一种面向对象的语言, 而基本数据类型不具备面向对象的特征.
基本数据类型和包装类型为一一对应关系, 如下表:
byte | short | int | long | float | double | char | boolean |
Byte | Short | Integer | Long | Float | Double | Character | Boolean |
举例: 用 int 和 Integer 表示 Person 的 ID, 在判断 P 尔松是否存在的时候需要判断 ID, 判断 Integer 类型的时候只需要判断是否为 null 即可, 而 int 型需要判断值是否为 0.
拓展内容: 装箱和拆箱.
装箱: 把基本数据类型转换成相对应的包装类型. 装箱又分为自动装箱和手动装箱.
(1)手动装箱: 例如 Integer i = Integer.ValueOf( 1 );
(2)自动装箱: 例如 Integer i = 1; 实际上在编译过程中调用了 Integer.ValueOf( )方法来装箱.
拆箱: 把包装类型转换成对应的基本数据类型.
(1)手动拆箱: 例如 int j = i = intValue();
(2)自动拆箱: 例如 int j = i; 实际上在编译过程中调用了 IntValue()方法来拆箱.
4. 面向对象特征有哪些方面?
答: 封装, 抽象, 继承, 多态. 回答抽象问题时需举例说明!
封装: 将对象封装成一个高度自治和相对封闭的个体, 对象的状态 (属性) 由这个对象自己给出的行为 (方法) 来读取和改变.
EX: 张三, 他都而名字等属性, private name,setName,getName
抽象: 找出一些事物相似和共性之处, 然后将这些事物归为一个类, 只考虑相似和共性之处.
继承: 在定义和实现一个类的时候, 可以在一个已经存在的类的基础上进行, 将父类定义的内容作为自己的内容, 并可以加入新的内容或修改原来的方法使之更适合特殊需要.
多态: 指程序中定义的引用变量所指向的具体类型和通过改引用变量发出的方法调用子啊编程时并不确定, 而是在程序运行期间动态绑定.(通俗一点理解就是工具都摆在那儿, 但是哪个在什么时候用并不清楚, 只有在真正工作的时候需要哪个就用哪个)
- EX:
- Object obj=new XXX();
- UserDao userDao=new UserDaoJdbclmpl();
- UserDao userDao=new UserDaoHibernatelmpl();
理解: 考的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象, 而程序调用方法在运行期间才动态绑定, 就是引用变量所指向的具体实例对象的方法, 也就是内存里正在运行的那个对象方法, 而不是引用变量的类型种定义的方法.
6.equals 方法和 "==" 有什么区别?
答:"==" 是用来判断两个变量的值是否相等. 其中基本数据类型直接比较值, 引用类型需要比较对应的引用的内存首地址.
equals 用来比较两个对象是否长得一样(字符串比较常用), 判断某些特征是否一样. 实际上就是调用 Object 的 equals 方法进行比较.
7.String 和 StringBuilder 的区别? StringBuilder 和 StringBuffer 的区别?
答: Java 种提供了三个类来表示和操作字符串: String,StringBuilder,StringBuffer
String 用于表示内容不可变的字符串, 因为 String 底层使用了一个不可变的字符数组(使用了 final 修饰符修饰的 char[ ]).
StringBuilder 和 StringBuffer 表示的字符串内容可变, 底层使用的字符数组没有 final 修饰符.
最经典的就是字符串拼接:
String 进行拼接如下: String c = "a"+"b";(需要一个中间变量 c 进行过度, a 与 b 的内容不可变)
StringBuilder 和 StringBuffer 进行拼接如下:
- StringBuilder sb = new StringBuilder( );
- sb.apend("a").apend("b");
StringBuilder 和 StringBuffer 的区别是: StringBuilder 是线程不安全的, 但是效率高; StringBuffer 是线程安全的, 按时效率低. 通常我们使用较多的是 StringBuilder, 只有限定线程安全时才使用 StringBuffer.
8. 陈述一下对 Java 种集合的理解?
答: 根据存储分为值存储和 key--value 存储, 即 Collection 和 map
(1)存储值: List 和 Set, 区别是 List 是有序的, 可重复的; Set 是无序的, 不可重复的. 是否重复要根据 equals 和 hashcode 判定.
如果一个对象要存储在 Set 种必须重写 equals 和 hashcode 方法.
(2)存储 key--value:map
9.ArrayList 和 LinkedLinst 的区别?
答: ArrayList 底层使用的是数组, LinkedList 底层使用的是结点连成的链表.
数组在在内存中是一块连续区域, 插入删除是需要移动内存, 所以进行插入和修改操作时效率低, 但是因为有索引, 进行查询操作时效率高.
链表不要求内存连续, 在当前元素中存放下一个 / 上一个元素的地址, 插入时不需要移动内存, 只需要改变引用指向即可, 插入删除效率高, 到那时查询的时候每次都需要从头节点开始一个个找索引, 进行查询操作的时候效率低.
10.HashMap 和 HashTable 区别? Hashmap 和 ConcurrentHashMap 区别?
答: HashMap 和 HashTable 都可以用来存储 key--value 的数据.
区别: HashMap 可以吧 null 作为 key 或者 value, 而 HashTable 不可以; HasMap 线程不安全, 效率高, HashTable 线程安全, 效率低.
既想线程安全, 又想效率高(ConcurrentHashMap)
通过把整个 Map 分为 n 个 Segment(类似于 HashTable); 可以提供相同的线程安全, 但是效率提升 n 倍, 默认为 16 倍.
11. 实现一个拷贝文件的工具使用字节流还是字符流?
答: 文件不确定是只包含字符流, 有可能有字节流(图片, 声音, 图像等), 为考虑通用性, 要使用字节流.
12. 线程的几种实现方式? 怎么启动? 怎么区分? 什么是线程池? 什么是线程并发库?
进程: 运行中的应用程序, 每个进程都有自己独立的内存空间.
线程: 进程中的一个实体, 被系统独立独立调度和分派的基本单位, 有就绪, 阻塞, 运行三种基本状态. 一个进程可以有多个线程(即多线程编程)
实现:(1)通过继承 Thread 类实现一个线程
(2)通过实现 runnable 接口实现一个线程
继承的扩展性不强, Java 总是支持单继承, 如果一个类继承了 Thread 就不能继承其他类了.
启动: 调用 start 方法
- Thread theard = new Thread(继承了 Thread 的对象 / 实现了 runnable 的对象);
- thread.satrt;
启动了以后执行的是 run 方法.
区分:
thread.setName("设置一个线程名称")
EX: 一个系统中有很多线程, 每个线程都会打印日志, 怎么区分是哪个线程打印的.
这是一个规范, 在创建线程完成后都需要设置名称.
并发库:(简单了解过)
Java.util.current 包中提供了对线程优化, 管理的各项操作, 使得线程的使用变得得心应手, 提供了线程的运行, 线程池的创建, 线程生命周期的控制.
线程池: Java 通过 Executors 提供四个静态方法创建四种线程池:
newCachedThreadPool: 可缓存线程池, 若线程池长度超过处理需要, 可灵活回收空闲线程, 若无可回收则新建新城.
newFixedThreadPool: 定长线程池, 可控制线程最大并发数, 超出的线程会在队列等候.
newScheduledThreadPool: 预定线程池, 支持定时和周期性任务执行.
newSingleThreadPool: 单线程化的线程池, 只会用唯一的工作线程来执行任务, 并保证所有任务按照指定顺序执行.
线程池的作用:
(1)限定线程的个数, 不会导致由于线程过多导致系统运行缓慢或崩溃
(2)线程池在开始不需要每次都去创建或销毁, 节约了资源
(3)响应时间快
13. 什么是设计模式? 常用的有哪些?
答: 在设计过程中可以反复使用的, 可以解决特定问题的设计方法.
单例模式:(1)构造方法私有化, 让除了自己类中能创建外其他大方都不能创建
(2)在自己类中创建一个单实例
(3)提供一个方法获取该单实例对象
单例模式又分为饱汉模式 (一出来就创建单实例) 和饥汉模式(需要的时候才创建, 创建时需要进行方法同步)
工厂模式: Spring IoC 对象的创建交给一个工厂
代理模式: Spring AOP 使用动态代理
来源: http://www.bubuko.com/infodetail-2991055.html