内容简介:近段时间在准备实习的面试,在网上看到一份面试题,就慢慢试着做,争取每天积累一点点。暂时手头上的面试题只有一份,题量还是挺大的,有208题,所以可能讲的不是很详细,只是我自己帮助记忆的笔记,希望对你们有启发,同时有什么说的不准确的可以互相讨论一下。现在每天给自己在面试题编写的任务是4题,有时候忙起来可能就没有时间写了,但是争取日更,即使当天没更也会在之后的更新补上。
近段时间在准备实习的面试,在网上看到一份面试题,就慢慢试着做,争取每天积累一点点。
暂时手头上的面试题只有一份,题量还是挺大的,有208题,所以可能讲的不是很详细,只是我自己帮助记忆的笔记,希望对你们有启发,同时有什么说的不准确的可以互相讨论一下。
现在每天给自己在面试题编写的任务是4题,有时候忙起来可能就没有时间写了,但是争取日更,即使当天没更也会在之后的更新补上。
-
JDK 和 JRE 区别
- JDK全名为Java development kit
- JRE全名为Java Runtime environment
- JDK包括JRE,编译器javac,以及很多调试和分析工具,例如jconsole等等
- Java程序运行环境必须有JRE
-
==和equals的区别
- 在基本数据类型对比中,==用于对比两者是否相等,没有equals的适用
- equals是Object类的实例方法,若子类没有重写equals方法,则跟==作用一致
- 在引用数据类型对比中,==用于对比实例内存地址是否相同,若引用都指向同一对象,则返回true
- 在引用数据类型对比中,euqals的返回值取决于重写逻辑
-
两个对象的 hashCode()相同,则 equals()也一定为 true,对吗
- equals用于对比对象间是否相等
- hasCode则是给对象返回一个hash code值
- 在使用Object默认的hasCode以及equals时,equals返回为true
- 若hasCode或equals任一方法被重写,返回的结果取决于重写逻辑的实现
-
final 在 Java 中作用
- final可以修饰类,方法,变量
- final修饰类,则该类不能被继承,且类内所有方法自动指定为final方法
- final修饰方法,则该方法不能被继承,类内private隐式指定为final方法
- final修饰基本数据类型变量,则该变量需在定义时指定初始值,且后续该值不能被改变
- final修改引用类型的变量,则该变量不能再指向其他对象。
- final修饰变量,在编译时JVM已经将他作为常量,存放于常量池中
-
Java 中的 Math.round(-1.5)
- Java 中的 Math.round(-1.5) 等于-1
- Java 中的 Math.round(-1.4) 等于-1
- Java 中的 Math.round(-1.6) 等于-2
-
String 属于基础的数据类型吗
- String不属于基础数据类型,属于引用数据类型
- String拥有很多方法对字符串进行处理,翻转裁切追加等等
-
Java 中操作字符串都有哪些类?它们之间有什么区别?
- StringBuilder以及StringBuffer
- StringBuffer为线程安全的,性能较StringBuilder弱
- StringBuilder为线程不安全的,但是性能比StringBuffer好
- 若无线程安全的考虑,通常使用StringBuilder
-
String str="i"与 String str=new String(“i”)一样吗
- 不一样
- 两者的引用都存放于栈中,但是前一引用指向常量池,后一引用指向堆中对象中,对象再指向常量池
-
如何将字符串反转
- 采用递归以及二分法进行字符串反转
- 调用String中的reverse方法进行反转
- 正序遍历字符串倒序拼接字符串
- 将字符串转换成字符数组,倒序遍历数组拼接
- 正序遍历1/2长度字符串,将开头以及对应结尾的字符对调
-
String 类的常用方法
-
字符类
* charAt(int),根据索引找到索引上字符 * indexOf,寻找条件在当前字符串上的索引
-
字符串信息类
* length,字串长度 * isEmpty,判断字符串是否为空
-
字符串操作类
* trim,删除字符串中所有空格 * substring,截取一部分字符串 * toUpperCase,将字符串全变成大写 * spilt,根据条件切割字符串并返回数组 * concat,追加字符串
-
对比
* equals * compareTo
-
-
抽象类必须要有抽象方法吗
- 抽象类中可以不含有抽象方法,日常开发主要使用抽象类作为模板,若抽象类不含抽象方法,我觉得丧失了抽象类原有的功能
-
普通类和抽象类有哪些区别
- 普通类可以实例化,抽象类不可以
- 普通类不能有抽象方法,抽象类可以含有抽象方法
- 抽象类被继承时必须选择继承父类的一个构造方法
-
抽象类能使用 final 修饰吗?
- 抽象类不能用final修饰。
- final修饰的类不能被继承,抽象类设计的初衷就是为了被继承
-
接口和抽象类有什么区别?
- 接口不能有抽象方法,抽象类可以
- 接口内方法只声明不实现,抽象类的方法可以有具体实现
- 接口内变量默认为final static,抽象类变量跟普通类一致
- 接口方法默认是public
- 普通类可以实现多个接口,只能继承一个抽象类
-
Java 中 IO 流分为几种?
- 操作对象来看,分为字节流,字符流
- 流的流向来看,分为输入流输出流
- 总体来说,流分为节点流和处理流,应用了装饰模式,用处理流包装节点流,达到代码通用性
-
BIO、NIO、AIO 有什么区别?
- BIO,从发起I/O请求开始到接收结果,线程都是阻塞的
- NIO,线程发起I/O请求后立刻返回,当接收数据时,I/O通知线程,线程阻塞获取结果
- AIO,线程发起I/O请求后立刻返回,I/O操作不阻塞线程,结果通过回调函数进行返回
-
File的常用方法都有哪些?
-
获取文件名字及路径
* getName,获取文件名字 * getPath。获取文件当前路径 * getPath,获取文件绝对路径 * isAbsoulute,判断文件是否绝对路径
-
文件信息
* canRead/canWrite,是否可读/可写 * isFile,是否是文件 * isDirectory,是否是目录 * length,文件内容长度
-
文件操作
* createFile,新建一个文件/目录 * delete,删除当前文件/目录 * exists,判断文件/目录是否存在
-
-
Java 容器都有哪些?
- java容器主要分两种,单一数据类型以及键值对:Collection以及map
- Collection包括List,Set,Queue,List为有序列表,Set为无序列表,Queue为队列实现
- Map子类以及接口底层实现不一样,但是高层使用是一样的
-
Collection 和 Collections 有什么区别?
- Collection为java集合类,Collections为java集合操作类
-
Collections常用方法
* addAll * binarySearch,二分查找 * emptyList,返回一个有序空列表 * synchronizedXxx,将线程不安全的集合转换成线程安全的集合
- Collection具有Set,List,Queue子接口,用于多数据的存储以及使用
-
List、Set、Map 之间的区别是什么?
- Set为无序集合,List为有序列表,Map为键值对集合
- Set的底层实现为:Map的所有value置为null封装而成,Map的key是唯一的,所以Set不允许重复元素
- Set不允许重复元素,List允许重复元素
- Set和List只允许存储单一元素,Map允许存储有映射关系的键值对
-
HashMap 和 Hashtable 有什么区别?
- HashMap为线程不安全,Hashtable线程安全
- HashMap允许使用null作为key或value,Hashtable不允许
- Hashtable使用Enumeration遍历,HashMap没有专门的迭代器,但是可以通过遍历key的集合或者entry对,也可以使用java8的函数接口进行遍历
-
如何决定使用 HashMap 还是 TreeMap?
- HashMap为无序集合,TreeMap为有序集合
- HashMap底层存储结构为数组,TreeMap为红黑树
- 数据量大且需要按照key排序时,使用TreeMap
- 数据量小且对顺序无要求时,使用HashMap
- 若查找操作占大部分时,使用HashMap,插入删除大部分时使用TreeMap
-
说一下 HashMap 的实现原理?
- HashMap底层封装了一个Entry数组,元素位置基于Object类的hashCode函数计算
- 当出现哈希冲突时,采用拉链法解决冲突
- 数组的初始大小由capacity决定,默认是16
- 当数组达到一定限度时,触发到负载因子的极限,数组进行动态扩容,扩容后的大小为原大小的两倍
2019.4.24更新
-
说一下 HashSet 的实现原理?
- HashSet底层为HashMap,方法几乎都是调用HashMap相关方法实现
-
ArrayList 和 LinkedList 的区别是什么?
- ArrayList底层实现为数组,当数组元素个数达到数组长度时,数组将进行动态扩容
- LinkedList底层实现为链表,原则上不存在元素个数饱和的情况
- ArrayList常用于随机访问场景
- 在添加删除场景中,ArrayList主要耗时为System.arrayCopy,Linked
List则是通过for循环寻找插入位置。 * 数据量小于30,两者没有明显差别,当数据量大于容量1/10时,LinkedList的效率没有ArrayList高 * 在元素个数大致相等的情况下,两者遍历的性能差不多
-
如何实现数组和 List 之间的转换?
-
List转Array
- 调用List成员方法toArray
- for循环生成Array
-
Array转List
- 调用Arrays类方法asList
- for循环生成
-
-
ArrayList 和 Vector 的区别是什么?
- Vector为jdk1.0的集合类,内部通过数组实现,支持Enumeration遍历
- ArrayList为1.2的集合类,内部通过数组实现,支持Iterator遍历
- Vector线程同步,ArrayList线程不同步
- 内存不足时,Vector默认扩展1倍,ArrayList默认扩展1.5倍
-
Array 和 ArrayList 有何区别?
- Array可以含有基本数据类型和引用类型,ArrayList只能包括引用类型
- Array的大小是固定的,ArrayList大小可以动态增加
- ArrayList对数据的处理方法比Array多,ArrayList为Array的加强版
- Array的元素数据类型一样,ArrayList在未指定泛型的前提下数据类型可以多样
- 实际开发中Array不常用,主要用于确定元素个数的场景中。多用ArrayList
2019.04.25更新
-
在 Queue 中 poll()和 remove()有什么区别?
- 在队列不为空时,两者的作用都是返回队头元素
- 在队列为空时,使用poll方法会返回null,使用remove则会抛出NoSuchElementException异常
-
哪些集合类是线程安全的?
- Hashtable,Vector,Stack
- 由Collections的synchronizedXxx方法包装的集合
-
java.util.concurrent包中的集合
- ConcurrentHashMap
- CopyOnWriteArrayList/CopyOnWriteArraySet
-
迭代器 Iterator 是什么?
- Iterator隐藏了Collection实现类的具体细节,提供很多对集合元素进行迭代的方法
-
Iterator 怎么使用?有什么特点?
- 使用集合类的成员方法获取Iterator实例
- hasNext,检查是否具有下一迭代元素
- next,获取下一迭代元素
- forEachRemaining,java 8新增的方法,利用函数式接口进行迭代
- remove,移除底层集合元素
2019.04.26更新
-
Iterator 和 ListIterator 有什么区别?
-
相同
* 都是迭代器,都可以用于迭代Collection集合 * 都可以顺序向后遍历集合元素 * 都可以移除底层集合元素
-
不同
* ListIteaator有add方法,可以添加元素到底层集合中,位置在迭代器当前位置之前 * ListIterator可以向前遍历,Iterator不能 * ListIterator可以通过nextIndex以及preIndex定位索引位置,Iteratoor不能 * ListIterator可以通过set方法对元素进行修改
-
-
怎么确保一个集合不能被修改?
- 通过Collections工具类的静态方法unmodifiableXxx对可变集合进行封装
- 通过Collections的静态方法emptyXxx返回一个空的不可变集合
- 通过Collections静态方法singletonXxx返回带有特定对象的不可变集合
-
并行和并发有什么区别?
- 并行是指能同时处理多个任务的能力,属于计算机硬件处理范畴
- 并发是指多个任务被计算机交替执行,例如Java的多线程,属于计算机软件的范畴
-
线程和进程的区别?
- 进程是程序在计算机的一次执行活动,是操作系统分配资源的基本单位,可以单独执行
- 线程是进程的一个实体,是CPU调度和分派的基本单位,必须依附于进程执行
- 进程是计算机硬件范畴的概念,线程是计算机软件范畴的概念
- 一个进程至少由一个线程组成
2019.04.27更新
-
守护线程是什么?
- 在Java中有两类线程,用户线程与守护线程
- 守护线程独立于控制终端·并且周期性执行某种任务或等待处理某些发生的事件
- 守护线程主要为其他线程运行提供便利服务,例如GC
- 守护线程创建与用户线程大概一致,但要在线程开始之前通过成员方法setDaemon设置为守护线程
- 当所有非守护线程停止工作时,守护线程才会停止工作
-
创建线程有哪几种方式?
- 通过继承Tread并重写run方法创建
- 通过实现Runnable接口并重写run方法创建
- 通过实现Callable接口重写call方法,并使用FutureTask包装对象进行创建
-
说一下 runnable 和 callable 有什么区别?
- callable有返回值,可以通过Future接口的get方法获取,runnable没有返回值
- callable执行会阻塞线程,runnable不会
- callable的执行通过FutureTask进行包装,runnable的执行则通过Thread
- callable可以抛出异常,runnable只能在内部进行处理
-
线程有哪些状态?
- 新建,就绪,运行,阻塞,死亡五种状态
- 当调用线程类的start方法时,线程进入就绪状态,等待获得CPU时间片
- 线程得到CPU时间片时进行运行状态
- 当调用sleep方法,调用阻塞式I/O,试图获取同步监视器,suspend被调用,等待notify时,进入阻塞状态
- 当被notify,获取到资源或同步监视器时,进行就绪状态
- 当run/call方法执行完毕,抛出异常未处理或调用stop方法时,线程死亡
2019.04.28更新
-
sleep() 和 wait() 有什么区别?
- sleep属于线程类方法,wait属于Object类的方法
- sleep不会释放线程锁,wait释放线程锁
-
notify()和 notifyAll()有什么区别?
- notify和notifyAll都属于Object类的方法
- notify只会随机选择某一wait线程唤醒,notifyAll则会全部唤醒等待线程
-
线程的 run()和 start()有什么区别?
- run定义线程执行的方法体,定义完成后线程处于新建状态
- start用于线程的执行,调用后线程处于就绪状态
-
创建线程池有哪几种方式?
- 创建单线程的线程池:newSingleThreadExecutor
- 创建固定大小的线程池:newFixedThreadPool
- 创建带缓存的线程池:newCachedThreadPool
- 创建大小无限的线程池:newScheduledPool,用于定时或周期性执行任务
2019.04.29更新
-
线程池都有哪些状态?
- running:线程池一旦创建,进入running状态,接受新任务并处理现有任务
- shutdown:调用线程池shutdown方法,不接受新任务,但能处理已有任务
- stop:调用线程池shutdownNow方法,不接受新任务,不处理现有任务,中断现有任务
- tidying:当线程池处于stop并且任务队列为空时,执行terminated方法
- terminated:线程池处于tidying状态并执行完terminated方法,线程池终止
-
线程池中 submit()和 execute()方法有什么区别?
- execute提交一个Runnable对象
- submit可以提交Runnable或者Callable对象
- submit可以提交Callable对象后返回一个泛型对象
-
在 Java 程序中怎么保证多线程的运行安全?
- 通过设置符号位进行访问,但是资源浪费严重
- 通过synchronized代码同步块进行互斥资源的访问
- 通过锁机制的等待与唤醒控制资源的访问
- 通过阻塞队列控制互斥资源的数量进而控制资源的访问
-
多线程锁的升级原理是什么?
- 略
2019.05.02更新
-
什么是死锁?
- 指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外在协调,它们都将无法推进下去
-
怎么防止死锁?
-
预防死锁
- 破环互斥条件
- 破环部分分配条件
- 破环循环等待条件
- 破环不可抢占条件
-
避免死锁
- 在为申请者分配资源前检测系统状态
- 循环检测死锁是否产生
-
-
ThreadLocal 是什么?有哪些使用场景?
- 线程局部变量,为每一线程提供其副本,副本间独立
- 隔壁线程间对共享变量的竞争
- 使用场景:多线程中使用同一变量,且该变量没有线程冲突现象
-
说一下 Synchronized 底层实现原理?
- 暂未了解
-
synchronized 和 volatile 的区别是什么?
- synchronized保证操作的内存可见性,volatile保证变量的可见性
- synchronized作用在变量,代码块,方法,类,volatile作用在变量级别
- volatile保证程序从主存读取变量的值,synchronized锁定当前变量,甚至造成线程阻塞
- volatile变量不会被编译器优化,synchronized会被编译器优化
- volatile只能保证变量修改可见性,不能保证原子性;synchronized能保证变量修改可见性和原子性
-
synchronized 和 Lock 有什么区别?
- synchronized是java关键字,lock是java一个类
- synchronized线程执行完成或者执行异常自动释放锁,Lock必须显式释放锁
- synchronized无法判断锁状态,Lock可以
- synchronized会组成线程阻塞,Lock不会
- 参考: https://blog.csdn.net/u012403...
-
synchronized 和 ReentrantLock 区别是什么?
- 两者都是同一线程进入一次,锁计数器自增1,计数器变成0释放锁
- synchronized依赖JVM实现,synchronized是JDK实现的
- synchronized自动释放锁,synchronized显式释放锁
- 锁的细粒度和灵活度:ReenTrantLock优于synchronized
- ReenTrantLock可以指定公平或非公平锁,synchronized为非公平锁
- ReenTrantLock可以指定唤醒线程,synchronized只能随机或全部唤醒线程
- 参考: https://blog.csdn.net/qq83864...
-
说一下 Atomic 的原理?
- 暂未了解
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Python面试经验总结,面试一时爽,一直面试一直爽!
- 算法面试:数组编码面试问题
- 【面试虐菜】—— JAVA面试题(1)
- 如何面试-作为面试官得到的经验
- PHP面试之网络协议面试题
- 如何克服面试紧张心理 ?(面试答题篇Ⅲ)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Design Accessible Web Sites
Jeremy Sydik / Pragmatic Bookshelf / 2007-11-05 / USD 34.95
It's not a one-browser web anymore. You need to reach audiences that use cell phones, PDAs, game consoles, or other "alternative" browsers, as well as users with disabilities. Legal requirements for a......一起来看看 《Design Accessible Web Sites》 这本书的介绍吧!