Windows下安装JDK
1) 点击运行安装包
2) 设置环境变量(不区分大小写)
JAVA_HOME=C:\jdk1.6 (即JDK的实际安装位置)
PATH=.;%JAVA_HOME%\bin;%PATH% (即在当前path值后添加;%JAVA_HOME%\bin)
CLASSPATH=.;%JAVA_HOME%\lib\*.jar;
Linux下安装JDK
1) 将JDK安装文件拷贝并解压缩到服务器/usr/local/目录下tar -zxvf jdk-7u79-linux-x64.gz -C /usr/local/
2) 修改文件/etc/profile,在末尾加入以下几行
export JAVA_HOME=jdk解压安装目录
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
3) 运行source /etc/profile,使/etc/profile生效。
4) 运行java -version,若返回正确版本,则安装成功。
如果系统默认安装了其他版本的JDK导致显示的JDK版本不是当前安装版本可以执行如下命令:
# cd /usr/bin
# ln –s –f /usr/local/jdk1.7.0_79/jre/bin/java
# ln –s –f /usr/local/jdk1.7.0_79/bin/javac
再运行java –version就可以看到显示当前安装的版本。
Java命令
jps命令
jps(Java Virtual Machine Process Status Tool)是JDK提供的(since JDK1.5)一个显示当前所有java进程pid的命令,非常适合在linux/unix平台上察看当前java进程的一些简单情况。
使用方法:在当前命令行输入 jps即可(需要设置JAVA_HOME,如未设置,需要先切换到JDK的bin目录) 。
比较常用的参数:
-q 只显示pid,不显示class名称,jar文件名和传递给main 方法的参数
-m 输出传递给main方法的参数,在嵌入式jvm上可能是null
-l 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名
-v 输出传递给JVM的参数
开发环境搭建
(开发环境起步)JDK + Eclipse + MySQL + Tomcat
(数据库连接GUI工具)Navicat Premium
(版本控制)CVS/SVN/Git
(日用辅助工具)Notepad++ 7-Zip Xshell Xftp
Set初始化
第一种方法
private static final Set set = new HashSet();
static {
set.add("a");
set.add("b");
set.add("c");
}
第二种方法
Set<String> set = new HashSet<String>(Arrays.asList("a", "b", "c"));
Set遍历数据
(1) 迭代遍历
Set<String> set = new HashSet<String>();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String str = it.next();
System.out.println(str);
}
(2) for循环遍历
for (String str : set) {
System.out.println(str);
}
数组初始化
第一种方法
String[] a = new String[3];
a[0] = "a";
a[1] = "b";
a[2] = "c";
第二种方法
String[] b = new String[]{"a","b","c"};
Map遍历数据
(1) 在for-each循环中使用entries来遍历这是最常见的遍历方式,在键值都需要时使用。
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
如果遍历的是一个空的map对象,for-each循环将抛出NullPointerException,因此在遍历前应该检查是否为空引用。
(2) 在for-each循环中遍历keys或values
如果只需要map中的键或者值,可以通过keySet或values来实现遍历,而不是用entrySet。
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
//遍历map中的键
for (Integer key : map.keySet()) {
System.out.println("Key = " + key);
}
//遍历map中的值
for (Integer value : map.values()) {
System.out.println("Value = " + value);
}
(3) 使用Iterator遍历
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Integer, Integer> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
日期格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = sdf.format(new Date());
日期计算
// 5天后的12点整
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + 5);
calendar.set(Calendar.HOUR, 12);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
字符串格式化
String.format
// 示例:对整数进行格式化,将1显示为001
int num = 1;
String str = String.format("%03d", num);
清空StringBuffer
(1) 使用delete方法sb.delete(0,sb.length());
(2) 使用setLength方法
sb.setLength(0);
获取指定集合中指定对象出现的次数
可使用java.util.Collections类中的frequency()方法:
public static int frequency(Collection<?> c, Object o);
Java中跳出多重嵌套循环
(1) 在循环体开头设置一个标志位,也就是设置一个标记,然后使用带此标号的break语句跳出多重循环。public class BreaklFor {
public static void main(String args[]){
OK: //设置一个标记 使用带此标记的break语句跳出多重循环体
for(int i=1;i<100;i++){ //让i循环99次
for(int j=1;j<=i;j++){
if(i==10){
break OK ;
}
System.out.print(i + "*" + j + "=" + i*j) ;
System.out.print(" ") ;
}
System.out.println() ;
}
}
}
运行结果是打印九九乘法表。当i=10时跳出了循环。
(2) 设置一个boolean值的标记位,在for循环中使用判断是否继续循环来达到目的。
public class BreaklFor {
public static void main(String args[]) {
int array[][] = { { 5, 7, 6, 4, 9 }, { 1, 2, 8, 3, 2 } };
boolean flag = false;
for (int i = 0; i < array.length && !flag; i++) { //当flag为true时跳出循环
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] == 8) {
flag = true;
break;
}
}
}
System.out.println(flag);
}
}
通过设置标志位,实现里层的代码控制外层的的循环条件。
import static和import的区别
import static静态导入是JDK1.5中的新特性。
一般我们导入一个类都用 import com.....ClassName;而静态导入是这样:import static com.....ClassName.*;这里的多了个static,还有就是类名ClassName后面多了个 .* ,意思是导入这个类里的静态方法。当然,也可以只导入某个静态方法,只要把 .* 换成静态方法名就行了。然后在这个类中,就可以直接用方法名调用静态方法,而不必用ClassName.方法名 的方式来调用。
但是这种方法建议在有很多重复调用的时候使用,如果仅有一到两次调用,不如直接写来的方便。
在静态导入之前:
public class TestStatic {
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.toHexString(42));
}
}
在静态导入之后:
import static java.lang.System.out;
import static java.lang.Integer.*;
public class TestStaticImport {
public static void main(String[] args) {
out.println(MAX_VALUE);
out.println(toHexString(42));
}
}
两个类都产生相同的输出。
注意:
提防含糊不清的命名static成员。例如,如果你对Integer类和Long类执行了静态导入,引用MAX_VALUE将导致一个编译器错误,因为Integer和Long都有一个MAX_VALUE常量,并且Java不会知道你在引用哪个MAX_VALUE。
使用StringWriter/PrintWriter打印异常
在Java中,利用try..catch(..finally)语句可以捕获和处理异常,非常方便。catch块的常见异常处理方式是输出异常,例如把异常输出到日志文件。
Exception类有一个printStackTrace()方法,它能够从发生异常的方法中输出堆栈信息,默认输出位置是System.err。但是,有时候我们要把堆栈信息输出到System.err之外的其他地方,例如在出现异常时把堆栈信息输出到email,或者用一个对话框显示出来。
printStackTrace()方法有几种不同的类型:
printStackTrace(),输出到标准错误流。
printStackTrace(PrintStream ps),输出到名为ps的PrintStream。
printStackTrace(PrintWriter pw),输出到名为pw的PrintWriter。
我们可以用最后一种printStackTrace()方法把堆栈信息保存到String对象。只要在String对象中捕获了堆栈信息,我们就可以方便地在应用的任何地方使用这些信息了。下面的代码片断示范了具体的实现步骤:
private String getStackTraceAsString() {
// StringWriter将包含堆栈信息
StringWriter stringWriter = new StringWriter();
//必须将StringWriter封装成PrintWriter对象,
//以满足printStackTrace的要求
PrintWriter printWriter = new PrintWriter(stringWriter);
//获取堆栈信息
e.printStackTrace(printWriter);
//转换成String,并返回该String
StringBuffer error = stringWriter.getBuffer();
return error.toString();
}
Java中getResourceAsStream的用法
(1) Class.getResourceAsStream(String path) :
path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取
(2) Class.getClassLoader.getResourceAsStream(String path) :
默认则是从ClassPath根下获取,path不能以’/'开头
(3) ServletContext. getResourceAsStream(String path):
默认从WebAPP根目录下取,Tomcat下path是否以’/'开头无所谓,当然这和具体的容器实现有关。
Linux JDK中文字体设置
我们经常会发现在Linux下,java应用程序的中文会变成一个一个的“口”字,这样会给我们的使用带来很多的困扰。怎么来解决这个问题呢?
其实,要解决这个问题也挺简单。首先来说说产生这个问题的原因。java程序启动的时候会在$JAVA_HOME/jre/lib/fonts目录下寻找相应的字体来显示。由于JDK默认没有中文字体,所以我们需要手工的来设置一下,让java应用程序能够找到相应的中文字体。这样就能够解决问题了。
基本步骤如下:
1)cd $JAVA_HOME/jre/lib/fonts
2)mkdir fallback
3)cp xxx.ttf fallback #xxx.ttf代表你想要的中文字体文件
4)cd fallback
5)mkfontscale
6)mkfontdir
其实,可以一条命令解决这个问题。将Linux系统的字体目录作为JDK下面的一个字体目录连接。
ln -s $FONTS_PATH/FONT_DIR $JAVA_HOME/jre/lib/fonts/fallback
你再打开你的java应用程序就会看到久违的中文了。
在Ubuntu环境下实测发现做到前三步即可;可以直接将Windows系统下的中文字体拷贝到Ubuntu。
Java反射机制概述
(包:java.lang.reflect)
(1) 通过反射API可以获取程序在运行时刻的内部结构(只要有了java.lang.Class类的对象,就可以通过其中的方法来获取到该类中的构造方法、域和方法。对应的方法分别是getConstructor、getField和getMethod。)
(2) 在运行时刻对一个Java对象进行操作(包括动态创建一个Java类的对象,获取某个域的值以及调用某个方法)
(3) 反射API中提供的动态代理也是非常强大的功能,可以原生实现AOP中的方法拦截功能。
优点:运行期类型的判断,动态类加载,动态代理使用反射。
缺点:性能是一个问题,反射相当于一系列解释操作,通知jvm要做的事情,性能比直接的java代码要慢很多。
Java开发中常用的Web Service框架
Web Servcie最主要的优点是: 即跨语言,跨平台的不同系统之间的通信。Web Servcie是RPC远程过程调用的一种。
目前Web Servcie开发主要有以下两种开发模式:一是传统基于SOAP模式的Web Servcie开发;二是基于REST(Representational State Transfer)模式的Web Servcie开发。
JAX-WS(Java6引进)是SOAP协议的一个Java的实现规范,这个新规范是为了简化基于SOAP的Java开发。JAX-WS同时支持基于SOAP的Web服务和REST风格的Web服务。
Apache Axis2和Apache CXF均是JAX-WS规范的一个开源实现框架。并且这两个框架同时也支持JAX-RS规范。
1、如果应用程序需要多语言的支持,Axis2 应当是首选
2、如果应用程序是遵循Spring哲学路线的话,Apache CXF是一种更好的选择,特别对嵌入式的Web Services来说
Java开发中的23种设计模式详解
J2EE规范
J2EE平台由一整套服务(Services)、应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持,下面对J2EE中的13种技术规范进行简单的描述(限于篇幅,这里只能进行简单的描述):
1 JDBC(Java Database Connectivity)
JDBC API为访问不同数据库提供了统一的路径,像ODBC一样,JDBC开发者屏蔽了一些细节问题,另外,JDBC对数据库的访问也具有平台无关性.
2 JNDI(Java Name and Directory Interface)
JNDI API 被用于执行名字和目录服务.它提供了一致的模型来存取和操作企业级的资源DNS和LDAP,本地文件系统,或应用服务器中的对象.
3 EJB(Enterprise JavaBean)
J2EE技术之所以赢得广泛重视的原因之一就是EJB.它提供了一个框架来开发和实施分布式商务逻辑,由此很显著的简化了具有可伸缩性和高度复杂的企业级应用程序的开发.EJB规范定义了EJB组件在何时如何与它们的容器进行交互作用.容器负责提供公用的服务,例如目录服务,事务管理,安全性,资源缓冲池以及容错性.但这里值得注意的是,EJB并不是实现J2EE的唯一路径.正是由于J2EE的开放性,使得所有的厂商能够以一种和EJB平行的方式来达到同样的目地.
4 RMI(Remote Method Invoke)
远程方法请求,RMI协议调用远程对象上的方法.它使用了序列化的方式在客户端和服务器之间传递数据.RMI是一种被EJB使用的更底层的协议.
5 Java IDL/CORBA(通用对象请求代理架构是软件构建的一个标准 )
在Java IDL的支持下,开发人员可以将Java和CORBA集成在一起.他们可以创建Java对象并使之可在CORBA ORB中展开,或者他们还可以创建Java类并和其它ORB一起展开的CORBA对象客户.后一种方法提供了另外一种途径,通过它Java可以被用于将你的新的应用程序和旧的系统集合在一起.
6 JSP
JSP页面由HTML(标准通用标记语言下的一个应用)代码和嵌入其中的Java代码组成.服务器在
页面被客户端所请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端浏览器.
7 Java Servlet
Servlet 是一种小型的Java程序,它扩展了web服务器的功能.作为一种服务器的应用,当被请求时开始执行,这和CGI Perl脚本很相似.Servlet提供的功能大多和JSP类似,不过实现的方式不同.JSP通常是大多数的HTML代码中嵌入少量的Java代码,而servlet全部由java写成并且生成HTML.
8 XML
XML(标准通用标记语言的子集)是一种可以用来定其它标记语言的语言.它被用来在不同的商务过程中共享数据.XML的发展和java是相互独立的,但是,它和java具有的相同目标是平台独立性.
9 JMS
MS是用于和面向对象消息的中间件相互通信的应用程序接口.它既支持点对点的域,有支持发布/订阅类型的域,并且提供了下列类型的支持:消息传递,事务型消息的传递,一致性消息和具有持久性的订阅者支持.JMS还提供了另一种方式来对新系统和旧后台系统相互集成.
10 JTA
JTA定义了一种标准API,应用程序由此可以访问各种事务监控.
11 JTS
JTS是CORBA OTS事务监控的基本实现.JTS规定了事务管理的实现方法.该事务管理器是在高层支持java Transaction API规范,并且在较低层次实现OMG OTS specification 和Java印象.JTS事务管理器为应用程序服务器,资源管理器,独立的应用以及同学资源管理器提供了事务服务.
12 JavaMail
JavaMail是用于存取邮件服务器的API,它提供了一套邮件服务器的抽象类.不仅支持SMTP服务器,也支持IMAP服务器。
13 JAF(JavaBeans Activation Framework)
JavaMail利用JAF来处理MIME编码的邮件附件.MIME的字节流可以被转换成java对象,大多数应用都可以不需要直接使用JAF。
安卓开发
Android开发中,安卓客户端一般使用SQLite数据库
客户端与服务器端的交互方式:Servlet、Web Service
客户端与服务器端的数据交换格式:XML、JSON
Eclipse
Eclipse快捷键
Alt+/ 提示
CTRL+SHIFT+R 打开文件
CTRL+O 查看类中的所有方法及属性
Ctrl+T 查看类/方法的继承关系树
Ctrl+L 转至行
Shift+Enter 当前光标下一行插入空白行
Ctrl+Alt+ 向上箭头/向下箭头 复制
Eclipse配置文件eclipse.ini修改
-Xms256m
-Xmx1024m
改为
-Xms512m
-Xmx2048m
如何把tab替换成空格
在Eclipse中如何看类对应的jar包?选中类名,按F3即可。