一个老A忍五月火影手游忍者上架时间新S会跟着哪个A忍

&figure&&img src=&/50/v2-e48faef1f7b9b56ab1f39_b.jpg& data-rawwidth=&1620& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1620& data-original=&/50/v2-e48faef1f7b9b56ab1f39_r.jpg&&&/figure&&blockquote&&b&&i&来源:&a href=&/?target=https%3A///YHGui/easy-job/blob/master/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/YHGui/easy-j&/span&&span class=&invisible&&ob/blob/master/&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&面试题/133个Java常见面试题.md&/i&&/b&&/blockquote&&p&Java 面试随着时间的改变而改变。在过去的日子里,当你知道 String 和 StringBuilder 的区别(String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象。因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM 的 GC 就会开始工作,影响性能,可以考虑使用可变字符序列StringBuilder)就能让你直接进入第二轮面试,但是现在问题变得越来越高级,面试官问的问题也更深入。 在我初入职场的时候,类似于 Vector 与 Array 的区别、HashMap 与 Hashtable 的区别是最流行的问题,只需要记住它们,就能在面试中获得更好的机会,但这种情形已经不复存在。如今,你将会被问到许多 Java 程序员都没有看过的领域,如 NIO,设计模式,成熟的单元测试,或者那些很难掌握的知识,如并发、算法、数据结构及编码。&/p&&p&由于我喜欢研究面试题,因此我已经收集了许多的面试问题,包括许多许多不同的主题。我已经为这众多的问题准备一段时间了,现在我将它们分享给你们。这里面不但包含经典的面试问题,如线程、集合、equals 和 hashcode、socket,而且还包含了 NIO、数组、字符串、Java 8 等主题。&/p&&p&该列表包含了入门级 Java 程序员和多年经验的高级开发者的问题。无论你是 1、2、3、4、5、6、7、8、9 还是 10 年经验的开发者,你都能在其中找到一些有趣的问题。这里包含了一些超级容易回答的问题,同时包含经验丰富的 Java 程序员也会棘手的问题。&/p&&p&当然你们也是非常幸运的,当今有许多好的书来帮助你准备 Java 面试,其中有一本我觉得特别有用和有趣的是 Markham 的 Java 程序面试揭秘(Java Programming Interview Exposed)。 这本书会告诉你一些 Java 和 JEE 面试中最重要的主题,即使你不是准备 Java 面试,也值得一读。&/p&&p&该问题列表特别长,我们有各个地方的问题,所以,答案必须要短小、简洁、干脆,不拖泥带水。因此,除了这一个段落,你只会听到问题与答案,再无其他内容,没有反馈,也没有评价。为此,我已经写好了一些博文,在这些文章中你可以找到我对某些问题的观点,如我为什么喜欢这个问题,这个问题的挑战是什么?期望从面试者那获取到什么样的答案?&/p&&p&这个列表有一点不同,我鼓励你采用类似的方式去分享问题和答案,这样容易温习。我希望这个列表对面试官和候选人都有很好的用处,面试官可以对这些问题上做一些改变以获取新奇和令人惊奇的元素,这对一次好的面试来说非常重要。而候选者,可以扩展和测试 Java 程序语言和平台关键领域的知识。2015 年,会更多的关注并发概念,JVM 内部,32 位 JVM 和 64 JVM的区别,单元测试及整洁的代码。我确信,如果你读过这个庞大的 Java 面试问题列表,无论是电话面试还是面对面的面试,你都能有很好的表现。&/p&&h2&&b&Java 面试中的重要话题&/b&&/h2&&p&除了你看到的惊人的问题数量,我也尽量保证质量。我不止一次分享各个重要主题中的问题,也确保包含所谓的高级话题,这些话题很多程序员不喜欢准备或者直接放弃,因为他们的工作不会涉及到这些。Java NIO 和 JVM 底层就是最好的例子。你也可以将设计模式划分到这一类中,但是越来越多有经验的程序员了解 GOF 设计模式并应用这些模式。我也尽量在这个列表中包含 2015 年最新的面试问题,这些问题可能是来年关注的核心。为了给你一个大致的了解,下面列出这份 Java 面试问题列表包含的主题:&/p&&ul&&li&多线程,并发及线程基础&/li&&li&数据类型转换的基本原则&/li&&li&垃圾回收(GC)&/li&&li&Java 集合框架&/li&&li&数组&/li&&li&字符串&/li&&li&GOF 设计模式&/li&&li&SOLID (单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)设计原则&/li&&li&抽象类与接口&/li&&li&Java 基础,如 equals 和 hashcode&/li&&li&泛型与枚举&/li&&li&Java IO 与 NIO&/li&&li&常用网络协议&/li&&li&Java 中的数据结构和算法&/li&&li&正则表达式&/li&&li&JVM 底层&/li&&li&Java 最佳实践&/li&&li&JDBC&/li&&li&Date, Time 与 Calendar&/li&&li&Java 处理 XML&/li&&li&JUnit&/li&&li&编程&/li&&/ul&&h2&&b&120 大 Java 面试题及答案&/b&&/h2&&p&现在是时候给你展示我近 5 年从各种面试中收集来的 120 个问题了。我确定你在自己的面试中见过很多这些问题,很多问题你也能正确回答。&/p&&p&多线程、并发及线程的基础问题&/p&&p&&b&1)Java 中能创建 volatile 数组吗?&/b&&/p&&p&能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组。我的意思是,如果改变引用指向的数组,将会受到 volatile 的保护,但是如果多个线程同时改变数组的元素,volatile 标示符就不能起到之前的保护作用了。&/p&&p&&b&2)volatile 能使得一个非原子操作变成原子操作吗?&/b&&/p&&p&一个典型的例子是在类中有一个 long 类型的成员变量。如果你知道该成员变量会被多个线程访问,如计数器、价格等,你最好是将其设置为 volatile。为什么?因为 Java 中读取 long 类型变量不是原子的,需要分成两步,如果一个线程正在修改该 long 变量的值,另一个线程可能只能看到该值的一半(前 32 位)。但是对一个 volatile 型的 long 或 double 变量的读写是原子。&/p&&p&&b&3)volatile 修饰符的有过什么实践?&/b&&/p&&p&一种实践是用 volatile 修饰 long 和 double 变量,使其能按原子类型来读写。double 和 long 都是64位宽,因此对这两种类型的读是分为两部分的,第一次读取第一个 32 位,然后再读剩下的 32 位,这个过程不是原子的,但 Java 中 volatile 型的 long 或 double 变量的读写是原子的。volatile 修复符的另一个作用是提供内存屏障(memory barrier),例如在分布式框架中的应用。简单的说,就是当你写一个 volatile 变量之前,Java 内存模型会插入一个写屏障(write barrier),读一个 volatile 变量之前,会插入一个读屏障(read barrier)。意思就是说,在你写一个 volatile 域时,能保证任何线程都能看到你写的值,同时,在写之前,也能保证任何数值的更新对所有线程是可见的,因为内存屏障会将其他所有写的值更新到缓存。&/p&&p&&b&4)volatile 类型变量提供什么保证?&/b&&/p&&p&volatile 变量提供顺序和可见性保证,例如,JVM 或者 JIT为了获得更好的性能会对语句重排序,但是 volatile 类型变量即使在没有同步块的情况下赋值也不会与其他语句重排序。 volatile 提供 happens-before 的保证,确保一个线程的修改能对其他线程是可见的。某些情况下,volatile 还能提供原子性,如读 64 位数据类型,像 long 和 double 都不是原子的,但 volatile 类型的 double 和 long 就是原子的。&/p&&p&&b&5) 10 个线程和 2 个线程的同步代码,哪个更容易写?&/b&&/p&&p&从写代码的角度来说,两者的复杂度是相同的,因为同步代码与线程数量是相互独立的。但是同步策略的选择依赖于线程的数量,因为越多的线程意味着更大的竞争,所以你需要利用同步技术,如锁分离,这要求更复杂的代码和专业知识。&/p&&p&&b&6)你是如何调用 wait()方法的?使用 if 块还是循环?为什么?&/b&&/p&&p&wait() 方法应该在循环调用,因为当线程获取到 CPU 开始执行的时候,其他条件可能还没有满足,所以在处理前,循环检测条件是否满足会更好。下面是一段标准的使用 wait 和 notify 方法的代码:&/p&&br&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&c1&&// The standard idiom for using the wait method&/span&
&span class=&kd&&synchronized&/span& &span class=&o&&(&/span&&span class=&n&&obj&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&k&&while&/span& &span class=&o&&(&/span&&span class=&n&&condition&/span& &span class=&n&&does&/span& &span class=&n&&not&/span& &span class=&n&&hold&/span&&span class=&o&&)&/span&
&span class=&n&&obj&/span&&span class=&o&&.&/span&&span class=&na&&wait&/span&&span class=&o&&();&/span& &span class=&c1&&// (Releases lock, and reacquires on wakeup)&/span&
&span class=&o&&...&/span& &span class=&c1&&// Perform action appropriate to condition&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&参见 Effective Java 第 69 条,获取更多关于为什么应该在循环中来调用 wait 方法的内容。&/p&&p&&b&7)什么是多线程环境下的伪共享(false sharing)?&/b&&/p&&p&伪共享是多线程系统(每个处理器有自己的局部缓存)中一个众所周知的性能问题。伪共享发生在不同处理器的上的线程对变量的修改依赖于相同的缓存行,如下图所示:&/p&&figure&&img src=&/v2-a9557dcd20f2d034d8f2a28c643e7974_b.jpg& data-rawwidth=&520& data-rawheight=&469& class=&origin_image zh-lightbox-thumb& width=&520& data-original=&/v2-a9557dcd20f2d034d8f2a28c643e7974_r.jpg&&&/figure&&p&伪共享问题很难被发现,因为线程可能访问完全不同的全局变量,内存中却碰巧在很相近的位置上。如其他诸多的并发问题,避免伪共享的最基本方式是仔细审查代码,根据缓存行来调整你的数据结构。&/p&&h2&&b&有经验程序员的 Java 面试题&/b&&/h2&&p&&b&8)什么是 Busy spin?我们为什么要使用它?&/b&&/p&&p&Busy spin 是一种在不释放 CPU 的基础上等待事件的技术。它经常用于避免丢失 CPU 缓存中的数据(如果线程先暂停,之后在其他CPU上运行就会丢失)。所以,如果你的工作要求低延迟,并且你的线程目前没有任何顺序,这样你就可以通过循环检测队列中的新消息来代替调用 sleep() 或 wait() 方法。它唯一的好处就是你只需等待很短的时间,如几微秒或几纳秒。LMAX 分布式框架是一个高性能线程间通信的库,该库有一个 BusySpinWaitStrategy 类就是基于这个概念实现的,使用 busy spin 循环 EventProcessors 等待屏障。&/p&&p&&b&9)Java 中怎么获取一份线程 dump 文件?&/b&&/p&&p&在 Linux 下,你可以通过命令 kill -3 PID (Java 进程的进程 ID)来获取 Java 应用的 dump 文件。在 Windows 下,你可以按下 Ctrl + Break 来获取。这样 JVM 就会将线程的 dump 文件打印到标准输出或错误文件中,它可能打印在控制台或者日志文件中,具体位置依赖应用的配置。如果你使用Tomcat。&/p&&p&&b&10)Swing 是线程安全的?&/b&&/p&&p&不是,Swing 不是线程安全的。你不能通过任何线程来更新 Swing 组件,如 JTable、JList 或 JPanel,事实上,它们只能通过 GUI 或 AWT 线程来更新。这就是为什么 Swing 提供 invokeAndWait() 和 invokeLater() 方法来获取其他线程的 GUI 更新请求。这些方法将更新请求放入 AWT 的线程队列中,可以一直等待,也可以通过异步更新直接返回结果。你也可以在参考答案中查看和学习到更详细的内容。&/p&&p&&b&11)什么是线程局部变量?&/b&&/p&&p&当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,每个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本,是线程隔离的。线程隔离的秘密在于ThreadLocalMap类(ThreadLocal的静态内部类)&/p&&p&线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java 提供 ThreadLocal 类来支持线程局部变量,是一种实现线程安全的方式。但是在管理环境下(如 web 服务器)使用线程局部变量的时候要特别小心,在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放,Java 应用就存在内存泄露的风险。&/p&&p&ThreadLocal的方法:void set(T value)、T get()以及T initialValue()。&/p&&p&ThreadLocal是如何为每个线程创建变量的副本的:&/p&&p&首先,在每个线程Thread内部有一个ThreadLocal.ThreadLocalMap类型的成员变量threadLocals,这个threadLocals就是用来存储实际的变量副本的,键值为当前ThreadLocal变量,value为变量副本(即T类型的变量)。初始时,在Thread里面,threadLocals为空,当通过ThreadLocal变量调用get()方法或者set()方法,就会对Thread类中的threadLocals进行初始化,并且以当前ThreadLocal变量为键值,以ThreadLocal要保存的副本变量为value,存到threadLocals。然后在当前线程里面,如果要使用副本变量,就可以通过get方法在threadLocals里面查找。&/p&&p&总结:&/p&&p&a、实际的通过ThreadLocal创建的副本是存储在每个线程自己的threadLocals中的&/p&&p&b、为何threadLocals的类型ThreadLocalMap的键值为ThreadLocal对象,因为每个线程中可有多个threadLocal变量,就像上面代码中的longLocal和stringLocal;&/p&&p&c、在进行get之前,必须先set,否则会报空指针异常;如果想在get之前不需要调用set就能正常访问的话,必须重写initialValue()方法&/p&&p&&b&12)用 wait-notify 写一段代码来解决生产者-消费者问题?&/b&&/p&&p&请参考答案中的示例代码。只要记住在同步块中调用 wait() 和 notify()方法,如果阻塞,通过循环来测试等待条件。&/p&&p&&b&13) 用 Java 写一个线程安全的单例模式(Singleton)?&/b&&/p&&p&请参考答案中的示例代码,这里面一步一步教你创建一个线程安全的 Java 单例类。当我们说线程安全时,意思是即使初始化是在多线程环境中,仍然能保证单个实例。Java 中,使用枚举作为单例类是最简单的方式来创建线程安全单例模式的方式。&/p&&p&&b&14)Java 中 sleep 方法和 wait 方法的区别?&/b&&/p&&p&虽然两者都是用来暂停当前运行的线程,但是 sleep() 实际上只是短暂停顿,因为它不会释放锁,而 wait() 意味着条件等待,这就是为什么该方法要释放锁,因为只有这样,其他等待的线程才能在满足条件时获取到该锁。&/p&&p&&b&15)什么是不可变对象(immutable object)?Java 中怎么创建一个不可变对象?&/b&&/p&&p&不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。详情参见答案,一步一步指导你在 Java 中创建一个不可变的类。&/p&&p&&b&16)我们能创建一个包含可变对象的不可变对象吗?&/b&&/p&&p&是的,我们是可以创建一个包含可变对象的不可变对象的,你只需要谨慎一点,不要共享可变对象的引用就可以了,如果需要变化时,就返回原对象的一个拷贝。最常见的例子就是对象中包含一个日期对象的引用。&/p&&h2&&b&数据类型和 Java 基础面试问题&/b&&/h2&&p&&b&17)Java 中应该使用什么数据类型来代表价格?&/b&&/p&&p&如果不是特别关心内存和性能的话,使用BigDecimal,否则使用预定义精度的 double 类型。&/p&&p&&b&18)怎么将 byte 转换为 String?&/b&&/p&&p&可以使用 String 接收 byte[] 参数的构造器来进行转换,需要注意的点是要使用的正确的编码,否则会使用平台默认编码,这个编码可能跟原来的编码相同,也可能不同。&/p&&p&&b&19)Java 中怎样将 bytes 转换为 long 类型?&/b&&/p&&p&String接收bytes的构造器转成String,再Long.parseLong&/p&&p&&b&20)我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象?&/b&&/p&&p&是的,我们可以做强制转换,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,所以,如果强制转化是,int 类型的高 24 位将会被丢弃,byte 类型的范围是从 -128 到 127。&/p&&p&&b&21)存在两个类,B 继承 A,C 继承 B,我们能将 B 转换为 C 么?如 C = (C) B;&/b&&/p&&p&可以,向下转型。但是不建议使用,容易出现类型转型异常.&/p&&p&&b&22)哪个类包含 clone 方法?是 Cloneable 还是 Object?&/b&&/p&&p&java.lang.Cloneable 是一个标示性接口,不包含任何方法,clone 方法在 object 类中定义。并且需要知道 clone() 方法是一个本地方法,这意味着它是由 c 或 c++ 或 其他本地语言实现的。&/p&&p&&b&23)Java 中 ++ 操作符是线程安全的吗?&/b&&/p&&p&不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。&/p&&p&&b&24)a = a + b 与 a += b 的区别&/b&&/p&&p&+= 隐式的将加操作的结果类型强制转换为持有结果的类型。如果两这个整型相加,如 byte、short 或者 int,首先会将它们提升到 int 类型,然后在执行加法操作。&/p&&br&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&kt&&byte&/span& &span class=&n&&a&/span& &span class=&o&&=&/span& &span class=&mi&&127&/span&&span class=&o&&;&/span&
&span class=&kt&&byte&/span& &span class=&n&&b&/span& &span class=&o&&=&/span& &span class=&mi&&127&/span&&span class=&o&&;&/span&
&span class=&n&&b&/span& &span class=&o&&=&/span& &span class=&n&&a&/span& &span class=&o&&+&/span& &span class=&n&&b&/span&&span class=&o&&;&/span& &span class=&c1&&// error : cannot convert from int to byte&/span&
&span class=&n&&b&/span& &span class=&o&&+=&/span& &span class=&n&&a&/span&&span class=&o&&;&/span& &span class=&c1&&// ok&/span&
&/code&&/pre&&/div&&p&(因为 a+b 操作会将 a、b 提升为 int 类型,所以将 int 类型赋值给 byte 就会编译出错)&/p&&p&&b&25)我能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗?&/b&&/p&&p&不行,你不能在没有强制类型转换的前提下将一个 double 值赋值给 long 类型的变量,因为 double 类型的范围比 long 类型更广,所以必须要进行强制转换。&/p&&p&&b&26)3*0.1 == 0.3 将会返回什么?true 还是 false?&/b&&/p&&p&false,因为有些浮点数不能完全精确的表示出来。&/p&&p&&b&27)int 和 Integer 哪个会占用更多的内存?&/b&&/p&&p&Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。&/p&&p&&b&28)为什么 Java 中的 String 是不可变的(Immutable)?&/b&&/p&&p&Java 中的 String 不可变是因为 Java 的设计者认为字符串使用非常频繁,将字符串设置为不可变可以允许多个客户端之间共享相同的字符串。更详细的内容参见答案。&/p&&p&&b&29)我们能在 Switch 中使用 String 吗?&/b&&/p&&p&从 Java 7 开始,我们可以在 switch case 中使用字符串,但这仅仅是一个语法糖。内部实现在 switch 中使用字符串的 hash code。&/p&&p&&b&30)Java 中的构造器链是什么?&/b&&/p&&p&当你从一个构造器中调用另一个构造器,就是Java 中的构造器链。这种情况只在重载了类的构造器的时候才会出现。&/p&&h3&&b&JVM 底层 与 GC(Garbage Collection) 的面试问题&/b&&/h3&&p&&b&31)64 位 JVM 中,int 的长度是多数?&/b&&/p&&p&Java 中,int 类型变量的长度是一个固定值,与平台无关,都是 32 位。意思就是说,在 32 位 和 64 位 的Java 虚拟机中,int 类型的长度是相同的。&/p&&p&&b&32)Serial 与 Parallel GC之间的不同之处?&/b&&/p&&p&Serial 与 Parallel 在GC执行的时候都会引起 stop-the-world。它们之间主要不同 serial 收集器是默认的复制收集器,执行 GC 的时候只有一个线程,而 parallel 收集器使用多个 GC 线程来执行。&/p&&p&&b&33)32 位和 64 位的 JVM,int 类型变量的长度是多数?&/b&&/p&&p&32 位和 64 位的 JVM 中,int 类型变量的长度是相同的,都是 32 位或者 4 个字节。&/p&&p&&b&34)Java 中 WeakReference 与 SoftReference的区别?&/b&&/p&&p&Java中一共有四种类型的引用。StrongReference、 SoftReference、 WeakReference 以及 PhantomReference。&/p&&p&StrongReference 是 Java 的默认引用实现, 它会尽可能长时间的存活于 JVM 内,当没有任何对象指向它时将会被GC回收&/p&&p&WeakReference,顾名思义, 是一个弱引用, 当所引用的对象在 JVM 内不再有强引用时, 将被GC回收&/p&&p&虽然 WeakReference 与 SoftReference 都有利于提高 GC 和 内存的效率,但是 WeakReference ,一旦失去最后一个强引用,就会被 GC 回收,而 SoftReference 会尽可能长的保留引用直到 JVM 内存不足时才会被回收(虚拟机保证), 这一特性使得 SoftReference 非常适合缓存应用&/p&&p&&b&35)WeakHashMap 是怎么工作的?&/b&&/p&&p&WeakHashMap 的工作与正常的 HashMap 类似,但是使用弱引用作为 key,意思就是当 key 对象没有任何引用时,key/value 将会被回收。&/p&&p&&b&36)JVM 选项 -XX:+UseCompressedOops 有什么作用?为什么要使用?&/b&&/p&&p&当你将你的应用从 32 位的 JVM 迁移到 64 位的 JVM 时,由于对象的指针从 32 位增加到了 64 位,因此堆内存会突然增加,差不多要翻倍。这也会对 CPU 缓存(容量比内存小很多)的数据产生不利的影响。因为,迁移到 64 位的 JVM 主要动机在于可以指定最大堆大小,通过压缩 OOP 可以节省一定的内存。通过 -XX:+UseCompressedOops 选项,JVM 会使用 32 位的 OOP,而不是 64 位的 OOP。&/p&&p&&b&37)怎样通过 Java 程序来判断 JVM 是 32 位 还是 64 位?&/b&&/p&&p&你可以检查某些系统属性如 sun.arch.data.model 或 os.arch 来获取该信息。&/p&&p&&b&38)32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?&/b&&/p&&p&理论上说上 32 位的 JVM 堆内存可以到达 2^32,即 4GB,但实际上会比这个小很多。不同操作系统之间不同,如 Windows 系统大约 1.5 GB,Solaris 大约 3GB。64 位 JVM允许指定最大的堆内存,理论上可以达到 2^64,这是一个非常大的数字,实际上你可以指定堆内存大小到 100GB。甚至有的 JVM,如 Azul,堆内存到 1000G 都是可能的。&/p&&p&&b&39)JRE、JDK、JVM 及 JIT 之间有什么不同?&/b&&/p&&p&JRE 代表 Java 运行时(Java run-time),是运行 Java 应用所必须的。JDK 代表 Java 开发工具(Java development kit),是 Java 程序的开发工具,如 Java 编译器,它也包含 JRE。JVM 代表 Java 虚拟机(Java virtual machine),它的责任是运行 Java 应用。JIT 代表即时编译(Just In Time compilation),当代码执行的次数超过一定的阈值时,会将 Java 字节码转换为本地代码,如,主要的热点代码会被准换为本地代码,这样有利大幅度提高 Java 应用的性能。&/p&&figure&&img src=&/v2-ddd7c2176dce812b2d28f_b.jpg& data-rawwidth=&320& data-rawheight=&213& class=&content_image& width=&320&&&/figure&&h3&&b&3 年工作经验的 Java 面试题&/b&&/h3&&p&&b&40)解释 Java 堆空间及 GC?&/b&&/p&&p&当通过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于创建堆空间,当程序中创建对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一个进程,回收无效对象的内存用于将来的分配。&/p&&h3&&b&JVM 底层面试题及答案&/b&&/h3&&p&&b&41)你能保证 GC 执行吗?&/b&&/p&&p&不能,虽然你可以调用 System.gc() 或者 Runtime.getRuntime().gc(),但是没有办法保证 GC 的执行。&/p&&p&&b&42)怎么获取 Java 程序使用的内存?堆使用的百分比?&/b&&/p&&p&可以通过 java.lang.Runtime 类中与内存相关方法来获取剩余的内存,总内存及最大堆内存。通过这些方法你也可以获取到堆使用的百分比及堆内存的剩余空间。Runtime.freeMemory() 方法返回剩余空间的字节数,Runtime.totalMemory() 方法总内存的字节数,Runtime.maxMemory() 返回最大内存的字节数。&/p&&p&&b&43)Java 中堆和栈有什么区别?&/b&&/p&&p&JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。 Difference between stack and heap memory in Java&/p&&h3&&b&关于内存的的面试问题和答案&/b&&/h3&&p&&b&Java 基本概念面试题&/b&&/p&&p&&b&44)“a==b”和”a.equals(b)”有什么区别?&/b&&/p&&p&如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,所以通常需要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,所以可以用于两个不同对象,但是包含的字母相同的比较。&/p&&p&&b&45)a.hashCode() 有什么用?与 a.equals(b) 有什么关系?&/b&&/p&&p&hashCode() 方法是相应对象整型的 hash 值。它常用于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap等等。它与 equals() 方法关系特别紧密。根据 Java 规范,两个使用 equal() 方法来判断相等的对象,必须具有相同的 hash code。&/p&&p&&b&46)final、finalize 和 finally 的不同之处?&/b&&/p&&p&final 是一个修饰符,可以修饰变量、方法和类。如果 final 修饰变量,意味着该变量的值在初始化后不能被改变。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的,但是什么时候调用 finalize 没有保证。finally 是一个关键字,与 try 和 catch 一起用于异常的处理。finally 块一定会被执行,无论在 try 块中是否有发生异常。&/p&&p&&b&47)Java 中的编译期常量是什么?使用它又什么风险?&/b&&/p&&p&公共静态不可变(public static final )变量也就是我们所说的编译期常量,这里的 public 可选的。实际上这些变量在编译时会被替换掉,因为编译器知道这些变量的值,并且知道这些变量在运行时不能改变。这种方式存在的一个问题是你使用了一个内部的或第三方库中的公有编译时常量,但是这个值后面被其他人改变了,但是你的客户端仍然在使用老的值,甚至你已经部署了一个新的jar。为了避免这种情况,当你在更新依赖 JAR 文件时,确保重新编译你的程序。&/p&&h3&&b&Java 集合框架的面试题&/b&&/h3&&p&这部分也包含数据结构、算法及数组的面试问题&/p&&p&&b&48) List、Set、Map 和 Queue 之间的区别(答案)&/b&&/p&&p&List 是一个有序集合,允许元素重复。它的某些实现可以提供基于下标值的常量访问时间,但是这不是 List 接口保证的。Set 是一个无序集合。&/p&&p&&b&49)poll() 方法和 remove() 方法的区别?&/b&&/p&&p&poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。&/p&&p&&b&50)Java 中 LinkedHashMap 和 PriorityQueue 的区别是什么?(答案)&/b&&/p&&p&PriorityQueue 保证最高或者最低优先级的的元素总是在队列头部,但是 LinkedHashMap 维持的顺序是元素插入的顺序。当遍历一个 PriorityQueue 时,没有任何顺序保证,但是 LinkedHashMap 课保证遍历顺序是元素插入的顺序。&/p&&p&&b&51)ArrayList 与 LinkedList 的不区别?(答案)&/b&&/p&&p&最明显的区别是 ArrrayList 底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构书链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。更多细节的讨论参见答案。&/p&&p&&b&52)用哪两种方式来实现集合的排序?(答案)&/b&&/p&&p&你可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有顺序的的集合,如 list,然后通过 Collections.sort() 来排序。&/p&&p&&b&53)Java 中怎么打印数组?(answer答案)&/b&&/p&&p&你可以使用 Arrays.toString() 和 Arrays.deepToString() 方法来打印数组。由于数组没有实现 toString() 方法,所以如果将数组传递给 System.out.println() 方法,将无法打印出数组的内容,但是 Arrays.toString() 可以打印每个元素。&/p&&p&&b&54)Java 中的 LinkedList 是单向链表还是双向链表?(答案)&/b&&/p&&p&是双向链表,你可以检查 JDK 的源码。在 Eclipse,你可以使用快捷键 Ctrl + T,直接在编辑器中打开该类。&/p&&p&&b&55)Java 中的 TreeMap 是采用什么树实现的?(答案)&/b&&/p&&p&Java 中的 TreeMap 是使用红黑树实现的。&/p&&p&&b&56) Hashtable 与 HashMap 有什么不同之处?(答案)&/b&&/p&&p&这两个类有许多不同的地方,下面列出了一部分: a) Hashtable 是 JDK 1 遗留下来的类,而 HashMap 是后来增加的。 b)Hashtable 是同步的,比较慢,但 HashMap 没有同步策略,所以会更快。 c)Hashtable 不允许有个空的 key,但是 HashMap 允许出现一个 null key。 更多的不同之处参见答案。&/p&&p&&b&57)Java 中的 HashSet,内部是如何工作的?(answer答案)&/b&&/p&&p&HashSet 的内部采用 HashMap来实现。由于 Map 需要 key 和 value,所以所有 key 的都有一个默认 value。类似于 HashMap,HashSet 不允许重复的 key,只允许有一个null key,意思就是 HashSet 中只允许存储一个 null 对象。&/p&&p&&b&58)写一段代码在遍历 ArrayList 时移除一个元素?(答案)&/b&&/p&&p&该问题的关键在于面试者使用的是 ArrayList 的 remove() 还是 Iterator 的 remove()方法。这有一段示例代码,是使用正确的方式来实现在遍历的过程中移除元素,而不会出现 ConcurrentModificationException 异常的示例代码。&/p&&p&&b&59)我们能自己写一个容器类,然后使用 for-each 循环吗?&/b&&/p&&p&可以,你可以写一个自己的容器类。如果你想使用 Java 中增强的循环来遍历,你只需要实现 Iterable 接口。如果你实现 Collection 接口,默认就具有该属性。&/p&&p&&b&60)ArrayList 和 HashMap 的默认大小是多数?(答案)&/b&&/p&&p&在 Java 7 中,ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是16个元素(必须是2的幂)。这就是 Java 7 中 ArrayList 和 HashMap 类的代码片段:&/p&&br&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&c1&&// from ArrayList.java JDK 1.7&/span&
&span class=&kd&&private&/span& &span class=&kd&&static&/span& &span class=&kd&&final&/span& &span class=&kt&&int&/span& &span class=&n&&DEFAULT_CAPACITY&/span& &span class=&o&&=&/span& &span class=&mi&&10&/span&&span class=&o&&;&/span&
&span class=&c1&&//from HashMap.java JDK 7&/span&
&span class=&kd&&static&/span& &span class=&kd&&final&/span& &span class=&kt&&int&/span& &span class=&n&&DEFAULT_INITIAL_CAPACITY&/span& &span class=&o&&=&/span& &span class=&mi&&1&/span& &span class=&o&&&&&/span& &span class=&mi&&4&/span&&span class=&o&&;&/span& &span class=&c1&&// aka 16&/span&
&/code&&/pre&&/div&&p&&b&61)有没有可能两个不相等的对象有有相同的 hashcode?&/b&&/p&&p&有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在 hashmap 中会有冲突。相等 hashcode 值的规定只是说如果两个对象相等,必须有相同的hashcode 值,但是没有关于不相等对象的任何规定。&/p&&p&&b&62)两个相同的对象会有不同的的 hash code 吗?&/b&&/p&&p&不能,根据 hash code 的规定,这是不可能的。&/p&&p&&b&63)我们可以在 hashcode() 中使用随机数字吗?(答案)&/b&&/p&&p&不行,因为对象的 hashcode 值必须是相同的。参见答案获取更多关于 Java 中重写 hashCode() 方法的知识。&/p&&p&&b&64)Java 中,Comparator 与 Comparable 有什么不同?(答案)&/b&&/p&&p&Comparable 接口用于定义对象的自然顺序,而 comparator 通常用于定义用户定制的顺序。Comparable 总是只有一个,但是可以有多个 comparator 来定义对象的顺序。&/p&&p&&b&65)为什么在重写 equals 方法的时候需要重写 hashCode 方法?(答案)&/b&&/p&&p&因为有强制的规范指定需要同时重写 hashcode 与 equal 是方法,许多容器类,如 HashMap、HashSet 都依赖于 hashcode 与 equals 的规定。&/p&&h3&&b&Java IO 和 NIO 的面试题&/b&&/h3&&p&IO 是 Java 面试中一个非常重要的点。你应该很好掌握 Java IO,NIO,NIO2 以及与操作系统,磁盘 IO 相关的基础知识。下面是 Java IO 中经常问的问题。&/p&&p&&b&66)在我 Java 程序中,我有三个 socket,我需要多少个线程来处理?&/b&&/p&&p&&b&67)Java 中怎么创建 ByteBuffer?&/b&&/p&&p&&b&68)Java 中,怎么读写 ByteBuffer ?&/b&&/p&&p&&b&69)Java 采用的是大端还是小端?&/b&&/p&&p&&b&70)ByteBuffer 中的字节序是什么?&/b&&/p&&p&&b&71)Java 中,直接缓冲区与非直接缓冲器有什么区别?(答案)&/b&&/p&&p&&b&72)Java 中的内存映射缓存区是什么?(answer答案)&/b&&/p&&p&&b&73)socket 选项 TCP NO DELAY 是指什么?&/b&&/p&&p&&b&74)TCP 协议与 UDP 协议有什么区别?(answer答案)&/b&&/p&&p&&b&75)Java 中,ByteBuffer 与 StringBuffer有什么区别?(答案)&/b&&/p&&h3&&b&Java 最佳实践的面试问题&/b&&/h3&&p&包含 Java 中各个部分的最佳实践,如集合,字符串,IO,多线程,错误和异常处理,设计模式等等。&/p&&p&&b&76)Java 中,编写多线程程序的时候你会遵循哪些最佳实践?(答案)&/b&&/p&&p&这是我在写Java 并发程序的时候遵循的一些最佳实践: a)给线程命名,这样可以帮助调试。 b)最小化同步的范围,而不是将整个方法同步,只对关键部分做同步。 c)如果可以,更偏向于使用 volatile 而不是 synchronized。 d)使用更高层次的并发工具,而不是使用 wait() 和 notify() 来实现线程间通信,如 BlockingQueue,CountDownLatch 及 Semeaphore。 e)优先使用并发集合,而不是对集合进行同步。并发集合提供更好的可扩展性。&/p&&p&&b&77)说出几点 Java 中使用 Collections 的最佳实践(答案)&/b&&/p&&p&这是我在使用 Java 中 Collectionc 类的一些最佳实践: a)使用正确的集合类,例如,如果不需要同步列表,使用 ArrayList 而不是 Vector。 b)优先使用并发集合,而不是对集合进行同步。并发集合提供更好的可扩展性。 c)使用接口代表和访问集合,如使用List存储 ArrayList,使用 Map 存储 HashMap 等等。 d)使用迭代器来循环集合。 e)使用集合的时候使用泛型。&/p&&p&&b&78)说出至少 5 点在 Java 中使用线程的最佳实践。(答案)&/b&&/p&&p&这个问题与之前的问题类似,你可以使用上面的答案。对线程来说,你应该: a)对线程命名 b)将线程和任务分离,使用线程池执行器来执行 Runnable 或 Callable。 c)使用线程池&/p&&p&&b&79)说出 5 条 IO 的最佳实践(答案)&/b&&/p&&p&IO 对 Java 应用的性能非常重要。理想情况下,你不应该在你应用的关键路径上避免 IO 操作。下面是一些你应该遵循的 Java IO 最佳实践: a)使用有缓冲区的 IO 类,而不要单独读取字节或字符。 b)使用 NIO 和 NIO2 c)在 finally 块中关闭流,或者使用 try-with-resource(Java7) 语句。 d)使用内存映射文件获取更快的 IO。&/p&&p&&b&80)列出 5 个应该遵循的 JDBC 最佳实践(答案)&/b&&/p&&p&有很多的最佳实践,你可以根据你的喜好来例举。下面是一些更通用的原则: a)使用批量的操作来插入和更新数据 b)使用 PreparedStatement 来避免 SQL 异常,并提高性能。 c)使用数据库连接池 d)通过列名来获取结果集,不要使用列的下标来获取。&/p&&p&&b&81)说出几条 Java 中方法重载的最佳实践?(答案)&/b&&/p&&p&下面有几条可以遵循的方法重载的最佳实践来避免造成自动装箱的混乱。 a)不要重载这样的方法:一个方法接收 int 参数,而另个方法接收 Integer 参数。 b)不要重载参数数量一致,而只是参数顺序不同的方法。 c)如果重载的方法参数个数多于 5 个,采用可变参数。&/p&&h3&&b&Date、Time 及 Calendar 的面试题&/b&&/h3&&p&&b&82)在多线程环境下,SimpleDateFormat 是线程安全的吗?(答案)&/b&&/p&&p&不是,非常不幸,DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中使用,如 将 SimpleDateFormat 限制在 ThreadLocal 中。如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果。因此,从日期、时间处理的所有实践来说,我强力推荐 joda-time 库。&/p&&p&&b&83)Java 中如何格式化一个日期?如格式化为 ddMMyyyy 的形式?(答案)&/b&&/p&&p&Java 中,可以使用 SimpleDateFormat 类或者 joda-time 库来格式日期。DateFormat 类允许你使用多种流行的格式来格式化日期。参见答案中的示例代码,代码中演示了将日期格式化成不同的格式,如 dd-MM-yyyy 或 ddMMyyyy。&/p&&p&&b&84)Java 中,怎么在格式化的日期中显示时区?&/b&&/p&&p&pattern中加z yyyy-MM-dd HH:mm:ss.SSS Z&/p&&p&&b&85)Java 中 java.util.Date 与 java.sql.Date 有什么区别?&/b&&/p&&p&java.sql.Date是针对SQL语句使用的,它只包含日期而没有时间部分,它们都有getTime方法返回毫秒数,自然就可以直接构建。java.util.Date 是 java.sql.Date 的父类,前者是常用的表示时间的类,我们通常格式化或者得到当前时间都是用他,后者之后在读写数据库的时候用他,因为PreparedStament的setDate()的第2参数和ResultSet的getDate()方法的第2个参数都是java.sql.Date。&/p&&p&&b&86)Java 中,如何计算两个日期之间的差距?&/b&&/p&&br&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&kd&&public&/span& &span class=&kd&&static&/span& &span class=&kt&&int&/span& &span class=&nf&&dateDiff&/span&&span class=&o&&(&/span&&span class=&n&&Date&/span& &span class=&n&&d1&/span&&span class=&o&&,&/span& &span class=&n&&Date&/span& &span class=&n&&d2&/span&&span class=&o&&)&/span& &span class=&kd&&throws&/span& &span class=&n&&Exception&/span& &span class=&o&&{&/span&
&span class=&kt&&long&/span& &span class=&n&&n1&/span& &span class=&o&&=&/span& &span class=&n&&d1&/span&&span class=&o&&.&/span&&span class=&na&&getTime&/span&&span class=&o&&();&/span&
&span class=&kt&&long&/span& &span class=&n&&n2&/span& &span class=&o&&=&/span& &span class=&n&&d2&/span&&span class=&o&&.&/span&&span class=&na&&getTime&/span&&span class=&o&&();&/span&
&span class=&kt&&long&/span& &span class=&n&&diff&/span& &span class=&o&&=&/span& &span class=&n&&Math&/span&&span class=&o&&.&/span&&span class=&na&&abs&/span&&span class=&o&&(&/span&&span class=&n&&n1&/span& &span class=&o&&-&/span& &span class=&n&&n2&/span&&span class=&o&&);&/span&
&span class=&n&&diff&/span& &span class=&o&&/=&/span& &span class=&mi&&3600&/span& &span class=&o&&*&/span& &span class=&mi&&1000&/span& &span class=&o&&*&/span& &span class=&mi&&24&/span&&span class=&o&&;&/span&
&span class=&k&&return&/span& &span class=&n&&diff&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&&b&87)Java 中,如何将字符串 YYYYMMDD 转换为日期?&/b&&/p&&p&SimpleDateFormat的parse方法&/p&&h3&&b&单元测试 JUnit 面试题&/b&&/h3&&p&&b&89)如何测试静态方法?(答案)&/b&&/p&&p&可以使用 PowerMock 库来测试静态方法。&/p&&p&&b&90)怎么利用 JUnit 来测试一个方法的异常?(答案)&/b&&/p&&p&&b&91)你使用过哪个单元测试库来测试你的 Java 程序?(答案)&/b&&/p&&p&&b&92)@Before 和 @BeforeClass 有什么区别?(答案)&/b&&/p&&h3&&b&编程和代码相关的面试题&/b&&/h3&&p&&b&93)怎么检查一个字符串只包含数字?(解决方案)&/b&&/p&&p&&b&94)Java 中如何利用泛型写一个 LRU 缓存?(答案)&/b&&/p&&p&&b&95)写一段 Java 程序将 byte 转换为 long?(答案)&/b&&/p&&p&&b&95)在不使用 StringBuffer 的前提下,怎么反转一个字符串?(解决方案)&/b&&/p&&p&&b&97)Java 中,怎么获取一个文件中单词出现的最高频率?(解决方案)&/b&&/p&&p&&b&98)如何检查出两个给定的字符串是反序的?(解决方案)&/b&&/p&&p&&b&99)Java 中,怎么打印出一个字符串的所有排列?(解决方案)&/b&&/p&&p&&b&100)Java 中,怎样才能打印出数组中的重复元素?(解决方案)&/b&&/p&&p&&b&101)Java 中如何将字符串转换为整数?(解决方案)&/b&&/p&&p&&b&102)在没有使用临时变量的情况如何交换两个整数变量的值?(解决方案)&/b&&/p&&h2&&b&关于 OOP 和设计模式的面试题&/b&&/h2&&p&这部分包含 Java 面试过程中关于 SOLID 的设计原则,OOP 基础,如类,对象,接口,继承,多态,封装,抽象以及更高级的一些概念,如组合、聚合及关联。也包含了 GOF 设计模式的问题。&/p&&p&&b&103)接口是什么?为什么要使用接口而不是直接使用具体类?&/b&&/p&&p&接口用于定义 API。它定义了类必须得遵循的规则。同时,它提供了一种抽象,因为客户端只使用接口,这样可以有多重实现,如 List 接口,你可以使用可随机访问的 ArrayList,也可以使用方便插入和删除的 LinkedList。接口中不允许写代码,以此来保证抽象,但是 Java 8 中你可以在接口声明静态的默认方法,这种方法是具体的。&/p&&p&&b&104)Java 中,抽象类与接口之间有什么不同?(答案)&/b&&/p&&p&Java 中,抽象类和接口有很多不同之处,但是最重要的一个是 Java 中限制一个类只能继承一个类,但是可以实现多个接口。抽象类可以很好的定义一个家族类的默认行为,而接口能更好的定义类型,有助于后面实现多态机制。关于这个问题的讨论请查看答案。&/p&&p&&b&105)除了单例模式,你在生产环境中还用过什么设计模式?&/b&&/p&&p&这需要根据你的经验来回答。一般情况下,你可以说依赖注入,工厂模式,装饰模式或者观察者模式,随意选择你使用过的一种即可。不过你要准备回答接下的基于你选择的模式的问题。&/p&&p&&b&106)你能解释一下里氏替换原则吗?(答案)&/b&&/p&&p&&b&107) 什么情况下会违反迪米特法则?为什么会有这个问题?(答案)&/b&&/p&&p&迪米特法则建议“只和朋友说话,不要陌生人说话”,以此来减少类之间的耦合。&/p&&p&&b&108)适配器模式是什么?什么时候使用?&/b&&/p&&p&适配器模式提供对接口的转换。如果你的客户端使用某些接口,但是你有另外一些接口,你就可以写一个适配去来连接这些接口。&/p&&p&&b&109)什么是“依赖注入”和“控制反转”?为什么有人使用?(答案)&/b&&/p&&p&&b&110)抽象类是什么?它与接口有什么区别?你为什么要使用过抽象类?(答案)&/b&&/p&&p&&b&111)构造器注入和 setter 依赖注入,那种方式更好?(答案)&/b&&/p&&p&每种方式都有它的缺点和优点。构造器注入保证所有的注入都被初始化,但是 setter 注入提供更好的灵活性来设置可选依赖。如果使用 XML 来描述依赖,Setter 注入的可读写会更强。经验法则是强制依赖使用构造器注入,可选依赖使用 setter 注入。&/p&&p&&b&112)依赖注入和工厂模式之间有什么不同?(答案)&/b&&/p&&p&虽然两种模式都是将对象的创建从应用的逻辑中分离,但是依赖注入比工程模式更清晰。通过依赖注入,你的类就是 POJO,它只知道依赖而不关心它们怎么获取。使用工厂模式,你的类需要通过工厂来获取依赖。因此,使用 DI 会比使用工厂模式更容易测试。关于这个话题的更详细讨论请参见答案。&/p&&p&&b&113)适配器模式和装饰器模式有什么区别?(答案)&/b&&/p&&p&虽然适配器模式和装饰器模式的结构类似,但是每种模式的出现意图不同。适配器模式被用于桥接两个接口,而装饰模式的目的是在不修改类的情况下给类增加新的功能。&/p&&p&&b&114)适配器模式和代理模式之前有什么不同?(答案)&/b&&/p&&p&这个问题与前面的类似,适配器模式和代理模式的区别在于他们的意图不同。由于适配器模式和代理模式都是封装真正执行动作的类,因此结构是一致的,但是适配器模式用于接口之间的转换,而代理模式则是增加一个额外的中间层,以便支持分配、控制或智能访问。&/p&&p&&b&115)什么是模板方法模式?(答案)&/b&&/p&&p&模板方法提供算法的框架,你可以自己去配置或定义步骤。例如,你可以将排序算法看做是一个模板。它定义了排序的步骤,但是具体的比较,可以使用 Comparable 或者其语言中类似东西,具体策略由你去配置。列出算法概要的方法就是众所周知的模板方法。&/p&&p&&b&116)什么时候使用访问者模式?(答案)&/b&&/p&&p&访问者模式用于解决在类的继承层次上增加操作,但是不直接与之关联。这种模式采用双派发的形式来增加中间层。&/p&&p&&b&117)什么时候使用组合模式?(答案)&/b&&/p&&p&组合模式使用树结构来展示部分与整体继承关系。它允许客户端采用统一的形式来对待单个对象和对象容器。当你想要展示对象这种部分与整体的继承关系时采用组合模式。&/p&&p&&b&118)继承和组合之间有什么不同?(答案)&/b&&/p&&p&虽然两种都可以实现代码复用,但是组合比继承共灵活,因为组合允许你在运行时选择不同的实现。用组合实现的代码也比继承测试起来更加简单。&/p&&p&&b&119)描述 Java 中的重载和重写?(答案)&/b&&/p&&p&重载和重写都允许你用相同的名称来实现不同的功能,但是重载是编译时活动,而重写是运行时活动。你可以在同一个类中重载方法,但是只能在子类中重写方法。重写必须要有继承。&/p&&p&&b&120)Java 中,嵌套公共静态类与顶级类有什么不同?(答案)&/b&&/p&&p&类的内部可以有多个嵌套公共静态类,但是一个 Java 源文件只能有一个顶级公共类,并且顶级公共类的名称与源文件名称必须一致。&/p&&p&&b&121) OOP 中的 组合、聚合和关联有什么区别?(答案)&/b&&/p&&p&如果两个对象彼此有关系,就说他们是彼此相关联的。组合和聚合是面向对象中的两种形式的关联。组合是一种比聚合更强力的关联。组合中,一个对象是另一个的拥有者,而聚合则是指一个对象使用另一个对象。如果对象 A 是由对象 B 组合的,则 A 不存在的话,B一定不存在,但是如果 A 对象聚合了一个对象 B,则即使 A 不存在了,B 也可以单独存在。&/p&&p&&b&122)给我一个符合开闭原则的设计模式的例子?(答案)&/b&&/p&&p&开闭原则要求你的代码对扩展开放,对修改关闭。这个意思就是说,如果你想增加一个新的功能,你可以很容易的在不改变已测试过的代码的前提下增加新的代码。有好几个设计模式是基于开闭原则的,如策略模式,如果你需要一个新的策略,只需要实现接口,增加配置,不需要改变核心逻辑。一个正在工作的例子是 Collections.sort() 方法,这就是基于策略模式,遵循开闭原则的,你不需为新的对象修改 sort() 方法,你需要做的仅仅是实现你自己的 Comparator 接口。&/p&&p&&b&123)抽象工厂模式和原型模式之间的区别?(答案)&/b&&/p&&p&&b&124)什么时候使用享元模式?(答案)&/b&&/p&&p&享元模式通过共享对象来避免创建太多的对象。为了使用享元模式,你需要确保你的对象是不可变的,这样你才能安全的共享。JDK 中 String 池、Integer 池以及 Long 池都是很好的使用了享元模式的例子。&/p&&h3&&b&Java 面试中其他各式各样的问题&/b&&/h3&&p&这部分包含 Java 中关于 XML 的面试题,JDBC 面试题,正则表达式面试题,Java 错误和异常及序列化面试题&/p&&p&&b&125)嵌套静态类与顶级类有什么区别?(答案)&/b&&/p&&p&一个公共的顶级类的源文件名称与类名相同,而嵌套静态类没有这个要求。一个嵌套类位于顶级类内部,需要使用顶级类的名称来引用嵌套静态类,如 HashMap.Entry 是一个嵌套静态类,HashMap 是一个顶级类,Entry是一个嵌套静态类。&/p&&p&&b&126)你能写出一个正则表达式来判断一个字符串是否是一个数字吗?(解决方案)&/b&&/p&&p&一个数字字符串,只能包含数字,如 0 到 9 以及 +、- 开头,通过这个信息,你可以下一个如下的正则表达式来判断给定的字符串是不是数字。&/p&&p&&b&127)Java 中,受检查异常 和 不受检查异常的区别?(答案)&/b&&/p&&p&受检查异常编译器在编译期间检查。对于这种异常,方法强制处理或者通过 throws 子句声明。其中一种情况是 Exception 的子类但不是 RuntimeException 的子类。非受检查是 RuntimeException 的子类,在编译阶段不受编译器的检查。 &/p&&figure&&img src=&/v2-5dc2ec13f7165dca803a5_b.jpg& data-rawwidth=&883& data-rawheight=&1814& class=&origin_image zh-lightbox-thumb& width=&883& data-original=&/v2-5dc2ec13f7165dca803a5_r.jpg&&&/figure&&p&&b&128)Java 中,throw 和 throws 有什么区别?(答案)&/b&&/p&&p&throw 用于抛出 java.lang.Throwable 类的一个实例化对象,意思是说你可以通过关键字 throw 抛出一个 Error 或者 一个Exception,如: throw new IllegalArgumentException(“size must be multiple of 2″) 而throws 的作用是作为方法声明和签名的一部分,方法被抛出相应的异常以便调用者能处理。Java 中,任何未处理的受检查异常强制在 throws 子句中声明。&/p&&p&&b&129)Java 中,Serializable 与 Externalizable 的区别?(答案)&/b&&/p&&p&Serializable 接口是一个序列化 Java 类的接口,以便于它们可以在网络上传输或者可以将它们的状态保存在磁盘上,是 JVM 内嵌的默认序列化方式,成本高、脆弱而且不安全。Externalizable 允许你控制整个序列化过程,指定特定的二进制格式,增加安全机制。&/p&&p&&b&130)Java 中,DOM 和 SAX 解析器有什么不同?(答案)&/b&&/p&&p&DOM 解析器将整个 XML 文档加载到内存来创建一棵 DOM 模型树,这样可以更快的查找节点和修改 XML 结构,而 SAX 解析器是一个基于事件的解析器,不会将整个 XML 文档加载到内存。由于这个原因,DOM 比 SAX 更快,也要求更多的内存,不适合于解析大 XML 文件。&/p&&p&&b&131)说出 JDK 1.7 中的三个新特性?(答案)&/b&&/p&&p&虽然 JDK 1.7 不像 JDK 5 和 8 一样的大版本,但是,还是有很多新的特性,如 try-with-resource 语句,这样你在使用流或者资源的时候,就不需要手动关闭,Java 会自动关闭。Fork-Join 池某种程度上实现 Java 版的 Map-reduce。允许 Switch 中有 String 变量和文本。菱形操作符(&&)用于类型推断,不再需要在变量声明的右边申明泛型,因此可以写出可读写更强、更简洁的代码。另一个值得一提的特性是改善异常处理,如允许在同一个 catch 块中捕获多个异常。&/p&&p&&b&132)说出 5 个 JDK 1.8 引入的新特性?(答案)&/b&&/p&&p&Java 8 在 Java 历史上是一个开创新的版本,下面 JDK 8 中 5 个主要的特性: Lambda 表达式,允许像对象一样传递匿名函数 Stream API,充分利用现代多核 CPU,可以写出很简洁的代码 Date 与 Time API,最终,有一个稳定、简单的日期和时间库可供你使用 扩展方法,现在,接口中可以有静态、默认方法。 重复注解,现在你可以将相同的注解在同一类型上使用多次。&/p&&p&&b&133)Java 中,Maven 和 ANT 有什么区别?(答案)&/b&&/p&&p&虽然两者都是构建工具,都用于创建 Java 应用,但是 Maven 做的事情更多,在基于“约定优于配置”的概念下,提供标准的Java 项目结构,同时能为应用自动管理依赖(应用中所依赖的 JAR 文件),Maven 与 ANT 工具更多的不同之处请参见答案。&/p&&p&这就是所有的面试题,如此之多,是不是?我可以保证,如果你能回答列表中的所有问题,你就可以很轻松的应付任何核心 Java 或者高级 Java 面试。虽然,这里没有涵盖 Servlet、JSP、JSF、JPA,JMS,EJB 及其它 Java EE 技术,也没有包含主流的框架如 Spring MVC,Struts 2.0,Hibernate,也没有包含 SOAP 和 RESTful web service,但是这份列表对做 Java 开发的、准备应聘 Java web 开发职位的人还是同样有用的,因为所有的 Java 面试,开始的问题都是 Java 基础和 JDK API 相关的。如果你认为我这里有任何应该在这份列表中而被我遗漏了的 Java 流行的问题,你可以自由的给我建议。我的目的是从最近的面试中创建一份最新的、最优的 Java 面试问题列表。&/p&&br&&p&——————————————————————————————————————————————————————————————————————————————————&/p&&p&在学习过程如果有任何疑问,请来极乐网(&a href=&/?target=http%3A//& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&)提问,或者扫描下方二维码,关注极乐官方微信,在平台下方留言~&/p&&figure&&img src=&/v2-9acba0ed93f79df845880_b.jpg& data-rawwidth=&640& data-rawheight=&320& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/v2-9acba0ed93f79df845880_r.jpg&&&/figure&
来源:面试题/133个Java常见面试题.mdJava 面试随着时间的改变而改变。在过去的日子里,当你知道 String 和 StringBuilder 的区别(String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象。因此在每次对 Strin…
&p&为什么收藏数是赞的两倍多?似乎是知乎定律。&/p&&p&想说说自己Spring的学习路程,课余自学Spring将近一年了,还是不得其道。去年暑假学习了一下JSP,并没有深入理解,所以导致学习Spring时对着书本写一些demo,感觉自己理解了,其实并不知道内部时什么原理,出了问题不停的百度,一个小问题好几天解决不了。&/p&&p& 学习一种框架最先需要知道的是为什么需要使用这个框架,任何一个框架的发明都是为了解决编程中的一些痛点,打开任何一本hibernate或者其他框架的入门书,第一章都是介绍框架的理念和优势。如果需要理解这些理念和优势,那么你需要知道不使用这个框架之前是怎么处理的,才能知道框架做了一些什么事情。&/p&&p& 针对Spring的学习,第一步就是理解IoC和AOP;这是基础;然后学习SpringMVC,其实还是Java EE开发,如果要理解这个框架,就要知道没有这个框架之前,使用的是什么技术。&/p&&blockquote&很多新的技术只不过是引入了新的编程元素对原来技术进行了封装。&br&&/blockquote&&p& Web开发,首先需要理解的是 HTTP协议,这部分一定要深入理解。理解http请求,其实就是要知道下面这张图的含义。&/p&&img src=&/bfb576a894fbc_b.jpg& data-caption=&& data-rawwidth=&800& data-rawheight=&228& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/bfb576a894fbc_r.jpg&&&p&&br&&/p&&p&还要知道服务器发送给浏览器的响应是没有没有JS,CSS和图片等外部资源的,浏览器在解析响应时才会再次请求这些资源,&b&这里会出现一些静态资源请求不到的问题,SpringMVC是怎么配置的?&/b&&/p&&p& 接下来,学习Servlet和JSP。这个步骤不是可以跳过的,现在流行的框架Spring MVC和Struts2其实都是基于Servlet的,只有深入理解了Servlet才能理解后面的新技术。&/p&&p&下面几个知识点可以检测你是否理解了Servlet:&/p&&p&1、什么是ServletContext,和tomcat等web容器的关系时什么?&a href=&///?target=http%3A///developerworks/cn/java/j-lo-servlet/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Servlet 工作原理解析&i class=&icon-external&&&/i&&/a&&/p&&p&简单的说,我们在浏览器点击链接和按钮产生的消息不是发送给Servlet的,而是发送给web容器的(在JSP出现之前,web容器也叫Servlet容器),web容器接收消息后不知道怎么处理,转交给我们编写的Servlet处理,那么web容器怎么和Servlet交流呢?于是就出现了Servlet接口,&b&接口是定义一种规范的良好表达形式。&/b& 只要我们编写的Java类符合Servlet规范,那么就能被Web容器识别并被容器管理。&/p&&p&2、什么是Session?Session在实际工程中的应用场景。以及@SessionAttribute注解的局限性。&/p&&p&3、&b&JSP是面向服务器的&/b&,它并不知道浏览器是什么鬼,是我们在写JSP时预设客户端是浏览器,&b&JSP就是一个Servlet。JSP的常用对象和指令。&/b&&/p&&p&4、JSP的中文编码乱码有几种情况?各自的解决方法?提示: JSP文件的编码,浏览器的解析编码,GET请求的编码,POST的编码。&/p&&p&5、Servlet是一种接口规范,其中请求和响应是Servlet容器通过向方法的参数赋值HttpServletRequest或者HttpServletResponse传递的。在Struts1里面,将doGet()方法里的响应移到返回值里。在Struts2里则:&/p&&ul&&li&在Controller中彻底杜绝引入HttpServletRequest或者HttpServletResponse这样的原生Servlet对象。&/li&&li&同时将请求参数和响应数据都从响应方法中剥离到了Controller中的属性变量。&/li&&/ul&&p&&br&&/p&&p&这是一个很大的技术改造,也造成了Struts2的盛行。Spring MVC走的是中间路线,Spring的2.0.8之前的版本甚至直接使用Servlet的doGet的。Spring MVC现在开始流行主要还是因为Schema xml的精简和基于注解的配置。所以这里出现了新的知识点:Schema Based XML的相关知识和Java5引入的注解原理。&br&参考文献:&br&&a href=&///?target=http%3A///blogs/subjects/springmvc-explore& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&博客专栏 - SpringMVC深度探险&i class=&icon-external&&&/i&&/a&&br&强烈推荐看两遍。&br&&br&书籍:推荐许令波的书《深入分析Java Web技术内幕(修订版)》和计文柯的《深入理解spring技术内幕》,特别是第二本,对spring的分析很是彻底。&/p&&p&&br&&/p&&p&
查看源码是比较快的学习方法,在一个项目里直接利用debug的方式追踪变量查看源码,而不是去阅读源码。&/p&&p&如何使用eclipse的debug:&a href=&///?target=http%3A//blog.csdn.net/jackpk/article/details/7655777& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&★ Eclipse Debug 界面应用详解——Eclipse Debug不为人知的秘密&i class=&icon-external&&&/i&&/a&&/p&&p&简单说下步骤:新建一个maven web项目,将需要的依赖都添加到pom中去,在pom文件夹中打开终端,运行&mvn dependency:sources&就可以下载所有pom中依赖的源码。如果是eclipse,选中项目,右键 run as 选择 maven build... ,在goal中填入“dependency:sources”,没有mvn。接着简单写一个mvc项目。假设有一个如下的handler method:我们在方法的第一行打一个断点,进行调试 。&/p&&div class=&highlight&&&pre&&code class=&language-java&&
&span class=&nd&&@RequestMapping&/span&&span class=&o&&(&/span&&span class=&s&&&/&&/span&&span class=&o&&)&/span&
&span class=&kd&&public&/span& &span class=&n&&ModelAndView&/span& &span class=&nf&&indexHandler&/span&&span class=&o&&(){&/span&
&span class=&n&&ModelAndView&/span& &span class=&n&&mv&/span&&span class=&o&&=&/span&&span class=&k&&new&/span& &span class=&n&&ModelAndView&/span&&span class=&o&&(&/span&&span class=&s&&&success&&/span&&span class=&o&&);&/span&
&span class=&n&&mv&/span&&span class=&o&&.&/span&&span class=&na&&addObject&/span&&span class=&o&&(&/span&&span class=&s&&&key&&/span&&span class=&o&&,&/span& &span class=&s&&&hello,hsiung!&&/span&&span class=&o&&);&/span&
&span class=&n&&mv&/span&&span class=&o&&.&/span&&span class=&na&&addObject&/span&&span class=&o&&(&/span&&span class=&s&&&time&&/span&&span class=&o&&,&/span& &span class=&k&&new&/span& &span class=&n&&Date&/span&&span class=&o&&());&/span&
&span class=&k&&return&/span& &span class=&n&&mv&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&一步一步往下看,可以在outline的窗口清楚地看到ModelAndView的属性和方法,可以看到ModelAndView有两个属性很重要,一个是view:O一个是model:ModelMap,接着可以看到上面方法的第二行调用的是如下代码:&/p&&div class=&highlight&&&pre&&code class=&language-text&&public ModelAndView addObject(String attributeName, Object attributeValue) {
getModelMap().addAttribute(attributeName, attributeValue);
&/code&&/pre&&/div&&p&所以model中实际使用的是ModelMap这个类,那这个类的结构是什么呢?按住Ctrl再单击ModelMap,就可以看到其实就是一个LinkedHashMap&String, Object&。&br&
&/p&&p&这里提供非常有用的几个eclipse使用技巧:&br&1.在面向接口编程中,我们很多时候看到一个方法返回的的是静态类型是接口的变量,并且实际类型被方法隐藏了。当然,你可以通过追溯进方法去看。其实一般来说,一个接口,会有一个抽象类,然后会有一个default类,一般想要知道接口的具体实现,去看default类就可以。spring比较特殊,很多默认配置的类不是default开头的。只能靠阅读guide了确定了。&br&2. 看一个类在哪些地方被引用,选中类名,Ctrl+Shift+G,&br&3. 看一个方法在哪些地方被调用,选中方法名,Ctrl+Alt+H。&br&4.学会看eclipse右侧的outline窗口。&/p&&p&---------------------没想到有人看,修改了了一下错别字和细节 -----------------&/p&&p&关于demo,其实spring project提供了一些很好的MVC demo,&/p&&p&&a href=&///?target=http%3A///spring-projects/spring-mvc-showcase& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&spring-projects/spring-mvc-showcase · GitHub&i class=&icon-external&&&/i&&/a&,&/p&&p&&a href=&///?target=https%3A///spring-projects/spring-petclinic& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&spring-projects/spring-petclinic · GitHub&i class=&icon-external&&&/i&&/a&。&/p&&p&下载源码,到pom目录下打开终端 运行: mvn eclipse:eclipse ,构建成功后直接导入eclipse就可以运行查看效果了。注意,mvn 命令经常一次不能成功,主要是有些maven插件下载失败以及国内网络的问题,手动删除下载失败的依赖,然后命令多运行几次就可以成功了。也可以使用开源中国的maven源。&/p&&p&&br&&/p&&p&&a href=&///?target=https%3A///xdahu/xdahu.github.io/wiki& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&xdahu/xdahu.github.io&i class=&icon-external&&&/i&&/a&&/p&
为什么收藏数是赞的两倍多?似乎是知乎定律。想说说自己Spring的学习路程,课余自学Spring将近一年了,还是不得其道。去年暑假学习了一下JSP,并没有深入理解,所以导致学习Spring时对着书本写一些demo,感觉自己理解了,其实并不知道内部时什么原理,出了问…
&p&研一,离毕业至少还有一年半的时间,足够自学的了。&/p&&p&我正在致力于为自学者打造一个自学软件的学习路线图,以知乎Live的方式展现出来。&/p&&p&当前己经讲了两场Live,《&a href=&/lives/003968& class=&internal&&如何自学计算机专业课程?&/a&》介绍如何系统地学习计算机专业的核心课程,《&a href=&/lives/841792& class=&internal&&如何自学编程?&/a&》,介绍培养编程技能的方法论与指导性原则。&/p&&p&后面策划三场Live,把Java三大技术领域(JavaSE与OOP、Android移动应用、JavaEE企业级应用开发技术)“扫一遍”,给自学者指出学习路线和学习重点,这三场Live可以看成是《如何自学编程》这个Live的践行篇。其中第一场《如何自学Java:入门与基础开发技能训练》(暂名)框架己经出来,要讲什么我基本上都想好了,计划国庆之后开讲。三场都争取在年底前完成。&/p&&p&Java的就业机会很多,不过入门门槛比Python和Web前端要高一点,但这点难度,对研究生来说应该不在话下。研究生自学编程应该不以掌握各种开发框架为唯一目标,而应该争取能将计算机专业的核心课程(至少是“四大天王”:数据结构与算法、操作系统、计算机网络和计算机组成原理,具体学习方式参看Live《如何自学计算机专业课程》)同时啃下来,才能对计算机系统和软件开发有更深的理解与把握,才能把你与那些满大街都是的“Web前端程序员”区别开来。&/p&&p&&/p&
研一,离毕业至少还有一年半的时间,足够自学的了。我正在致力于为自学者打造一个自学软件的学习路线图,以知乎Live的方式展现出来。当前己经讲了两场Live,《》介绍如何系统地学习计算机专业的核心课程,《》,介绍…
看见这个问题,缘分啊。&br&本科的时候选修课正好做过此书的读书报告,因此结合目前实际做点修改贴出来吧。&br&==&br&哈佛大学政治学教授塞缪尔o亨廷顿在911事件后写书《我们是谁?》,这本书延续了《文明的冲突》中的基本论调,但是视线焦点由世界转向美国。&br&(同时也如《文明的冲突》,十几年后再回头看看啊呢,发现一个恐怖的事实,亨廷顿的预言很多都实现了。那么如果不加干涉,是否会真的如预言所说呢?)&br&&b&一、《我们是谁?》写了什么?&/b&&br&该书有四个部分。&br&&b&第一部分,提出了美国国家/国民的问题,并从一般意义上分析了特性/身份的界定及其来源。&br&第二部分,分析了美国特性的主要内容。&/b&亨廷顿认为,美国特性主要有两种来源:&br&1、&b&美国信念&/b&(我个人认为,“美国梦”即是美国信念的一种表达),即&b&个人权利、政府统治要需被统治者的同意等基本原则&/b&;&br&2、&b&文化认同&/b&,主要是指&b&语言文化的认同&/b&(是对英语的认同,保持美国社会主流语言是英语)&b&、宗教以及自由的观念等&/b&。&br&亨廷顿同时认为,就美国特性的形成而言,文化认同的重要性远超美国信念。&br&&b&第三部分,讨论了美国特性面临的挑战:&/b&&br&1、对于来自拉丁美洲和亚洲的移民新浪潮,美国信念是否还有效?对于大规模的移民潮,英语是否还是必要的?&b&母语文化是否对新移民对美国的文化认同产生负面影响?&/b&(PS.特朗普总统的移民改革提案中特意提到英语水平是打分考核的重要部分,应该是受这个观点的影响)&br&2、学术界和政界流行的&b&多元文化主义和多样性&/b&理念,这个无需多言,看看现在泛化的“多样性”问题就好。&br&3、美国社会中出现的&b&拉美裔化、双语化、双文化的倾向&/b&。大量新移民在接受了“美国人”的身份同时并未放弃对自己原生文化的认同,双语、双文化。&br&4、&b&一些群体强调立足于人种和民族属性及性别的身份/特性,愈演愈烈的族裔政治&/b&。(PS.说实话,换做6年前我第一次看的时候还没意识到这个问题,当时觉得有点摸不着头脑,后来BLM等愈演愈烈地时候我幡然醒悟,原来这事早有人提醒过了。&br&5、移民社群及其原籍国政府对美国社会施加影响,不可说。&br&6、&b&精英人士日益强调其世界主义的和跨国的身份/特征等&/b&,经济全球化后,跨国集团为了更加轻易地攫取资源,而故意淡化自己“美国公民”的身份,而且对“造福美国社会”等过去天经地义的事并不放在心上,而且危险的是&b&美国对这些人的控制力正在不断减弱&/b&,大有跨国集团成为“国上之国”的危险趋势。&br&&b&第四部分,这些挑战正在影响着美国特性的未来实质及其重要性。&/b&随着种族属性不再重要,盎格鲁-新教文化又受到冲击,“美国信念”的重要性增强了,但仅靠信念或意识形态立国,将是脆弱的 。因此,美国应该重申其历史性的盎格鲁-新教文化、宗教信仰和价值观,重振美国特性。&br&&b&二、决定美国特性的因素:是信念?还是文化?&/b&&br&处于美国特性核心地位是“文化”还是“信念”?&br&一部分美国学者认为:民族文化就是由一个种族集团或者种族决定的生活方式,它要求所有其他人都顺应它;但国家信念只是一套关于美国应该是什么的观念――它是&b&向所有人开放的&/b&:无论其信仰、民族或者种族如何。在盎格鲁-新教文化的精英变得缺乏进取精神时,&b&它可以通过吸收新的移民团体,而增加其活力&/b&。&br&这一派坚信,&b&移民和多样性是积极的因素&/b&。开放且富有活力的美国&b&能够吸收和同化任何一个种族团体&/b&。同时认为,美国是一个立足于自由和公正的“美国信念”的&b&意识形态国家&/b&,而非种族国家;美国在文化上越是变得富有多样性,那么在确立美国人的共性时,“美国信念”的政治价值就越重要,而多样性的重要性也可以体现出来。&br&另一部分认为:盎格鲁-新教文化对于界定美国特性起着决定性的作用,所谓“美国信念”只不过是这一文化的产物。&br&这一方也是亨廷顿所支持的。&br&亨廷顿认为:随着20世纪70年代以来世界范围民主化浪潮的推进,特别是在冷战结束和苏联解体之后,&b&美国已经失去了意识形态上的敌人&/b&,它所倡导的自由、民主、平等、个人主义等信念似乎已为普世价值观,不再为美国人所独享,因此,&b&美国信念已不能作为界定美国特性的决定性因素&/b&了。&br&其次,亨廷顿是一个盎格鲁-新教文化至上者,以保护白人本土文化为己任。其在前言中表示:“&b&我强调的是盎格鲁-新教的文化重要,而不是说盎格鲁-新教的人重要&/b&,只要美国人能够致力于发扬盎格鲁-新教文化以及我们前辈所树立的美国信念,即便是创建美国的那些白人盎格鲁-撒克逊新教徒的后裔在美国人口中只占很少的、无足轻重的少数,美国仍会长久地保持其为美国。” 亨廷顿在文化方面是一个&b&保守主义者&/b&,他要保守乃至发扬光大的就是盎格鲁-新教文化。&br&&b&三、美国的核心文化是什么?&/b&&br&亨廷顿认为,美国的核心文化至今依然主要是17-18世纪创建美国社会的那些“&b&定居者文化&/b& ”,即盎格鲁-新教文化。&br&在论证盎格鲁-新教文化在美国文化中的核心地位时,亨廷顿把&b&北美大陆早期的殖民开拓者定义为“定居者”,而非“移民”&/b&。其区别:“&b&定居者&/b&是离开一个现有的社会,通常是成群出走,以便建立一个新的群体,其位置是在一个新的、通常遥远的疆域。他们充满了一种&b&集体目的感&/b&。他们或明或暗地恪守一个协约或章程,它&b&构建他们所建立的群体的基础&/b&并&b&界定他们与自己祖国的关系&/b&。&b&移民&/b&并不是建立一个新社会,而是&b&从一个社会转移到一个不同的社会&/b&,这种人口流动通常是&b&个人&/b&采取的行动,涉及的是个人及其家属,&b&以个人的方式界定他们与原居国和新居国的关系&/b&。” &br&以亨廷顿的观点看:&b&美国的核心文化就是这些早期的定居者创造的,后来的移民只是顺应和接受了这种文化。&br&四、拉美裔移民:是对美国的威胁吗?&/b&&br&亨廷顿认为,当前“对美国传统的国家特性的唯一最直接、最严重的威胁来自拉丁美洲,特别是来自墨西哥的大量持续不断的移民,以及他们远比黑人和白人高得多的出生率。墨西哥移民的持续不断地涌入美国会降低文化同化的动力。墨西哥裔美国人不再视自己为必须适应处于支配性地位的群体并接受其文化的一个小团体的成员。随着数量的增加,他们变得更加坚持他们自己的种族认同和文化。长此以往,美国将会被分裂成为一个两种语言、两种文化的国家。美国转变成这样的一个国家虽然不一定是世界末日的到来,但这将是我们所熟悉的已存在了三个世纪的美国的终结。美国人不应该让这种改变发生,除非他们能确信新出现的国家会更好。”&br&书中提到,在工业化时代的移民过程中,欧洲移民成为信奉盎格鲁-新教的美国人,“在很大程度上是因为来自进步政治家、知识分子以及像亨利o福特这样的工业界领袖等组成的庞杂联盟的压力。这个联盟努力对移民在语言、道德观念以及市民观念等方面进行教育。移民还面临来自移民社会内部的压力,他们的种族和宗教领袖――主教和犹太传教士,政治人物和老板――经常带头鼓励同化,顺应美国的文化,颂扬美国的民族主义。”&b&即,伴随着移民的流入,整个美国从上到下地推动“美国化”进程&/b&。&br&但最近数十年,美国社会出现了一些&b&阻碍同化&/b&的因素:&br&1、多样性和多元文化主义在知识界和舆论界的盛行,使&b&次国家特性/认同&/b&得以强化。至于多样性和多元文化主义思潮,看第二段。&br&2、拉美裔移民的大量涌入并集中聚居,&b&使得他们的同化更加困难&/b&。移民速度超过美国社会同化的速度,大批新移民来到美国,却扎根于其本土文化中,造成“美国认同”的缺失,给美国分裂埋下隐患。&br&3、在政党政治激烈竞争的环境中,&b&有的政客和政党出于胜选之需求&/b&,也迎合这些移民,&b&鼓励他们保留母国文化和语言&/b&。(现如今的民主党的政策)&br&但移民同化是一个非常复杂的问题,有批评者认为:&br&1、同化是双向的:移民团体一方面顺应美国的主流文化;另一方面他们通过贡献他们自己的文化,重新解释和丰富了美国的主流文化”&br&2、随着时间的推移,这些移民的认同不是一成不变的,肯定是会发生变化的。&br&3、移民能够同时接受不止一种文化 ,拉美裔移民也是非常渴望同化的。&br&4、针对拉美裔移民,特别是墨西哥裔移民的涌入可能导致美国南部和西南部部分地区“分裂”的担忧,美国是要为追求个人自由和机会的人,无论其祖先、种族或者宗教派别,建立一个共同的家园。“没有证据可以让人相信墨西哥和中美洲移民及其后代将会继续保持他们的对其祖先国家的政治忠诚。大多数墨西哥裔美国人是非常愿意按照诸如正当的法律程序、言论和集会自由、宗教自由、政教分离以及通过监督、制衡和分权的限权政府体制等生活。很多人愿意为这一制度斗争甚至献出生命。”&br&&b&五、美国国家特性/认同与美国的国际地位&/b&&br&亨廷顿从《文明的冲突》开始就体现了他一直重视美国国家特性/认同、国家利益与外交政策之间关系等重要问题。&br&亨廷顿认为,“国家利益来自国家特性。要知道我们的利益是什么,就得首先知道我们是什么人 。”&br&美国一般公众和很多精英对国家特性/国家认同的看法差异很大。公众关心比较多的是&b&确保居住环境安全、社会保障、国内经济发展与维护国家主权等&/b&;&b&而“精英”关注更多的是参与并主导全球经济、支持国际贸易和移民、强化国际制度、推动国际安全与和平、向外扩展美国式民主以及在国内鼓励少数族群的认同和文化等&/b&。&br&显然,在美国的精英阶层和公众之间存在巨大的裂痕。&br&亨廷顿在书中提出了美国与世界交往的三种模式 :&br&&b&第一种,全球主义的方案&/b&。&br&持全球主义的态度,向其他人民和文化敞开大门,多样性成为其最重要的价值,像种族的、人种的、文化的等次国家层次认同应受到鼓励;美国的“内务”将愈来愈多地受到国际机制和国际规则的影响,而不再完全取决于联邦和州政府。&br&&b&第二种,霸权主义的方案&/b&。&br&就是用美国价值观来改造世界。&br&但是,在亨廷顿看来,前两种都将会降低甚至消除美国与其他国家的社会、政治和文化差异,使美国丧失其特性。&br&因此,他提出了&b&第三种方案:&/b&&br&&b&民族主义模式&/b&,保持和促进美国的宗教和文化特征。在亨廷顿看来,美国精英阶层的全球主义倾向可能会侵蚀美国的特性;一个开放的、多样性的美国,配合着听命和受制于国际规则的精英阶层,将会破坏美国作为一个国家的团结的特性。&br&&b&六、总结&/b&&br&《文明的冲突》一书中,亨廷顿在论及西方文化受到的来自西方社会内部集团的挑战时说,“如果同化移民的努力归于失败,美国便会成为一个分裂的国家,并存在内部冲突和由此造成分裂的潜在可能。”同时还特别强调,多元文化主义是“对美国更为直接和危险的挑战”。《文明的冲突》关注的是国际事务,而《我们是谁?》一书就近似是《文明的冲突》国内版。&br&《文明的冲突》中,亨廷顿忧虑的是:由于其他文明的复兴而导致的西方文明的相对衰落。他认为,为挽救日益相对衰落的西方文明,应对来自非西方文明的挑战,应该加强对西方文化的认同。并且认为“由于美国是最强大的西方国家,这个责任就不可能推卸地落在了美利坚合众国的肩上。如果美国放弃了美国信条和西方文明,就意味着我们所认识的美利坚合众国的终结。实际上也就意味着西方文明的终结。” &br&《我们是谁?》中,亨廷顿担心的是:由于未同化的移民的涌入、次国家认同的强化以及多元文化主义的盛行而导致盎格鲁-新教文化在美国文化中核心地位的动摇。那么为应对来自其他文化的挑战,他积极倡导强化对盎格鲁-新教文化的认同。在他看来,美国能否重振国家特性、捍卫和保护盎格鲁-新教文化的核心地位,攸关它的国际地位能否得以延续和维持的问题。
看见这个问题,缘分啊。 本科的时候选修课正好做过此书的读书报告,因此结合目前实际做点修改贴出来吧。 == 哈佛大学政治学教授塞缪尔o亨廷顿在911事件后写书《我们是谁?》,这本书延续了《文明的冲突》中的基本论调,但是视线焦点由世界转向美国。 (…
&figure&&img src=&/50/v2-14db8ccb72e2c01ee3c71_b.jpg& data-rawwidth=&450& data-rawheight=&394& class=&origin_image zh-lightbox-thumb& width=&450& data-original=&/50/v2-14db8ccb72e2c01ee3c71_r.jpg&&&/figure&&p&&/p&&figure&&img src=&/v2-2d086b12f3d9ab4deeea94_b.png& data-rawwidth=&800& data-rawheight=&511& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/v2-2d086b12f3d9ab4deeea94_r.png&&&/figure&&p&李将军雕像被砸一事情把米国国内愈加激烈的冲突推向了一个新的高潮。&/p&&p&然而以仇恨白人为风潮的当今时代,米国黑人旁友们却并没有严格一致地提出:“&b&&i&基督教是白人宗教,基督教叙事是白人压迫叙事&/i&&/b&。”这种观点——这恰恰是与义和团的神仙打架论调相悖的。即使是提出要砸烂米国国父大奴隶主乔治·华盛顿雕像的James E. Dukes同样也是一位黑人牧师。&/p&&p&&br&&/p&&figure&&img src=&/v2-ac943cf02f90d58edadcad_b.jpg& data-rawwidth=&960& data-rawheight=&960& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&/v2-ac943cf02f90d58edadcad_r.jpg&&&/figure&&p&&br&&/p&&figure&&img src=&/v2-8f5a5efffefcc6820403_b.jpg& data-rawwidth=&526& data-rawheight=&701& class=&origin_image zh-lightbox-thumb& width=&526& data-original=&/v2-8f5a5efffefcc6820403_r.jpg&&&/figure&&p&&br&&/p&&figure&&img src=&/v2-a5e2eb2d06ccbcf4fcd9581_b.png& data-rawwidth=&774& data-rawheight=&311& class=&origin_image zh-lightbox-thumb& width=&774& data-original=&/v2-a5e2eb2d06ccbcf4fcd9581_r.png&&&/figure&&p&&br&&/p&&figure&&img src=&/v2-4df848a25f31ba03923efe_b.png& data-rawwidth=&474& data-rawheight=&226& class=&origin_image zh-lightbox-thumb& width=&474& data-original=&/v2-4df848a25f31ba03923efe_r.png&&&/figure&&p&即便是被白左、BLM和知乎小将们千夫所指的WASP仍然只是WASP,加上了严格的White Anglo-Saxon限定条件。许多谈及米国黑人民权运动的旁友们常常提起Martin Luther King Jr的黑人身份,但是很少有人提及这位浸信会牧师的宗教身份。&/p&&figure&&img src=&/v2-a743d93b86_b.jpg& data-rawwidth=&795& data-rawheight=&600& class=&origin_image zh-lightbox-thumb& width=&795& data-original=&/v2-a743d93b86_r.jpg&&&/figure&&p&&br&&/p&&figure&&img src=&/v2-6c4feade5aa7a85c3f625_b.jpg& data-rawwidth=&800& data-rawheight=&538& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/v2-6c4feade5aa7a85c3f625_r.jpg&&&/figure&&p&&br&&/p&&figure&&img src=&/v2-cb90eb2ae557_b.jpg& data-rawwidth=&544& data-rawheight=&357& class=&origin_image zh-lightbox-thumb& width=&544& data-original=&/v2-cb90eb2ae557_r.jpg&&&/figure&&p&当然,要说从MLK开始,黑人民权运动的发展与BLM的兴起会和基督教有怎样的明暗线交络,这一个命题太过宏大了,我个人并无意在此展开,这里仅将一些作品放上来,为各位旁友在BLM这个今日火得不能再火的议题上打开一个新的视角。&/p&&p&&br&&/p&&figure&&img src=&/v2-c82ad22d0defc2dbbbec19b2c5fa0208_b.jpg& data-rawwidth=&212& data-rawheight=&299& class=&content_image& width=&212&&&/figure&&p&&br&&/p&&figure&&img src=&/v2-ff0c090dc_b.jpg& data-rawwidth=&1024& data-rawheight=&768& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&/v2-ff0c090dc_r.jpg&&&/figure&&p&当然,我个人对傅天娜修女的一些观点仍持保留态度,但是黑人誓反教兄弟们则当仁不让地把来自这位波兰白人天主教徒的耶稣像搬了过来——哦不是,是还原了过来。&/p&&p&&br&&/p&&figure&&img src=&/v2-9148c7cab0d2b557c3aeba6a3f53f97a_b.jpg& data-rawwidth=&564& data-rawheight=&761& class=&origin_image zh-lightbox-thumb& width=&564& data-original=&/v2-9148c7cab0d2b557c3aeba6a3f53f97a_r.jpg&&&/figure&&p&邪恶的法国天主教徒所拜的偶像加上脏辫就万事大吉了。&/p&&figure&

我要回帖

更多关于 火影手游忍者上架时间 的文章

 

随机推荐