java面试题大合集(开发者必看)

前言

本文来自百度网络的一篇文章,因为没有答案,如今整理了一些比较好的回答和好的博客,能够本身扩展思路,若是你们有一下面试题的更好的答案,欢迎在评论区留言。以上所有来自网络!此外,个人微信公众号将每日分享下面面试题相关的知识点总结干货,欢迎关注微信公众号:好好学javajavascript

文章推荐html

基本概念

一、操做系统中 heap 和 stack 的区别nginx

堆:堆空间通常由程序员来分配,能够由垃圾回收机制来回收。通常用来存放new建立的对象和数组。  
栈:栈是“后进先出”的存储空间,通常用来存储基本类型的数据和对象的引用。程序员

二、什么是基于注解的切面实现web

用注解的方式实现的面向切面编程(AOP),能够在某个方法的执行前或者执行后插入一些代码(例如日志功能的代码)。面试

三、什么是 对象/关系 映射集成模块

对象/关系映射(ORM):是指将程序中的对象自动持久化到关系型数据库中

四、什么是 Java 的反射机制

反射机制:是指程序能够在运行时 访问 或 修改 它自己状态和方法的这种能力。

五、什么是 ACID

A:atom  原子性  
C:consistency  一致性  
I:isolation  隔离性  
D:durability  持久性

六、BS与CS的联系与区别

C/S(Client/Server):是指须要安装的客户端应用程序。  
B/S(Brower/Server):是指能够用浏览器直接访问的应用程序。

七、Cookie 和 Session 的区别

Cookie:是把数据保存在浏览器本地,并随着每一次请求发送到服务器。  
Session:是把用户数据保存在服务器端。

八、fail-fast 与 fail-safe 机制有什么区别

fail-fast(快速失败):快速失败机制在遍历一个集合时,若是集合内容被修改,会抛出ConcurrentModificationException异常。  
fail-safe(安全失败):安全失败机制对集合的任何修改都会在一个复制的集合上进行,所以不会抛出异常。

九、get 和 post请求的区别

get:  
一、请求的参数会附加在URL以后,多个参数用 & 链接。  
二、由于URL的长度限制,get 方式传输的数据大小有所限制。  
三、安全性低,由于传输的数据会显示在请求的URL中。  
post:  
一、将请求参数放置在 HTTP 数据包,发送给服务器。  
二、传送的数据量比较大  
三、安全性较高

十、Interface 与 abstract 类的区别

一、接口(Interface)须要被实现,抽象类(abstract类)须要被继承。  
二、一个类能够实现多个接口,但一个类只能继承一个抽象类。  
三、接口里面的方法所有是抽象的,抽象类里面能够有非抽象的方法。

十一、IoC的优势是什么

IoC(控制反转)的优势是:咱们须要使用一个对象的时候无需本身建立,能够从IoC容器中直接获取一个对象,而后直接使用。

十二、IO 和 NIO 的区别,NIO的优势

一、IO是面向流的,NIO是面向缓冲区的。  
二、IO是阻塞的,NIO是非阻塞的。  
三、NIO有选择器机制,可让一个线程来监视多个IO通道。    
NIO的优势:    
一、不须要使用 read() 或者 write() 就能够处理文件内容。  
二、NIO的处理效率很快。

1三、Java 8 / Java 7 为咱们提供了什么新功能

Java7 新特性:

一、switch里面的case条件可使用字符串了  
二、运用 List\ tempList = new ArrayList<>(); 即泛型实例化类型自动推断  
Java8 新特性:  
一、Java8 容许咱们给接口添加一个非抽象的方法实现,只须要使用 default 关键字便可  
二、lambda 表达式

1四、什么是竞态条件?举个例子说明。

当两个线程竞争同一资源时,若是对资源的访问顺序敏感,就称存在竞态条件。

1五、JRE、JDK、JVM 及 JIT 之间有什么不一样

JVM(java 虚拟机):JVM 处理字节码文件,让 java 语言实现跨平台。  
JRE(java运行时环境):JRE 是 JVM 的一个超集。  
JDK(java开发工具箱):JDK 包含了 JRE 和 Java的开发环境。  
JIT(即时编译器):即时编译器是种特殊的编译器,它经过把字节码变成机器码来提升JVM的效率。

1六、MVC 的各个部分都用哪些技术来实现?如何实现?

Model层:能够用普通的 JavaBean 来实现。  
View层:能够用 JSP 或者 JS 来实现。  
Controller层:能够用 Struts2 或者 Spring MVC 来实现。

1七、RPC 通讯 和 RMI 区别

RPC(remote procedure call),即远程过程调用。  
RMI(remote method invocation),即远程方法调用。  
二者的实质都是调用远程的服务,只不过RPC是用面向过程的语言如C语言实现,而RMI是用面向对象的语言如Java实现。

1八、什么是 Web Service(Web服务)

Web Service 就是经过网络调用其余网站的资源。

1九、JSWDL 开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI、WSDL解释。

JAXP:(Java API for XML Parsing) 定义了在Java中使用DOM, SAX, XSLT的通用的接口。这样在你的程序中你只要使用这些通用的接口,当你须要改变具体的实现时候也不须要修改代码。  
JAXM:(Java API for XML Messaging) 是为SOAP通讯提供访问方法和传输机制的API。  
SOAP:即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML编码信息的轻量级协议。    
UDDI:UDDI的目的是为电子商务创建标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业可以发现的访问协议的实现标准。    
WSDL:是一种 XML 格式,用于将网络服务描述为一组端点,这些端点对包含面向文档信息或面向过程信息的消息进行操做。这种格式首先对操做和消息进行抽象描述,而后将其绑定到具体的网络协议和消息格式上以定义端点。相关的具体端点即组合成为抽象端点(服务)。

20、WEB容器主要有哪些功能?并请列出一些常见的WEB容器名字。

WEB容器的功能:通讯支持、管理servlet的生命周期、多线程支持、jsp支持(将jsp翻译成java)  
常见的WEB容器:Tomcat、WebLogic、WebSphere

2一、一个”.java”源文件中是否能够包含多个类(不是内部类)?有什么限制

能够,一个“.java”源文件里面能够包含多个类,可是只容许有一个public类,而且类名必须和文件名一致。

2二、简单说说你了解的类加载器。是否实现过类加载器

类加载器负责加载Java类的字节码到Java虚拟机中。  
本身实现类加载器通常须要继承 java.lang.ClassLoader ,覆写 findClass(String name)方法。

2三、解释一下什么叫AOP(面向切面编程)

AOP(Aspect Oriented Programming),即面向切面编程,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,便于减小系统的重复代码,下降模块之间的耦合度,并有利于将来的可操做性和可维护性。

2四、请简述 Servlet 的生命周期及其相关的方法

①实例化阶段:服务器对Servlet进行实例化,调用Servlet的构造方法  
②初始化阶段:服务器调用Servlet的init方法进行初始化(只在第一次请求时调用)。  
③请求处理阶段:服务器调用Servlet的service方法,而后根据请求方式调用相应的doXXX方法。  
④服务终止阶段:服务器调用Servlet的destroy方法销毁Servlet实例

2五、请简述一下 Ajax 的原理及实现步骤

Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),经过在后台与服务器进行少许数据交换,可使网页实现异步更新。这意味着能够在不从新加载整个网页的状况下,对网页的某部分进行更新。  
原理:HTTP协议的异步通讯  
实现步骤:  
一、建立一个XMLHttpRequest对象  
二、调用该对象的open方法  
三、设置回调函数

2六、简单描述 Struts 的主要功能

一、获取表单内容,并组织生成参数对象  
二、根据请求的参数转发请求给适当的控制器  
三、在控制器中调用业务接口  
四、将业务接口返回的结果包装起来发送给指定的视图,并由视图完成处理结果的展示
五、作一些简单的校验或是国际化工做

2七、什么是 N 层架构

N层架构是一种软件抽象的层次结构,是对复杂软件的一种纵向切分,每一层次中完成同一类型的操做,以便将各类代码根据其完成的使命来进行分割,以下降软件的复杂度,提升其可维护性。通常来讲,层次之间是向下依赖的,下层代码未肯定其接口前,上层代码是没法开发的,下层代码接口的变化将使上层的代码一块儿变化。

2八、什么是 CORBA?用途是什么

CORBA(Common Object Request Broker Architecture 公共对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程序体系规范。  
用途:  
一、存取来自现行桌面应用程序的分布信息和资源;  
二、使现有业务数据和系统成为可供利用的网络资源;  
三、为某一特定业务用的定制的功能和能力来加强现行桌面工具和应用程序;  
四、改变和发展基于网络的系统以反映新的拓扑结构或新资源;

2九、什么是 Java虚拟机?为何Java被称做是“平台无关的编程语言”

Java虚拟机是执行字节码文件(.class)的虚拟机进程。  
由于不一样的平台装有不一样的Java虚拟机,它们可以将相同的.class文件,解释成不一样平台所须要的机器码。因此Java被称为平台无关的编程语言。

30、什么是正则表达式?用途是什么?哪一个包使用正则表达式来实现模式匹配

正则表达式:是对字符串操做的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,用这个“规则字符串”来表达对字符串的过滤逻辑。  
用途包括:  
一、字符串匹配  
二、指定字符串替换  
三、指定字符串查找  
四、字符串分割  
正则表达式的包:java.util.regex包

3一、什么是懒加载(Lazy Loading)

懒加载:即为延迟加载,顾名思义就是在须要的时候才加载,这样作效率会比较低,可是占用内存低。

3二、什么是尾递归,为何须要尾递归

若是一个函数中全部递归形式的调用都出如今函数的末尾,咱们称这个递归函数是尾递归的。  
为何须要尾递归:尾递归和普通递归的不一样点在对内存的占用,普通递归建立stack后内存减小,而尾递归只会占用恒量的内存。

3三、什么是控制反转(Inversion of Control)与依赖注入(Dependency Injection)

控制反转:是指将建立对象的功能交给Spring容器,在咱们须要使用对象的时候不须要本身建立,能够直接从容器中获取。    
依赖注入:动态的向某个对象提供它所依赖的其余对象。

关键字finalize

一、什么是finalize() 方法

Java 可使用 finalize() 方法在垃圾收集器将对象从内存中清除出去以前作一些必要的清理工做。

二、finalize()方法何时被调用

这个方法是由垃圾收集器在肯定这个对象没有被引用时对这个对象调用的。

三、析构函数(finalization) 的目的是什么

析构函数的目的是:在清除对象前,完成一些清理工做,好比:释放内存等。

四、final 和 finalize 的区别

final关键字能够用于类、方法、变量前,用来表示该类、方法、变量具备不可变的特性。

finalize方法用于回收资源,能够为任何一个类添加finalize方法。该方法将在垃圾回收器清除对象以前调用。

注意:

关于如下java基础、io、集合、多线程、虚拟机、设计模式等的文章和源码解析,能够到个人微信公众号获取,每日分享!

final

一、final关键字有哪些用法

二、final 与 static 关键字能够用于哪里?它们的做用是什么

三、final, finally, finalize的区别

四、final、finalize 和 finally 的不一样之处?

五、可否在运行时向 static final 类型的赋值

六、使用final关键字修饰一个变量时,是引用不能变,仍是引用的对象不能变

七、一个类被声明为final类型,表示了什么意思

八、throws, throw, try, catch, finally分别表明什么意义

九、Java 有几种修饰符?分别用来修饰什么

volatile

一、volatile 修饰符有过什么实践

二、volatile 变量是什么?volatile 变量和 atomic 变量有什么不一样

三、volatile 类型变量提供什么保证?能使得一个非原子操做变成原子操做吗

四、能建立 volatile 数组吗?

五、transient变量有什么特色

六、super何时使用

七、public static void 写成 static public void会怎样

八、说明一下public static void main(String args[])这段声明里每一个关键字的做用

九、请说出做用域public, private, protected, 以及不写时的区别

十、sizeof 是Java 的关键字吗

static

一、static class 与 non static class的区别

二、static 关键字是什么意思?Java中是否能够覆盖(override)一个private或者是static的方法

三、静态类型有什么特色

四、main() 方法为何必须是静态的?能不能声明 main() 方法为非静态

五、是否能够从一个静态(static)方法内部发出对非静态(non-static)方法的调用

六、静态变量在何时加载?编译期仍是运行期?静态代码块加载的时机呢

七、成员方法是否能够访问静态变量?为何静态方法不能访问成员变量

switch

一、switch 语句中的表达式能够是什么类型数据

二、switch 是否能做用在byte 上,是否能做用在long 上,是否能做用在String上

三、while 循环和 do 循环有什么不一样

操做符

一、&操做符和&&操做符有什么区别?

二、a = a + b 与 a += b 的区别?

三、逻辑操做符 (&,|,^)与条件操做符(&&,||)的区别

四、3*0.1 == 0.3 将会返回什么?true 仍是 false?

五、loat f=3.4; 是否正确?

六、short s1 = 1; s1 = s1 + 1;有什么错?

数据结构

基础类型(Primitives)

一、基础类型(Primitives)与封装类型(Wrappers)的区别在哪里

二、简述九种基本数据类型的大小,以及他们的封装类

三、int 和 Integer 哪一个会占用更多的内存? int 和 Integer 有什么区别?parseInt()函数在何时使用到

四、float和double的默认值是多少

五、如何去小数四舍五入保留小数点后两位

六、char 型变量中能不能存贮一个中文汉字,为何

类型转换

一、怎样将 bytes 转换为 long 类型

二、怎么将 byte 转换为 String

三、如何将数值型字符转换为数字

四、咱们能将 int 强制转换为 byte 类型的变量吗?若是该值大于 byte 类型的范围,将会出现什么现象

五、能在不进行强制转换的状况下将一个 double 值赋值给 long 类型的变量吗

六、类型向下转换是什么

数组

一、如何权衡是使用无序的数组仍是有序的数组

二、怎么判断数组是 null 仍是为空

三、怎么打印数组? 怎样打印数组中的重复元素

四、Array 和 ArrayList有什么区别?何时应该使用Array而不是ArrayList

五、数组和链表数据结构描述,各自的时间复杂度

六、数组有没有length()这个方法? String有没有length()这个方法

队列

一、队列和栈是什么,列出它们的区别

二、BlockingQueue是什么

三、简述 ConcurrentLinkedQueue LinkedBlockingQueue 的用处和不一样之处。

四、ArrayList、Vector、LinkedList 的存储性能和特性?

五、String 和 StringBuffer 的区别?

六、ByteBuffer 与 StringBuffer 有什么区别?

HashMap

一、HashMap的工做原理是什么

二、内部的数据结构是什么

三、HashMap 的 table的容量如何肯定?loadFactor 是什么? 该容量如何变化?这种变化会带来什么问题?

四、HashMap 实现的数据结构是什么?如何实现

五、HashMap 和 HashTable、ConcurrentHashMap 的区别

六、HashMap的遍历方式及效率

七、HashMap、LinkedMap、TreeMap的区别

八、如何决定选用HashMap仍是TreeMap

九、若是HashMap的大小超过了负载因子(load factor)定义的容量,怎么办

十、HashMap 是线程安全的吗?并发下使用的 Map 是什么,它们内部原理分别是什么,好比存储方式、 hashcode、扩容、 默认容量等

HashSet

一、HashSet和TreeSet有什么区别

二、HashSet 内部是如何工做的

三、WeakHashMap 是怎么工做的?

Set

一、Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用 == 仍是 equals()? 它们有何区别?

二、TreeMap:TreeMap 是采用什么树实现的?TreeMap、HashMap、LindedHashMap的区别。TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?

三、TreeSet:一个已经构建好的 TreeSet,怎么完成倒排序。

四、EnumSet 是什么

Hash算法

一、Hashcode 的做用

二、简述一致性 Hash 算法

三、有没有可能 两个不相等的对象有相同的 hashcode?当两个对象 hashcode 相同怎么办?如何获取值对象

四、为何在重写 equals 方法的时候须要重写 hashCode 方法?equals与 hashCode 的异同点在哪里

五、a.hashCode() 有什么用?与 a.equals(b) 有什么关系

六、hashCode() 和 equals() 方法的重要性体如今什么地方

七、Object:Object有哪些公用方法?Object类hashcode,equals 设计原则? sun为何这么设计?Object类的概述

八、如何在父类中为子类自动完成全部的 hashcode 和 equals 实现?这么作有何优劣。

九、能够在 hashcode() 中使用随机数字吗?

LinkedHashMap

一、LinkedHashMap 和 PriorityQueue 的区别是什么
List

一、List, Set, Map三个接口,存取元素时各有什么特色

二、List, Set, Map 是否继承自 Collection 接口

三、遍历一个 List 有哪些不一样的方式

LinkedList

一、LinkedList 是单向链表仍是双向链表

二、LinkedList 与 ArrayList 有什么区别

三、描述下 Java 中集合(Collections),接口(Interfaces),实现(Implementations)的概念。LinkedList 与 ArrayList 的区别是什么?

四、插入数据时,ArrayList, LinkedList, Vector谁速度较快?

ArrayList

一、ArrayList 和 HashMap 的默认大小是多数

二、ArrayList 和 LinkedList 的区别,何时用 ArrayList?

三、ArrayList 和 Set 的区别?

四、ArrayList, LinkedList, Vector的区别

五、ArrayList是如何实现的,ArrayList 和 LinkedList 的区别

六、ArrayList如何实现扩容

七、Array 和 ArrayList 有何区别?何时更适合用Array

八、说出ArraList,Vector, LinkedList的存储性能和特性

Map

一、Map, Set, List, Queue, Stack

二、Map 接口提供了哪些不一样的集合视图

三、为何 Map 接口不继承 Collection 接口

Collections

一、介绍Java中的Collection FrameWork。集合类框架的基本接口有哪些

二、Collections类是什么?Collection 和 Collections的区别?Collection、Map的实现

三、集合类框架的最佳实践有哪些

四、为何 Collection 不从 Cloneable 和 Serializable 接口继承

五、说出几点 Java 中使用 Collections 的最佳实践?

六、Collections 中 遗留类 (HashTable、Vector) 和 现有类的区别

七、什么是 B+树,B-树,列出实际的使用场景

接口

一、Comparator 与 Comparable 接口是干什么的?列出它们的区别

对象拷贝(clone)

一、如何实现对象克隆

二、深拷贝和浅拷贝区别

三、深拷贝和浅拷贝如何实现激活机制

四、写clone()方法时,一般都有一行代码,是什么

比较

一、在比较对象时,”==” 运算符和 equals 运算有何区别

二、若是要重写一个对象的equals方法,还要考虑什么

三、两个对象值相同(x.equals(y) == true),但却可有不一样的hash code,这句话对不对

构造器

一、构造器链是什么

二、建立对象时构造器的调用顺序

不可变对象

一、什么是不可变象(immutable object)

二、为何 Java 中的 String 是不可变的(Immutable)

三、如何构建不可变的类结构?关键点在哪里

四、能建立一个包含可变对象的不可变对象吗

五、如何对一组对象进行排序

方法

一、构造器(constructor)是否可被重写(override)

二、方法能够同时便是 static 又是 synchronized 的吗

三、abstract 的 method是否可同时是 static,是否可同时是 native,是否可同时是synchronized

四、Java支持哪一种参数传递类型

五、一个对象被看成参数传递到一个方法,是值传递仍是引用传递

六、当一个对象被看成参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里究竟是值传递仍是引用传递

七、咱们可否重载main()方法

八、若是main方法被声明为private会怎样
GC

概念

一、GC是什么?为何要有GC

二、何时会致使垃圾回收

三、GC是怎么样运行的

四、新老以及永久区是什么

五、GC 有几种方式?怎么配置

六、何时一个对象会被GC? 如何判断一个对象是否存活

七、System.gc() Runtime.gc()会作什么事情? 能保证 GC 执行吗

八、垃圾回收器能够立刻回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

九、Minor GC 、Major GC、Young GC 与 Full GC分别在何时发生

十、垃圾回收算法的实现原理

十一、若是对象的引用被置为null,垃圾收集器是否会当即释放对象占用的内存?

十二、垃圾回收的最佳作法是什么

GC收集器有哪些

一、垃圾回收器的基本原理是什么?

二、串行(serial)收集器和吞吐量(throughput)收集器的区别是什么

三、Serial 与 Parallel GC之间的不一样之处

四、CMS 收集器 与 G1 收集器的特色与区别

五、CMS垃圾回收器的工做过程

六、JVM 中一次完整的 GC 流程是怎样的? 对象如何晋升到老年代

七、吞吐量优先和响应优先的垃圾收集器选择

GC策略

一、举个实际的场景,选择一个GC策略

二、JVM的永久代中会发生垃圾回收吗

收集方法

一、标记清除、标记整理、复制算法的原理与特色?分别用在什么地方

二、若是让你优化收集方法,有什么思路

JVM参数

一、说说你知道的几种主要的jvm 参数

二、-XX:+UseCompressedOops 有什么做用

类加载器(ClassLoader)

一、Java 类加载器都有哪些

二、JVM如何加载字节码文件

内存管理

一、JVM内存分哪几个区,每一个区的做用是什么

二、一个对象从建立到销毁都是怎么在这些部分里存活和转移的

三、解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法

四、JVM中哪一个参数是用来控制线程的栈堆栈小

五、简述内存分配与回收策略

六、简述重排序,内存屏障,happen-before,主内存,工做内存

七、Java中存在内存泄漏问题吗?请举例说明

八、简述 Java 中软引用(SoftReferenc)、弱引用(WeakReference)和虚引用

九、内存映射缓存区是什么

十、jstack,jstat,jmap,jconsole怎么用

十一、32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?32 位和 64 位的 JVM,int 类型变量的长度是多数?

十二、怎样经过 Java 程序来判断 JVM 是 32 位 仍是 64 位

1三、JVM自身会维护缓存吗?是否是在堆中进行对象分配,操做系统的堆仍是JVM本身管理堆

1四、什么状况下会发生栈内存溢出

1五、双亲委派模型是什么

多线程基本概念

一、什么是线程

二、多线程的优势

三、多线程的几种实现方式

四、用 Runnable 仍是 Thread

五、什么是线程安全

六、Vector, SimpleDateFormat 是线程安全类吗

七、什么 Java 原型不是线程安全的

八、哪些集合类是线程安全的

九、多线程中的忙循环是什么

十、如何建立一个线程

十一、编写多线程程序有几种实现方式

十二、什么是线程局部变量

1三、线程和进程有什么区别?进程间如何通信,线程间如何通信

1四、什么是多线程环境下的伪共享(false sharing)

1五、同步和异步有何异同,在什么状况下分别使用他们?举例说明

Current

一、ConcurrentHashMap 和 Hashtable的区别

二、ArrayBlockingQueue, CountDownLatch的用法

三、ConcurrentHashMap的并发度是什么

四、CyclicBarrier 和 CountDownLatch有什么不一样?各自的内部原理和用法是什么

五、Semaphore的用法

Thread

一、启动一个线程是调用 run() 仍是 start() 方法?start() 和 run() 方法有什么区别

二、调用start()方法时会执行run()方法,为何不能直接调用run()方法

三、sleep() 方法和对象的 wait() 方法均可以让线程暂停执行,它们有什么区别

四、yield方法有什么做用?sleep() 方法和 yield() 方法有什么区别

五、Java 中如何中止一个线程

六、stop() 和 suspend() 方法为什么不推荐使用

七、如何在两个线程间共享数据

八、如何强制启动一个线程

九、如何让正在运行的线程暂停一段时间

十、什么是线程组,为何在Java中不推荐使用

十一、你是如何调用 wait(方法的)?使用 if 块仍是循环?为何

生命周期

一、有哪些不一样的线程生命周期

二、线程状态,BLOCKED 和 WAITING 有什么区别

三、画一个线程的生命周期状态图

四、ThreadLocal 用途是什么,原理是什么,用的时候要注意什么

ThreadPool

一、线程池是什么?为何要使用它

二、如何建立一个Java线程池

三、ThreadPool用法与优点

四、提交任务时,线程池队列已满时会发会生什么

五、newCache 和 newFixed 有什么区别?简述原理。构造函数的各个参数的含义是什么,好比 coreSize, maxsize 等

六、线程池的实现策略

七、线程池的关闭方式有几种,各自的区别是什么

八、线程池中submit() 和 execute()方法有什么区别?

线程调度

一、Java中用到的线程调度算法是什么

二、什么是多线程中的上下文切换

三、你对线程优先级的理解是什么

四、什么是线程调度器 (Thread Scheduler) 和时间分片 (Time Slicing)

线程同步

一、请说出你所知的线程同步的方法

二、synchronized 的原理是什么

三、synchronized 和 ReentrantLock 有什么不一样

四、什么场景下可使用 volatile 替换 synchronized

五、有T1,T2,T3三个线程,怎么确保它们按顺序执行?怎样保证T2在T1执行完后执行,T3在T2执行完后执行

六、同步块内的线程抛出异常会发生什么

七、当一个线程进入一个对象的 synchronized 方法A 以后,其它线程是否可进入此对象的 synchronized 方法B

八、使用 synchronized 修饰静态方法和非静态方法有什么区别

九、如何从给定集合那里建立一个 synchronized 的集合

一、Java Concurrency API 中 的 Lock 接口是什么?对比同步它有什么优点

二、Lock 与 Synchronized 的区别?Lock 接口比 synchronized 块的优点是什么

三、ReadWriteLock是什么?

四、锁机制有什么用

五、什么是乐观锁(Optimistic Locking)?如何实现乐观锁?如何避免ABA问题

六、解释如下名词:重排序,自旋锁,偏向锁,轻量级锁,可重入锁,公平锁,非公平锁,乐观锁,悲观锁

七、何时应该使用可重入锁

八、简述锁的等级方法锁、对象锁、类锁

九、Java中活锁和死锁有什么区别?

十、什么是死锁(Deadlock)?致使线程死锁的缘由?如何确保 N 个线程能够访问 N 个资源同时又不致使死锁

十一、死锁与活锁的区别,死锁与饥饿的区别

十二、怎么检测一个线程是否拥有锁

1三、如何实现分布式锁

1四、有哪些无锁数据结构,他们实现的原理是什么

1五、读写锁能够用于什么应用场景

1六、Executors类是什么? Executor和Executors的区别

1七、什么是Java线程转储(Thread Dump),如何获得它

1八、如何在Java中获取线程堆栈

1九、说出 3 条在 Java 中使用线程的最佳实践

20、在线程中你怎么处理不可捕捉异常

2一、实际项目中使用多线程举例。你在多线程环境中遇到的常见的问题是什么?你是怎么解决它的

2二、请说出与线程同步以及线程调度相关的方法

2三、程序中有3个 socket,须要多少个线程来处理

2四、假若有一个第三方接口,有不少个线程去调用获取数据,如今规定每秒钟最多有 10 个线程同时调用它,如何作到

2五、如何在 Windows 和 Linux 上查找哪一个线程使用的 CPU 时间最长

2六、如何确保 main() 方法所在的线程是 Java 程序最后结束的线程

2七、很是多个线程(多是不一样机器),相互之间须要等待协调才能完成某种工做,问怎么设计这种协调方案

2八、你须要实现一个高效的缓存,它容许多个用户读,但只容许一个用户写,以此来保持它的完整性,你会怎样去实现它

异常

基本概念

一、Error 和 Exception有什么区别

二、UnsupportedOperationException是什么

三、NullPointerException 和 ArrayIndexOutOfBoundException 之间有什么相同之处

四、什么是受检查的异常,什么是运行时异常

五、运行时异常与通常异常有何异同

六、简述一个你最多见到的runtime exception(运行时异常)

finally

一、finally关键词在异常处理中如何使用

二、若是执行finally代码块以前方法返回告终果,或者JVM退出了,finally块中的代码还会执行吗

三、try里有return,finally还执行么?那么紧跟在这个try后的finally {}里的code会不会被执行,何时被执行,在return前仍是后

四、在什么状况下,finally语句不会执行

五、throw 和 throws 有什么区别?

六、OOM你遇到过哪些状况?你是怎么搞定的?

七、SOF你遇到过哪些状况?

八、既然咱们能够用RuntimeException来处理错误,那么你认为为何Java中还存在检查型异常

九、当本身建立异常类的时候应该注意什么

十、致使空指针异常的缘由

十一、异常处理 handle or declare 原则应该如何理解

十二、怎么利用 JUnit 来测试一个方法的异常

1三、catch块里别不写代码有什么问题

1四、你曾经自定义实现过异常吗?怎么写的

1五、什么是 异常链

1六、在try块中能够抛出异常吗

JDBC

一、经过 JDBC 链接数据库有哪几种方式

二、阐述 JDBC 操做数据库的基本步骤

三、JDBC 中如何进行事务处理

四、什么是 JdbcTemplate

五、什么是 DAO 模块

六、使用 JDBC 操做数据库时,如何提高读取数据的性能?如何提高更新数据的性能

七、列出 5 个应该遵循的 JDBC 最佳实践

IO

File

一、File类型中定义了什么方法来建立一级目录

二、File类型中定义了什么方法来判断一个文件是否存在

一、为了提升读写性能,能够采用什么流

二、Java中有几种类型的流

三、JDK 为每种类型的流提供了一些抽象类以供继承,分别是哪些类

四、对文本文件操做用什么I/O流

五、对各类基本数据类型和String类型的读写,采用什么流

六、能指定字符编码的 I/O 流类型是什么

序列化

一、什么是序列化?如何实现 Java 序列化及注意事项

二、Serializable 与 Externalizable 的区别

Socket

一、socket 选项 TCP NO DELAY 是指什么

二、Socket 工做在 TCP/IP 协议栈是哪一层

三、TCP、UDP 区别及 Java 实现方式

四、说几点 IO 的最佳实践

五、直接缓冲区与非直接缓冲器有什么区别?

六、怎么读写 ByteBuffer?ByteBuffer 中的字节序是什么

七、当用System.in.read(buffer)从键盘输入一行n个字符后,存储在缓冲区buffer中的字节数是多少

八、如何使用扫描器类(Scanner Class)令牌化

面向对象编程(OOP)

一、解释下多态性(polymorphism),封装性(encapsulation),内聚(cohesion)以及耦合(coupling)

二、多态的实现原理

三、封装、继承和多态是什么

四、对象封装的原则是什么?

一、得到一个类的类对象有哪些方式

二、重载(Overload)和重写(Override)的区别。重载的方法可否根据返回类型进行区分?

三、说出几条 Java 中方法重载的最佳实践

抽象类

一、抽象类和接口的区别

二、抽象类中是否能够有静态的main方法

三、抽象类是否可实现(implements)接口

四、抽象类是否可继承具体类(concrete class)

匿名类(Anonymous Inner Class)

一、匿名内部类是否能够继承其它类?是否能够实现接口

内部类

一、内部类分为几种

二、内部类能够引用它的包含类(外部类)的成员吗

三、请说一下 Java 中为何要引入内部类?还有匿名内部类

继承

一、继承(Inheritance)与聚合(Aggregation)的区别在哪里

二、继承和组合之间有什么不一样

三、为何类只能单继承,接口能够多继承

四、存在两个类,B 继承 A,C 继承 B,能将 B 转换为 C 么?如 C = (C) B

五、若是类 a 继承类 b,实现接口c,而类 b 和接口 c 中定义了同名变量,请问会出现什么问题

接口

一、接口是什么

二、接口是否可继承接口

三、为何要使用接口而不是直接使用具体类?接口有什么优势

泛型

一、泛型的存在是用来解决什么问题

二、泛型的经常使用特色

三、List可否转为List

工具类

日历

一、Calendar Class的用途

二、如何在Java中获取日历类的实例

三、解释一些日历类中的重要方法

四、GregorianCalendar 类是什么

五、SimpleTimeZone 类是什么

六、Locale类是什么

七、如何格式化日期对象

八、如何添加小时(hour)到一个日期对象(Date Objects)

九、如何将字符串 YYYYMMDD 转换为日期

Math

一、Math.round()什么做用?Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?

XML

一、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?DOM 和 SAX 解析器有什么不一样?

二、Java解析XML的方式

三、用 jdom 解析 xml 文件时如何解决中文问题?如何解析

四、你在项目中用到了 XML 技术的哪些方面?如何实现

动态代理

一、描述动态代理的几种实现方式,分别说出相应的优缺点

设计模式

一、什么是设计模式(Design Patterns)?你用过哪一种设计模式?用在什么场合

二、你知道哪些商业级设计模式?

三、哪些设计模式能够增长系统的可扩展性

单例模式

一、除了单例模式,你在生产环境中还用过什么设计模式?

二、写 Singleton 单例模式

三、单例模式的双检锁是什么

四、如何建立线程安全的 Singleton

五、什么是类的单例模式

六、写出三种单例模式实现

适配器模式

一、适配器模式是什么?何时使用

二、适配器模式和代理模式以前有什么不一样

三、适配器模式和装饰器模式有什么区别

四、何时使用享元模式

五、何时使用组合模式

六、何时使用访问者模式

七、什么是模板方法模式

八、请给出1个符合开闭原则的设计模式的例子

注意:

关于以上java基础、io、集合、多线程、虚拟机、设计模式等的文章和源码解析,能够到个人微信公众号获取,每日分享!

开放问题(看你的了)

一、用一句话归纳 Web 编程的特色

二、Google是如何在一秒内把搜索结果返回给用户

三、哪一种依赖注入方式你建议使用,构造器注入,仍是 Setter方法注入

四、树(二叉或其余)造成许多普通数据结构的基础。请描述一些这样的数据结构以及什么时候可使用它们

五、某一项功能如何设计

六、线上系统忽然变得异常缓慢,你如何查找问题

七、什么样的项目不适合用框架

八、新浪微博是如何实现把微博推给订阅者

九、简要介绍下从浏览器输入 URL 开始到获取到请求界面以后 Java Web 应用中发生了什么

十、请你谈谈SSH整合

十一、高并发下,如何作到安全的修改同一行数据

十二、12306网站的订票系统如何实现,如何保证不会票不被超卖

1三、网站性能优化如何优化的

1四、聊了下曾经参与设计的服务器架构

1五、请思考一个方案,实现分布式环境下的 countDownLatch

1六、请思考一个方案,设计一个能够控制缓存整体大小的自动适应的本地缓存

1七、在你的职业生涯中,算得上最困难的技术挑战是什么

1八、如何写一篇设计文档,目录是什么

1九、大写的O是什么?举几个例子

20、编程中本身都怎么考虑一些设计原则的,好比开闭原则,以及在工做中的应用

2一、解释一下网络应用的模式及其特色

2二、设计一个在线文档系统,文档能够被编辑,如何防止多人同时对同一份文档进行编辑更新

2三、说出数据链接池的工做机制是什么

2四、怎么获取一个文件中单词出现的最高频率

2五、描述一下你最经常使用的编程风格

2六、若是有机会从新设计大家的产品,你会怎么作

2七、如何搭建一个高可用系统

2八、如何启动时不需输入用户名与密码

2九、如何在基于Java的Web项目中实现文件上传和下载

30、如何实现一个秒杀系统,保证只有几位用户能买到某件商品。

3一、如何实现负载均衡,有哪些算法能够实现

3二、如何设计一个购物车?想一想淘宝的购物车如何实现的

3三、如何设计一套高并发支付方案,架构如何设计

3四、如何设计创建和保持 100w 的长链接

3五、如何避免浏览器缓存。

3六、如何防止缓存雪崩

3七、若是AB两个系统互相依赖,如何解除依

3八、若是有人恶意建立非法链接,怎么解决

3九、若是有几十亿的白名单,天天白天须要高并发查询,晚上须要更新一次,如何设计这个功能

40、若是系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)

4一、若是要设计一个图形系统,请你设计基本的图形元件(Point,Line,Rectangle,Triangle)的简单实现

4二、若是让你实现一个并发安全的链表,你会怎么作

4三、应用服务器与WEB 服务器的区别?应用服务器怎么监控性能,各类方式的区别?你使用过的应用服务器优化技术有哪些

4四、大型网站在架构上应当考虑哪些问题

4五、有没有处理过线上问题?出现内存泄露,CPU利用率标高,应用无响应时如何处理的

4六、最近看什么书,印象最深入的是什么

4七、描述下经常使用的重构技巧

4八、你使用什么版本管理工具?分支(Branch)与标签(Tag)之间的区别在哪里

4九、你有了解过存在哪些反模式(Anti-Patterns)吗

50、你用过的网站前端优化的技术有哪些

5一、如何分析Thread dump

5二、你如何理解AOP中的链接点(Joinpoint)、切点(Pointcut)、加强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念

5三、你是如何处理内存泄露或者栈溢出问题的

5四、大家线上应用的 JVM 参数有哪些

5五、怎么提高系统的QPS和吞吐量

知识面

一、解释什么是 MESI 协议(缓存一致性)

参考:http://blog.csdn.net/zxp_cpinfo/article/details/53523697

二、谈谈 reactor 模型

参考:https://www.jianshu.com/p/2461535c38f3

三、Java 9 带来了怎样的新功能

参考:http://blog.csdn.net/u013322876/article/details/76610029

四、Java 与 C++ 对比,C++ 或 Java 中的异常处理机制的简单原理和应用

参考:http://blog.sina.com.cn/s/blog_c065adec0101eu98.html

五、简单讲讲 Tomcat 结构,以及其类加载器流程

参考:http://blog.csdn.net/lai1365266/article/details/45271985

六、虚拟内存是什么

参考:http://blog.csdn.net/guoweimelon/article/details/50849710

七、阐述下 SOLID 原则

参考:https://www.cnblogs.com/OceanEyes/p/overview-of-solid-principles.html

八、请简要讲一下你对测试驱动开发(TDD)的认识

参考:https://www.cnblogs.com/OlderBird/p/4322925.html

九、CDN实现原理

参考:https://www.cnblogs.com/losbyday/p/5843960.html

十、Maven 和 ANT 有什么区别

参考:http://blog.csdn.net/yangkai_hudong/article/details/12554983

十一、UML中有哪些经常使用的图

参考:http://blog.csdn.net/suxinpingtao51/article/details/8011335

Linux

一、Linux 下 IO 模型有几种,各自的含义是什么。

参考:http://www.jb51.net/article/94783.htm

二、Linux 系统下你关注过哪些内核参数,说说你知道的

参考:http://www.jb51.net/LINUXjishu/335549.html

三、Linux 下用一行命令查看文件的最后五行

cat filename | tail -n +3000 | head -n 1000

四、平时用到哪些 Linux 命令

参考:https://www.cnblogs.com/bugutian/p/4528650.html

五、用一行命令输出正在运行的 Java 进程

参考:https://www.cnblogs.com/bugutian/p/4528650.html

六、使用什么命令来肯定是否有 Tomcat 实例运行在机器上

七、什么是 N+1 难题

参考:https://www.cnblogs.com/yzlpersonal/p/5077392.html

八、什么是 paxos 算法

参考:http://blog.csdn.net/21aspnet/article/details/50700123

九、什么是 restful,讲讲你理解的 restful

参考:http://www.ruanyifeng.com/blog/2011/09/restful.html

十、什么是 zab 协议

参考:https://www.cnblogs.com/jian-xiao/p/5821675.html

十一、什么是领域模型(domain model)?贫血模型(anaemic domain model) 和充血模型(rich domain model)有什么区别

参考:https://www.cnblogs.com/feng9exe/p/5611992.html

十二、什么是领域驱动开发(Domain Driven Development)

参考:http://blog.csdn.net/johnstrive/article/details/16805121

1三、介绍一下了解的 Java 领域的 Web Service 框架

参考:http://blog.csdn.net/apicescn/article/details/42965785/

1四、Web Server、Web Container 与 Application Server 的区别是什么

参考:https://www.cnblogs.com/vipyoumay/p/5853694.html

1五、微服务(MicroServices)与巨石型应用(Monolithic Applications)之间的区别在哪里

1六、描述 Cookie 和 Session 的做用,区别和各自的应用范围,Session工做原理

参考:http://blog.csdn.net/yanghaitao_1990/article/details/51723066

1七、你经常使用的持续集成(Continuous Integration)、静态代码分析(Static Code Analysis)工具备哪些

1八、简述下数据库正则化(Normalizations)

1九、KISS,DRY,YAGNI 等原则是什么含义

参考:http://blog.csdn.net/zj_show/article/details/8078447

20、分布式事务的原理,优缺点,如何使用分布式事务?

参考:http://blog.csdn.net/a291382932/article/details/52567094

2一、布式集群下如何作到惟一序列号

参考:https://www.cnblogs.com/yelongsan/p/6306418.html

网络

一、HTTPS 的加密方式是什么,讲讲整个加密解密流程

参考:http://blog.csdn.net/shw372029857/article/details/52687906

二、HTTPS和HTTP的区别

参考:https://www.cnblogs.com/wqhwe/p/5407468.html

三、HTTP链接池实现原理

参考:https://www.cnblogs.com/likaitai/p/5431246.html

四、HTTP集群方案

参考:http://aokunsang.iteye.com/blog/2053719

五、Nginx、lighttpd、Apache三大主流 Web服务器的区别

参考:http://blog.csdn.net/u013404872/article/details/70799420

六、是否看过框架的一些代码

七、持久层设计要考虑的问题有哪些?你用过的持久层框架有哪些

所谓"持久"就是将数据保存到可掉电式存储设备中以便从此使用,简单的说,就是将内存中的数据保存到关系型数据库、文件系统、消息队列等提供持久化支持的设备中。持久层就是系统中专一于实现数据持久化的相对独立的层面。

持久层设计的目标包括:

  • 数据存储逻辑的分离,提供抽象化的数据访问接口。

  • 数据访问底层实现的分离,能够在不修改代码的状况下切换底层实现。

  • 资源管理和调度的分离,在数据访问层实现统一的资源调度(如缓存机制)。

  • 数据抽象,提供更面向对象的数据操做。

持久层框架有:

  • Hibernate

  • MyBatis

  • TopLink

  • Guzz

  • jOOQ

  • Spring Data

  • ActiveJDBC

八、数值提高是什么

参考:http://blog.csdn.net/yangcheng33/article/details/76408580

九、你能解释一下里氏替换原则吗

参考:http://blog.csdn.net/xingyunlost/article/details/53169283

十、你是如何测试一个应用的?知道哪些测试框架

参考:https://www.cnblogs.com/fnng/p/3653793.html

十一、传输层常见编程协议有哪些?并说出各自的特色

传输层位于OSI七层网络模型中的第四层,协议有TCP · UDP · TLS · DCCP · SCTP ·RSVP · PPTP。OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型 ,是一个逻辑上的定义,一个规范,它把网络从逻辑上分为了7层。每一层都有相关、相对应的物理设备,好比路由器,交换机。创建七层模型的主要目的是为解决异种网络互连时所遇到的兼容性问题,其最主要的功能就是帮助不一样类型的主机实现数据传输。它的最大优势是将服务、接口和协议这三个概念明确地区分开来,经过七个层次化的结构模型使不一样的系统不一样的网络之间实现可靠的通信。

编程题

计算加班费

加班10小时如下加班费是时薪的1.5倍。加班10小时或以上,按4元/时算。提示:(一个月工做26天,一天正常工做8小时)

一、计算1000月薪,加班9小时的加班费

二、计算2500月薪,加班11小时的加班费

三、计算1000月薪,加班15小时的加班费

卖东西

一家商场有红苹果和青苹果出售。(红苹果5元/个,青苹果4元/个)。

一、模拟一个进货。红苹果跟青苹果各进200个。

二、模拟一个出售。红苹果跟青苹果各买出10个。每卖出一个苹果须要进行统计。

提示:一个苹果是一个单独的实体。

日期提取

有这样一个时间字符串:2008-8-8 20:08:08 , 请编写可以匹配它的正则表达式,并编写Java代码将日期后面的时分秒提取出来,即:20:08:08
线程

一、设计4个线程,其中两个线程每次对j增长1,另外两个线程对j每次减小1。写出程序。

二、用Java写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出

三、wait-notify 写一段代码来解决生产者-消费者问题

数字

一、判断101-200之间有多少个素数,并输出全部素数

package C;
public class Sushu {
   public static void main(String[] args) {
       int sum=0;
       for (int i = 101; i < 201; i++)
       {
           for (int j = 2; j <=i; j++)
           {
               if(j==i)
               {
                   System.out.println(j);
               }
               else if(i%j==0)
               {
                   sum++;
                   break;
               }
           }
       }
       System.out.println("总共有"+(100-sum)+"个素数");
   }
}

二、用最有效率的方法算出2乘以17等于多少

17>>1

三、有 1 亿个数字,其中有 2 个是重复的,快速找到它,时间和空间要最优

四、2 亿个随机生成的无序整数,找出中间大小的值

public class Test2
{
public static void main(String [] srgs)
{
int i=(int)(Math.random()*900)+100;
//int i= new java.util.Random().nextInt(900)+100;也能够
System.out.println(i);
}
}

五、10 亿个数字里里面找最小的 10 个

package com.yuzhiyun;
import java.util.Arrays;
/**
* 求一亿个数里面最小的10个数
* 首先创建节点个数为10的最大堆,而后考虑每个新的值,让他和堆顶比较,比堆顶大的元素直接抛弃,若是比堆顶小的数字,让他替换堆顶,而后调整堆。
*/

public class MaxTenNumber {
   public static void main(String[] args) {
       /**第一个元素0不参与,只是用于占位置,这样的话,只要array[k]>array[2k] && array[k]>array[2k+1]那就是最大堆了,
        * 此外,这里暂时用20个数代替1亿个
        */

       int[] array={0,1,2,3,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,6,5};
       //创建创建节点个数为10的最大堆
       for(int i=10/2;i>=1;i--){
           adjustHeap(array, i, 10);
       }
       //System.out.println(Arrays.toString(array));
       for(int i=11;i<array.length;i++){
           //若是这个元素小于堆顶,和堆顶交换,而后从新调整堆
           if(array[i]<array[1]){
               swap(array, i, 1);
               adjustHeap(array, 1, 10);
           }
       }
       System.out.println(Arrays.toString(array));
       System.out.println("最小的10个数字为:");
       for(int i=1;i<=10;i++){
           System.out.print(array[i]+" ");
       }
   }
   /**
    * 交换
    * @param array
    * @param i
    * @param j
    */

   private static void swap(int[] array, int i, int j) {
       int tem=array[i];
       array[i]=array[j];
       array[j]=tem;
   }
   /**
    * 在以array[head]为根的左右子树是最大堆的前提下把以array[head]为根的树调整为最大堆
    * @param array
    * @param head
    * @param tail
    */

   static void adjustHeap(int[] array,int head,int tail){
       int root=array[head];
       int i=2*head;
       while(i<=tail){
           int max=array[i];
           if(i+1<=tail)
               if(array[i+1]>array[i]){
                   max=array[i+1];
                   i++;
               }
           if(root>max)
               //别手抖写成了return;
               break;
           else{
               array[i/2]=array[i];        
           }
           i*=2;
       }
       array[i/2]=root;
   }
}

六、1到1亿的天然数,求全部数的拆分后的数字之和,如286 拆分红二、八、6,如1到11拆分后的数字之和 => 1 + … + 9 + 1 + 0 + 1 + 1

七、一个数若是刚好等于它的因子之和,这个数就称为 “完数“。例如6=1+2+3.编程 找出1000之内的全部完数

package a;
public class Wanshu {
   public static void main(String[] args) {
       for (int i = 1; i <= 1000; i++)
       {
           int sum=0;
           for (int j = 1; j < i; j++)
           {
           if(i%j==0)
           {
               sum+=j;
           }
           }
           if(i==sum)
           {
               System.out.println(i);
           }
       }
   }
}

八、一个数组中全部的元素都出现了三次,只有一个元素出现了一次找到这个元素

   int singleNumber(int A[], int n) {  
       int result=0;  
       for(int i=0;i<32;i++){  
           int bit=0;  
           for(int j=0;j<n;j++){  
               bit+=(A[j]>>i)&1;  
           }  
           result |= (bit%3)<<i;  
       }  
       return result;  
   }  

九、一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共通过多少米?第10次反弹多高?

package lianxi;
public class Qiu {
   public static void main(String[] args) {
       double sum1 = 0, sum2 = 0, hight = 100.0;
       for (int i = 0; i < 10; i++)
       {
           sum1 = sum1 + hight;
           // 显示了一下高度的变化
           // System.out.print(hight);
           hight = hight / 2;
           // System.out.print(" "+hight);
           //System.out.println();
           if (i < 9)
           {
               sum2 = sum2 + hight;
           }
       }
       System.out.println("第10次落地时,共通过" + (sum1 + sum2) + "米");
       System.out.println("第十次反弹高度为" + hight + "米");
   }
}

十、求100-1000内质数的和

public class TestZhiShu {
public static void main(String[] args) {
   /**
    * 求100-1000以内的质数的数量
    */

   int count=0;
    for (int i = 102; i <= 1000; i++) { // 质数
           for (int k = 2; k <= i; k++) { // 除数
               // 排除全部在 i=k 以前 能被k整除(余数为0)的数
               if (i % k == 0 && i != k) {
                   break;
               }
               // 输出全部在 i=k 且 i%k=0的数
               if (i % k == 0 && i == k) {
                   //System.out.println(i);
                   count++;
               }
           }
       }
    System.out.println(count);
   }
   }

十一、求1到100的和的平均数

十二、求s=a+a+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。 求出1到100的和

package com.liron.p1;
import java.io.IOException;
import java.util.Scanner;
/**
* 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。
* 例如2+22+222+2222+22222(此时共有5个数相加),几个数相
* 加有键盘控制。
*/

public class Topic18 {
   public static void main(String[] args) throws IOException  
   
{  
       Scanner sc = new Scanner(System.in);
       System.out.println("用哪一个数循环?:");
       int _temp = sc.nextInt();  
       System.out.println("循环相加多少次?:");
       int temp = sc.nextInt();
       int newNumber = 0; // 每次生成的新数  
       int total = 0; // 计算结果  
       for (int i = 0; i < temp; i++)  
       {  
           newNumber = newNumber * 10 + _temp;  
           System.out.println(newNumber);  
           total = total + newNumber;  
       }  
       System.out.println("计算结果:" + total);  
   }
}

1三、算出1到40的质数,放进数组里

① 显示放组里的数

② 找出第[5]个数

③ 删除第[9]个数,再显示删除后的第[9]个

1四、有 3n+1 个数字,其中 3n 个中是重复的,只有 1 个是不重复的,怎么找出来。

1五、有一组数1.1.2.3.5.8.13.21.34。写出程序随便输入一个数就能给出和前一组数字同规律的头5个数

1六、计算指定数字的阶乘

public class CalculatingFactorial {
   public static void main(String args[]) {
       for (int counter = 0; counter <= 10; counter++) {
           System.out.printf("%d! = %d\n", counter, factorial(counter));
       }
   }
   public static long factorial(long number) {
       if (number <= 1)
           return 1;
       else
           return number * factorial(number - 1);
   }
}

1七、开发 Fizz Buzz

参考:https://www.cnblogs.com/webary/p/6507413.html

1八、给定一个包含 N 个整数的数组,找出丢失的整数

   import java.util.*;  
   public class Finder {  
       public int findMissing(int[][] numbers, int n) {  
           // write code here  
           int i = 0;  
           for(i=0; i<n; ++i){  
               if(i%2!=numbers[i][0]){  
                   break;  
               }  
           }  
           return i;  
       }  
   }  

1九、一个排好序的数组,找出两数之和为m的全部组合

    public static void main(String[] args) throws UnsupportedEncodingException {  
           int[] ints = { 1, 3, 10, 12 , 13, 18, 22 ,58 };  
           int find = 23;  
           int start = 0;  
           int end = ints.length - 1;  
           while (ints[start] >= find) {  
               System.out.println("都比他-------------------------------大哦!");  
               return;  
           }  
           while (end > start) {  
               if (ints[start] + ints[end] == find) {  
                   System.out.println(ints[start] + " + " + ints[end] + " = "  
                           + find);  
                   end--;  
                   start++;  
               } else if (ints[start] + ints[end] < find) {  
                   start++;  
               } else if (ints[start] + ints[end] > find) {  
                   end--;  
               }  
               System.out.println(start +"   "+end);  
           }  
       }  

20、将一个正整数分解质因数。例如:输入90,打印出90=233*5。

   //【程序4】FenJie.java 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。  程序分析:对n进行分解质因数,  
   //应先找到一个最小的质数k,而后按下述步骤完成:  (1)若是这个质数恰等于n,则说明分解质因数的过程已经结束,打印出便可。  
   //(2)若是n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,做为新的正整数n,重复执行第一步。  
   //(3)若是n不能被k整除,则用k+1做为k的值,重复执行第一步。  
   //任何一个正整数均可以分解为其由多个质数相乘。。  
   import java.io.*;  
   import java.util.*;  
   public class FenJieApp {  
       /**
        * @param args
        */
 
       public static void main(String[] args) {  
           // TODO Auto-generated method stub  
             System.out.println("请输入数字:");  
             Scanner scanner = new Scanner(System.in);  
             int parm=scanner.nextInt();  
             System.out.print(parm+"=");  
             for(int i=2;i<=parm;i++)  
             {  
               while(parm!=i)  
                 {  
                     if(parm%i==0)  
                   {  
                       System.out.print(i+"*");  
                       parm=parm/i;  
                   }  
                    else  
                       break;  
               }  
             }  
             System.out.print(parm);  
       }  
   }  

2一、打印出全部的 “水仙花数 “,所谓 “水仙花数 “是指一个三位数,其各位数字立方和等于该数自己。例如:153是一个 “水仙花数 “,由于153=1的三次方+5的三次方+3的三次方

package com.hanqi;
public class Text4 {
   public static void main(String[] args) {
       for (int num=100;num<1000;num++)
       {
           int gw=num%10;
           int sw=num/10%10;
           int bw=num/100%10;
           if (gw*gw*gw+sw*sw*sw+bw*bw*bw==num)
           {
               System.out.println(num);
           }
       }
   }
}

2二、原地交换两个变量的值

参考:https://www.cnblogs.com/Brad-Lee/p/5808299.html

2三、找出4字节整数的中位数

参考:http://blog.csdn.net/randyjiawenjie/article/details/6968591

2四、找到整数的平方根

参考:https://www.cnblogs.com/Matrix_Yao/archive/2009/07/28/1532883.html

2五、实现斐波那契

参考:http://blog.csdn.net/duhacker/article/details/48295807

网络

一、用Java Socket编程,读服务器几个字符,再写入本地显示

反射

一、反射机制提供了什么功能?

获得该对象所属的类:
Class ownerClass = owner.getClass()
在运行时构造一个类的对象:
Class newoneClass = Class.forName(className):第一步,获得要构造的实例的Class。Constructor cons = newoneClass.getConstructor(argsClass):获得构造子。cons.newInstance(args):新建实例。
在运行时判断一个类所具备的成员变量和方法:
Class ownerClass = owner.getClass():获得该对象的Class。

Field field = ownerClass.getField(fieldName):经过Class获得类声明的属性。

Object property = field.get(owner):经过对象获得该属性的实例,若是这个属性是非公有的,这里会报IllegalAccessException。
在运行时调用一个对象的方法:
Method method = ownerClass.getMethod(methodName, argsClass):经过Method名和参数的Class数组获得要执行的Method。

method.invoke(owner, args):执行该Method,invoke方法的参数是执行这个方法的对象,和参数数组。返回值是Object,也既是该方法的返回值。

二、反射是如何实现的

所谓反射,是指在运行时状态中,获取类中的属性和方法,以及调用其中的方法的一种机制。这种机制的做用在于获取运行时才知道的类(Class)及其中的属性(Field)、方法(Method)以及调用其中的方法,也能够设置其中的属性值。
在Java中实现反射最重要的一步,也是第一步就是获取Class对象,获得Class对象后能够经过该对象调用相应的方法来获取该类中的属性、方法以及调用该类中的方法。
Java中反射有以下几种实现方式:
一、经过Class.forName()方法加载字符串,就能够获得该字符串作表明的Class对象。
例如:Class clazz = Class.forName("java.lang.String")就能够获得String类的Class对象。值得注意的是,字符串必须是类的全名,即包名+类名。
下边的代码是Struts配置文件struts.xml中的一个action的配置。

/registeResult.jsp   /registe2.jsp

这里的class属性给出了一个类的全名的字符串,服务器是如何经过这个字符串获得类对象的呢?就是经过反射机制RegisteAction对象的。而后再去调用这个类中的默认的execute()方法。
二、经过类名调用class属性获得该类的Class对象。
例如:Class clazz = String.class也能够获得String类的Class对象。
三、调用实例的getClass()方法。
例如:Date date = new Date();
         Class clazz = date.getClass();
经过上边的两句代码就能够获得date实例的Class对象。
四、若是是基本类型的包装类,则能够经过调用包装类的Type属性来得到该包装类的Class对象。
   例如:Class clazz = Integer.TYPE;

三、哪里用到反射机制

java的反射机制就是增长程序的灵活性,避免将程序写死到代码里,典型应用是Spring
例如: 实例化一个 person()对象, 不使用反射, new person(); 若是想变成 实例化 其余类, 那么必须修改源代码,并从新编译。
     使用反射: class.forName("person").newInstance(); 并且这个类描述能够写到配置文件中,如 **.xml, 这样若是想实例化其余类,只要修改配置文件的"类描述"就能够了,不须要从新修改代码并编译。

四、反射中 Class.forName 和 ClassLoader 区别

参考:http://blog.csdn.net/qq_27093465/article/details/52262340

五、反射建立类实例的三种方式是什么

参考:http://blog.csdn.net/u012110719/article/details/45226937

六、如何经过反射调用对象的方法

参考:blog.csdn.net/handsome_fan/article/details/54862873

七、如何经过反射获取和设置对象私有字段的值

参考:http://blog.csdn.net/u012726702/article/details/72027028

八、反射机制的优缺点

参考:http://blog.csdn.net/u010154380/article/details/78150251

数据库

一、写一段 JDBC 连Oracle的程序,并实现数据查询

   package svn;  
   import java.sql.Connection;  
   import java.sql.DriverManager;  
   import java.sql.PreparedStatement;  
   import java.sql.ResultSet;  
   public class Main {  
       public static void main(String[] args) throws Exception {  
           // 一、加载驱动  
           Class.forName("com.mysql.jdbc.Driver");  
           // 二、建立数据库链接对象  
           Connection conn = null;  
           conn = DriverManager  
                   .getConnection(  
                           "jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8",  
                           "root", "123456");  
           // 三、建立数据库命令执行对象  
           PreparedStatement psPreparedStatement = conn  
                   .prepareStatement("select * from t_user");  
           // Statement stmtStatement=conn.createStatement();  
           // 四、执行数据库命令  
           ResultSet rSet = psPreparedStatement.executeQuery();  
           //ResultSet rs=stmtStatement.executeQuery("select * from t_user");  
           //五、处理执行结果  
           while(rSet.next()){  
               int id=rSet.getInt("id");  
               String usernameString=rSet.getString("username");  
               String passwordString=rSet.getString("password");  
           }  
           if(rSet!=null)  
               rSet.close();  
           if(psPreparedStatement!=null)  
               psPreparedStatement.close();  
           if(conn!=null)  
               conn.close();  
       }  
   }  

算法

一、50我的围坐一圈,当数到三或者三的倍数出圈,问剩下的人是谁,原来的位置是多少

/*出圈算法是一类比较典型的算法面试题,它能够很好地考察求职者的编程功底。因为它是一种循环的逻辑,所以它比起通常的基础算法题会更难一些。本例在回答该问题的同时,详细地讲解出圈算法的实现思路。
对于出圈的问题,它有一个比较大的困难点,就是它老是重复循环的,它的头就是它的尾巴,因此,出圈问题的循环语句是比较难写的。
该题目的圈的元素个数是50个,每次数到3或3的倍数的时候,就把当前元素出圈,而且继续数数,直到再遇到3的倍数。这里,若是下标从0开始,一直到一圈完成之后,它就会接到圈的首部,这应该如何处理呢?其实,最好的办法就是使用取余的办法,就能够始终获得3个倍数,不管它的倍数是多少,也无论它的元素个数是多少。
因为每次去掉元素之后,元素的个数会少一个,所以下一个3的倍数其实只须要走两步,在为其下标赋值的时候,须要减一,保持每次去掉的元素都是3的倍数。
说明:若是使用从0开始的下标开始计算,那么初始化的时候应该使用-1,这样就能够模拟元素已经减小一个了。
至于元素的保存,可使用数组,也可使用链表。数组的元素去掉之后,它的下一个元素是不会自动往前移动的,不太好使用,可是也可使用。这里,最好是使用java.util.List链表来表示,它既有下标,又能够很方便地得到元素的当前个数,尽管效率比数组要稍微低一些,不过已经足够了。*/

   import java.util.LinkedList;    
   import java.util.List;    
   //测试类    
   public class Cycle {      
       public static int cycle(int total, int k) {  //功能方法    
           List<Integer> dataList = new LinkedList<Integer>();//建立链表对象    
           for (int i = 0; i < total; i++)  //添加数据元素    
               dataList.add(new Integer(i + 1));      
           int index = -1;  //定义下标,模拟已经去掉一个元素,所以从-1开始  
       while (dataList.size() > 1) { //一直循环去除数据,直到只剩下一个元素  
               index = (index + k) % dataList.size();//获得应该出局的下标    
               dataList.remove(index--);  //去除元素    
           }      
           return ((Integer) dataList.get(0)).intValue();//返回它的值    
       }      
     //主方法    
       public static void main(String[] args) {      
           System.out.println("该数字原来的位置是:"+cycle(50, 3));    
       }      
   }  

二、实现一个电梯模拟器用

基本思路:
模拟电梯运行(为单一电梯,未考虑达到承载上限,最短等待时间等问题)
基本条件:
1、电梯有三种状态:静止,向上,向下。
2、每层的指示灯有三种状态:向上、向下、到达(只开门)。
3、开门上人1秒,每上或下一层用0.1秒。
/*实现方案:
使用一个队列(可看作时间优先)将全部按钮事件依次入队。
当电梯静止时首先响应队头的按钮事件,并根据按钮楼层和当前楼层的位置肯定移动方向; 当向上移动时,将移动到全部亮灯的按钮所在楼层的最高层,当按钮方向和电梯方向一致时或该楼层内部到达按钮亮起时开门;向下移动相似。 当队列中没有按钮事件时,电梯静止。有些相似LOOK算数,但没有按钮事件时不会来回扫描。
使用主线程来控制电梯上下,须要注意同步“设置和获取电梯按钮最高层或按钮最底层数的方法”。*/

while(true){
           if(!ele.getPushedFloor().isEmpty()){
               int nextFloor = ele.getPushedFloor().peek();
               if(nextFloor > 0){//向上的按钮
                   if(ele.getCurFloor() - nextFloor <= 0){
                       ele.liftUp();
                   }else if(ele.getCurFloor() - nextFloor > 0){
                       ele.liftDown();
                   }
               }else{//向下的按钮
                   if(ele.getCurFloor() + nextFloor < 0){
                       ele.liftUp();
                   }else if(ele.getCurFloor() + nextFloor >= 0){
                       ele.liftDown();
                   }
               }
           }else{
               ele.setStat(RunningStat.INIT);
           }
           Thread.sleep(100);
       }

三、写一个冒泡排序

package sort;
public class BubbleSort {
   //第一种方法彻底就是按照冒泡排序的定义来写的
   //代码彻底没有通过优化
   public void Bubble1(int[]a,int n){
       int i,j;
       for(i=0;i<n-1;i++){
           for(j=1;j<n-i;j++){
               if(a[j-1]>a[j]){
                   swap(a,j-1,j);
                   //int k;
                   //k=a[j-1];
                   //a[j-1]=a[j];
                   //a[j]=k;
           }
       }
   }
  }
  //第二种方法代码优化一下 写一个标志位,若是一趟下来发生交换则标志为true,若是未发生交换,为false
   //则表明排序已完成
   public void Bubble2(int[]a,int n){
       int u,v;
       boolean flag;
       flag=true;
       while(flag){
           flag=false;
           for(u=0;u<n-1;u++){
               for(v=1;v<n-u;v++){
                   if(a[v-1]>a[v])
                       swap(a,v-1,v);
               }
               flag=false;
           }
           }
   }
//第三种方法,若是有一个50个数的数组,仅前面10个数是无序的,后面40个数是有序的,而且大于前面10个数,那么
   //第一次排序后,最后发生交换的位置必小于10,且这个位置以后的数据一定是有序的,记录下这个位置后,
   //之后遍历就从头到这个位置就能够了
   public void Bubble3(int[]a,int n){
       int p,q;
       int flag1=n;
       while(flag1>0){
           q=flag1;
           flag1=0;
           for(p=1;p<q;p++){
               if(a[p-1]>a[p])
                   swap(a,p-1,p);
               flag1=p;
           }
       }
   }
   public void swap(int a[],int p,int q ){
       int k;
       k=a[p];
    a[p]=a[q];
       a[q]=k;
   }  
  }

四、写一个折半查找

   import java.util.Comparator;  
   public class MyUtil {  
      public static <T extends Comparable<T>> int binarySearch(T[] x, T key) {  
         return binarySearch(x, 0, x.length- 1, key);  
      }  
      // 使用循环实现的二分查找  
      public static <T> int binarySearch(T[] x, T key, Comparator<T> comp) {  
         int low = 0;  
         int high = x.length - 1;  
         while (low <= high) {  
             int mid = (low + high) >>> 1;  
             int cmp = comp.compare(x[mid], key);  
             if (cmp < 0) {  
               low= mid + 1;  
             }  
             else if (cmp > 0) {  
               high= mid - 1;  
             }  
             else {  
               return mid;  
             }  
         }  
         return -1;  
      }  
      // 使用递归实现的二分查找  
      private static<T extends Comparable<T>> int binarySearch(T[] x, int low, int high, T key) {  
         if(low <= high) {  
           int mid = low + ((high -low) >> 1);  
           if(key.compareTo(x[mid])== 0) {  
              return mid;  
           }  
           else if(key.compareTo(x[mid])< 0) {  
              return binarySearch(x,low, mid - 1, key);  
           }  
           else {  
              return binarySearch(x,mid + 1, high, key);  
           }  
         }  
         return -1;  
      }  
   }  

五、随机产生20个不能重复的字符并排序

import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.TreeSet;
public class bb {
   public static void main(String[] args) {
       Set noreapeat  =new TreeSet();
        Random rdm = new Random();  
       while (noreapeat.size()<20){
           int  bb =Math.abs(rdm.nextInt())%26+97;
            char cc =(char)bb;
           noreapeat.add(cc);
       }
       System.out.println(noreapeat);
   }
}

六、写一个函数,传入 2 个有序的整数数组,返回一个有序的整数数组

七、写一段代码在遍历 ArrayList 时移除一个元素

八、古典问题:有一对兔子,从出生后第3个月起每月都生一对兔子,小兔子长到第四个月后每月又生一对兔子,假如兔子都不死,问每月的兔子总数为多少

九、约瑟芬环游戏

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class No10 {
//约瑟芬环 游戏:有n我的站成一个圈,标上号1-n:从第一个开始报数,数到m,就拖出去杀掉,下一位从一开始数,数到m杀掉,问最后一我的的标号是多少,
//下面有两个方法
//方法2是正确的,方法只能知足小数据,大一点的就异常了。求大神帮我改一下,看个人打印信息就知道个人思路了。
public static void main(String[] args) {
// TODO Auto-generated method stub
//经测试,输入: 6 3
//12 4都成功,输入大了就不行了,好比54 12就报错了,求帮我修改一下
Scanner scanner = new Scanner(System.in);
System.out.print("请输入总人数:");
int totalNum = scanner.nextInt();
System.out.print("请输入报数的大小:");
int cycleNum = scanner.nextInt();
yuesefu1(totalNum, cycleNum);
System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
yuesefu2(totalNum, cycleNum);
}
public static void yuesefu1(int t ,int p)
{
   //首先我把这些人给放到数组里面,方便操做
   List l = new ArrayList();
   for(int i=1;i<=t;i++)
   {
       l.add(i);
   }
   System.out.println(l.size());
   int wei =p;
   while(l.size()>1)
   {
       if(l.size()==p)
       {
           System.out.println("等于p");
           System.out.println("删掉"+l.get(p-1));
           l.remove(p-1);
       }if(l.size()<p)
       {
           System.out.println("小于p");
           System.out.println("删掉"+l.get(p-l.size()-1));
           l.remove(l.get(p-l.size()-1));
           System.out.println("---------------------------------");
           for(int k = 0;k<l.size();k++)
           {
               System.out.print(l.get(k)+".");
           }
           System.out.println("---------------------------------");
       }
       else{
       //先删除一个p位置的
       l.remove(p-1);
       //---------------------------------
       System.out.println("---------------------------------");
       for(int k = 0;k<l.size();k++)
       {
           System.out.print(l.get(k)+".");
       }
       System.out.println("---------------------------------");
       //---------------------------------
       for(int j=0;j<p-1;j++)
       {
           l.add(l.get(j));
       }
       //---------------------------------
       System.out.println("---------------------------------");
       for(int k = 0;k<l.size();k++)
       {
           System.out.print(l.get(k)+".");
       }
       System.out.println();
       System.out.println("---------------------------------");
       //---------------------------------
       for(int j=0;j<p-1;j++)
       {
           l.remove(0);
       }
       //---------------------------------
       System.out.println("---------------------------------");
       for(int k = 0;k<l.size();k++)
       {
           System.out.print(l.get(k)+".");
       }System.out.println();
       System.out.println("---------------------------------");
       }
   }
   System.out.println("最后的:"+l.get(0));
}
public static void yuesefu2(int t,int p)
{
   List list = new ArrayList();
   for(int i=1;i<=t;i++)
   {
       list.add(i);
   }
   int k=0;
   while(list.size()>0)
   {
       k = k+p;
       k= k%(list.size())-1;
        System.out.print("k="+k+"值为:");
       if(k<0)
       {
           System.out.println(list.get(list.size()-1));
           list.remove(list.size()-1);
           k=0;
       }else
       {
           System.out.println(list.get(k));
           list.remove(k);
       }
   }
}
}

正则

一、请编写一段匹配IP地址的正则表达式

以前一直不太会写正则表达式,不少要用到正则表达式的都直接百度,像上次要用正则表达式验证是不是合法的ip地址,而后就上网找,结果就是没找到一个对的,今天就为你们贡献一下,写个对的,并作一下解析。(建议你们仍是去看书去规范的学一下,不要直接百度,否则都是坑)。
iPv4的ip地址都是(1~255).(0~255).(0~255).(0~255)的格式
下面给出相对应的正则表达式:
"^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
+"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$"
上面的一个不漏就是正确的验证ip的正则表达式,简单的讲解一下
\\d表示0~9的任何一个数字
{2}表示正好出现两次
[0-4]表示0~4的任何一个数字
| 的意思是或者
( )上面的括号不能少,是为了提取匹配的字符串,表达式中有几个()就表示有几个相应的匹配字符串
1\\d{2}的意思就是100~199之间的任意一个数字
2[0-4]\\d的意思是200~249之间的任意一个数字
25[0-5]的意思是250~255之间的任意一个数字
[1-9]\\d的意思是10~99之间的任意一个数字
[1-9])的意思是1~9之间的任意一个数字
\\.的意思是.点要转义(特殊字符相似,@都要加\\转义)
说到这里应该已经很清楚的知道了上面的正则表达式的意思。

二、写出一个正则表达式来判断一个字符串是不是一个数字

public boolean isNumeric(String str){   
  Pattern pattern = Pattern.compile("[0-9]*");  
  Matcher isNum = pattern.matcher(str);  
  if( !isNum.matches() ){  
      return false;  
  }  
  return true;  
}  

字符串

一、写一个方法,入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。

/**
    * 写入一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。
    * @param fileName 文件名
    * @param str 查找的字符串
    * @return
    * @throws Exception
    */

   //方法一
   public static int funCount1(String fileName,String str) throws Exception {
       int count = 0;
       BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
       String line ;
       StringBuilder sb = new StringBuilder();
       while((line = bf.readLine() )!= null) {
           sb = sb.append(line);
       }
       int a = 0;
       while((a = sb.indexOf(str)) != -1) {
           sb = sb.delete(a, a + str.length());
           count++;
       }
       return count;
   }
   //方法二:正则表达式
   public static int funCount2(String fileName,String str) throws Exception {
       int count =0 ;
       BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
       String line ;
       StringBuilder sb = new StringBuilder();
       while((line = bf.readLine() )!= null) {
           sb = sb.append(line);
       }
       String pattern = ".*" + str + ".*";
       while(Pattern.matches(pattern, sb.toString())) {
           count ++;
           int a = sb.indexOf(str);
           sb.delete(a, a + str.length());
       }
       return count;
   }

二、写一个程序找出全部字符串的组合,并检查它们是不是回文串

public static void main(String[] args) {
 String text = "abccb";
 System.out.println(isHuiwen(text));
}
public static boolean isHuiwen(String text){
 int length = text.length();
 for(int i=0;i<length/2;i++){
  if(text.charAt(i)!=text.charAt(length-i-1)){
   return false;
  }
 }
 return true;
}

三、写一个字符串反转函数,输入abcde转换成edcba代码

import java.util.Scanner;
public class Test6 {
   /**
    * 六、将字符串中进行反转。abcde --> edcba
    * 分析:
    *      字符串String 有索引  有最大长度
    *      经过for循环从最大长度lengrh-1  开始到0为止倒序遍历
    */

   public static void main(String[] args) {
       //键盘录入任意字符串
       Scanner sc = new Scanner(System.in);
       System.out.println("请输入一串字符串:");
       String line = sc.nextLine();
       //将字符串倒序打印
       System.out.println("字符串反转后为:");
       //循环条件int i = line.length()-1;i >= 0;i--
       for(int i = line.length()-1;i >= 0;i--){
        //字符串转换成字符输出
           System.out.print(line.charAt(i));
       }
   }
}

四、小游戏,倒转句子中的单词

public static void reverseWord( char[ ] s,int start,int end  ){
     char temp;
     while(start < end){
         temp = s[start];
         s[start] = s[end];
          s[end] = temp;
    }    
}
public static void reverseSentense(char[] s){
             int len = s.length;
              int start = 0,end = 0;
             reverseWord(s,0,len-1);
          while(start < len){
                   if(s[start] == '  ' ){
                                 start++;
                                 end++;
                                continue;
                     }else if(s[end] == '  ' || end == len ]){
                                      reverseWord(s,start,end-1);
                                      strat = end;
                      }else{
                               end++;}
                   }
}

五、将GB2312编码的字符串转换为ISO-8859-1编码的字符串

String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");  

六、请写一段代码来计算给定文本内字符“A”的个数。分别用迭代和递归两种方式

public class RecursiveCall {
   public int countA(String input) {
       // exit condition – recursive calls must have an exit condition
       if (input == null || input.length( ) == 0) {
           return 0;
       }
       int count = 0;
       //check first character of the input
       if (input.substring(0, 1).equals("A")) {
           count = 1;
       }
       //recursive call to evaluate rest of the input
       //(i.e.  2nd character onwards)
       return count + countA(input.substring(1));
   }
   public static void main(String[ ] args) {
       System.out.println(new RecursiveCall( ).countA("AAA rating"));  // Ans. 3
   }
}

七、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 可是要保证汉字不被截半个,如“我ABC”,应该截为“我AB”,输入“我ABC汉DEF”,应该输出为“我ABC”,而不是“我ABC+汉的半个”

1、须要分析
1、输入为一个字符串和字节数,输出为按字节截取的字符串--------------》按照字节[byte]截取操做字符串,先将String转换成byte类型
2、汉字不能够截半----------------------------------------------------------------------------------------------------------》汉字截半的话对应字节的ASC码为小于0的数值
2、技术难点
1、知道汉字截半的话对应字节的ASC码为小于0的数值
2、对字符串操做应该都要面对的一个问题,字符串是否有效null, 字符串的长度0,1这种边界处理
代码实现
package com.itheima;
/**
* 十、 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。
* 可是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
*
* @author 281167413@qq.com
*/

public class Test10 {
   public static void main(String[] args) {
       String srcStr1 = "我ABC";
       String srcStr2 = "我ABC汉DEF";
       splitString(srcStr1, 4);
       splitString(srcStr2, 6);
   }
   public static void splitString(String src, int len) {
       int byteNum = 0;
       if (null == src) {
           System.out.println("The source String is null!");
           return;
       }
       byteNum = src.length();
       byte bt[] = src.getBytes(); // 将String转换成byte字节数组
       if (len > byteNum) {
           len = byteNum;
       }
       // 判断是否出现了截半,截半的话字节对于的ASC码是小于0的值
       if (bt[len] < 0) {
           String subStrx = new String(bt, 0, --len);
           System.out.println("subStrx==" + subStrx);
       } else {
           String subStrx = new String(bt, 0, len);
           System.out.println("subStrx==" + subStrx);
       }
   }
}

八、给定 2 个包含单词列表(每行一个)的文件,编程列出交集

九、打印出一个字符串的全部排列

import java.util.Scanner;
public class Demo001 {
   public static void main(String[] args) {
       String str = "";
       Scanner scan = new Scanner(System.in);
       str = scan.nextLine();
       permutation(str.toCharArray(), 0);
   }
   public static void permutation(char[] str, int i) {
       if (i >= str.length)
           return;
       if (i == str.length - 1) {
           System.out.println(String.valueOf(str));
       } else {
           for (int j = i; j < str.length; j++) {
               char temp = str[j];
               str[j] = str[i];
               str[i] = temp;
               permutation(str, i + 1);
               temp = str[j];
               str[j] = str[i];
               str[i] = temp;
           }
       }
   }
}

十、将一个键盘输入的数字转化成中文输出(例如:输入1234567,输出:一百二拾三万四千五百六拾七)

public class Reader {
   private String strNum;
   private String strNumChFormat;
   private String strNumTemp;
   private int intNumLen;
   private String strBegin;
   public Reader(String strNum) {
       this.strNum = strNum;
   }
   public boolean check(String strNum) {
       boolean valid = false;
       if (strNum.substring(0,1).equals("0")){
           this.strNum = strNum.substring(1);
       }
       try {
           new Double(strNum);
           valid = true;
       }
       catch (NumberFormatException ex) {
           System.out.println("Bad number format!");
       }
       return valid;
   }
   public void init() {
       strNumChFormat = "";
       intNumLen = strNum.length();
       strNumTemp = strNum;
       strNumTemp = strNumTemp.replace('1', '一');
       strNumTemp = strNumTemp.replace('2', '二');
       strNumTemp = strNumTemp.replace('3', '三');
       strNumTemp = strNumTemp.replace('4', '四');
       strNumTemp = strNumTemp.replace('5', '五');
       strNumTemp = strNumTemp.replace('6', '六');
       strNumTemp = strNumTemp.replace('7', '七');
       strNumTemp = strNumTemp.replace('8', '八');
       strNumTemp = strNumTemp.replace('9', '九');
       strNumTemp = strNumTemp.replace('0', '零');
       strNumTemp = strNumTemp.replace('.', '点');
       strBegin = strNumTemp.substring(0, 1);
   }
   public String readNum() {
       if (check(strNum)) {
           init();
           try {
               for (int i = 1, j = 1, k = 1; i < intNumLen; i++) {
                   if (strNumTemp.charAt(intNumLen - 1) == '零' && i == 1) {
                       strNumChFormat = "位";
                   }
                   else if (strNumTemp.charAt(intNumLen - i) == '零' && j == 1) {
                       strNumChFormat = "位" + strNumChFormat;
                   }
                   else if (strNumTemp.charAt(intNumLen - i) == '点') {
                       j = 1;
                       k = 1;
                       strNumChFormat = strNumTemp.charAt(intNumLen - i) + strNumChFormat;
                       continue;
                  }
                  else {
                      strNumChFormat = strNumTemp.charAt(intNumLen - i) + strNumChFormat;
                   }
         if (strNumTemp.charAt(intNumLen - i - 1) != '位' &&
             strNumTemp.charAt(intNumLen - i - 1) != '零') {
           if (j == 1 && i < intNumLen) {
             strNumChFormat = '拾' + strNumChFormat;
           }
           else if (j == 2 && i < intNumLen) {
             strNumChFormat = '百' + strNumChFormat;
           }
           else if (j == 3 && i < intNumLen) {
             strNumChFormat = '千' + strNumChFormat;
           }
         }
         if (j == 4 && i < intNumLen) {
           j = 0;
         }
         if (k == 4 && i < intNumLen) {
           strNumChFormat = '万' + strNumChFormat;
         }
         else if (k == 8 && i < intNumLen) {
           k = 0;
           strNumChFormat = '亿' + strNumChFormat;
         }
         j++;
         k++;
       }
       while (strNumChFormat.indexOf("位") != -1) {
         strNumChFormat = strNumChFormat.replaceAll("位", " ");
       }
       if (strNumChFormat.substring(0, 2) == "一拾") {
         strNumChFormat = strNumChFormat.substring(1, strNumChFormat.length());
       }
       if (strNumChFormat.indexOf("点") >= 0) {
         String rebegin = strNumChFormat.substring(0,
             strNumChFormat.indexOf("点"));
         String relast = strNumChFormat.substring(strNumChFormat.indexOf("点"),
             strNumChFormat.length());
         for (int i = 1; i <= relast.length(); i++) {
           relast = relast.replaceAll("拾", "");
           relast = relast.replaceAll("百", "");
           relast = relast.replaceAll("千", "");
           relast = relast.replaceAll("万", "");
           relast = relast.replaceAll("亿", "");
         }
         strNumChFormat = rebegin + relast;
       }
     }
     catch (ArrayIndexOutOfBoundsException ex) {
       ex.printStackTrace();
     }
     catch (Exception ex) {
       ex.printStackTrace();
     }
     int off = strNumChFormat.indexOf("点");
     strNumChFormat = strBegin + strNumChFormat.substring(0);
   }
   else {
     strNumChFormat = "";
   }
   return strNumChFormat;
 }
 public static void main(String args[]) {
   try {
     String number = args[0].toString();
     System.out.println("The number is: " + number);
     Reader reader = new Reader(number);
     System.out.println("Output String: " + reader.readNum());
   }
   catch (Exception ex) {
     System.out.println("Please input like that: javac Reader <number>");
   }
 }
}

十一、在Web应用开发过程当中常常遇到输出某种编码的字符,如从 GBK 到 ISO8859-1等,如何输出一个某种编码的字符串

public String translate (String str) {
       String tempStr = "";
       try {
           tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
           tempStr = tempStr.trim();
       }catch (Exception e) {
           System.err.println(e.getMessage());
       }
       return tempStr;
       }

日期

一、计算两个日期之间的差距

   import java.text.DateFormat;  
   import java.text.ParseException;  
   import java.text.SimpleDateFormat;  
   import java.util.Date;  
   /**
   * 时间相距
   * @author Ben
   * @version 1.0
   * @date 2009-10-21 16:38:51
   */
 
   public class DateDistance {  
       /**
        * 两个时间之间相差距离多少天
        * @param one 时间参数 1:
        * @param two 时间参数 2:
        * @return 相差天数
        */
 
       public static long getDistanceDays(String str1, String str2) throws Exception{  
           DateFormat df = new SimpleDateFormat("yyyy-MM-dd");  
           Date one;  
           Date two;  
           long days=0;  
           try {  
               one = df.parse(str1);  
               two = df.parse(str2);  
               long time1 = one.getTime();  
               long time2 = two.getTime();  
               long diff ;  
               if(time1<time2) {  
                   diff = time2 - time1;  
               } else {  
                   diff = time1 - time2;  
               }  
               days = diff / (1000 * 60 * 60 * 24);  
           } catch (ParseException e) {  
               e.printStackTrace();  
           }  
           return days;  
       }  
       /**
        * 两个时间相差距离多少天多少小时多少分多少秒
        * @param str1 时间参数 1 格式:1990-01-01 12:00:00
        * @param str2 时间参数 2 格式:2009-01-01 12:00:00
        * @return long[] 返回值为:{天, 时, 分, 秒}
        */
 
       public static long[] getDistanceTimes(String str1, String str2) {  
           DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
           Date one;  
           Date two;  
           long day = 0;  
           long hour = 0;  
           long min = 0;  
           long sec = 0;  
           try {  
               one = df.parse(str1);  
               two = df.parse(str2);  
               long time1 = one.getTime();  
               long time2 = two.getTime();  
               long diff ;  
               if(time1<time2) {  
                   diff = time2 - time1;  
               } else {  
                   diff = time1 - time2;  
               }  
               day = diff / (24 * 60 * 60 * 1000);  
               hour = (diff / (60 * 60 * 1000) - day * 24);  
               min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);  
               sec = (diff/1000-day*24*60*60-hour*60*60-min*60);  
           } catch (ParseException e) {  
               e.printStackTrace();  
           }  
           long[] times = {day, hour, min, sec};  
           return times;  
       }  
       /**
        * 两个时间相差距离多少天多少小时多少分多少秒
        * @param str1 时间参数 1 格式:1990-01-01 12:00:00
        * @param str2 时间参数 2 格式:2009-01-01 12:00:00
        * @return String 返回值为:xx天xx小时xx分xx秒
        */
 
       public static String getDistanceTime(String str1, String str2) {  
           DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
           Date one;  
           Date two;  
           long day = 0;  
           long hour = 0;  
           long min = 0;  
           long sec = 0;  
           try {  
               one = df.parse(str1);  
               two = df.parse(str2);  
               long time1 = one.getTime();  
               long time2 = two.getTime();  
               long diff ;  
               if(time1<time2) {  
                   diff = time2 - time1;  
               } else {  
                   diff = time1 - time2;  
               }  
               day = diff / (24 * 60 * 60 * 1000);  
               hour = (diff / (60 * 60 * 1000) - day * 24);  
               min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);  
               sec = (diff/1000-day*24*60*60-hour*60*60-min*60);  
           } catch (ParseException e) {  
               e.printStackTrace();  
           }  
           return day + "天" + hour + "小时" + min + "分" + sec + "秒";  
       }  
   }  

文章有不当之处,欢迎指正,同时也欢迎在评论区给你的漂亮的答案,你也能够关注个人微信公众号:好好学java,每日更新知识点总结干货。

好好学java好好学java
相关文章
相关标签/搜索