建议封装函数,使用数组完成所有的打印
比如获取天数,getDays(int year,int month)
获取星期,getDay(int allDays)
获取极度,getQuater(int month)
然后打印重载写print方法,传入的flag不同打印年 嫉妒等
Java动画编程有多种实现方法 但它们实现的基本原理是一样的 即在屏幕上画出一系列的帧来造成运动的感觉 Java多线程技术是Java动画编程中普遍运用的技术 它在控制动画程序的流程和动画的显示效果方面起着重要的作用 Java动画编程中的动画闪烁和图像残缺不全等现象 是Java程序员经常遇到的问题 本文以作者应用实例程序为基础 阐述如何运用多线程 重载Update 双缓冲和图像跟踪等技巧来解决这类问题 以达到动画显示的最佳效果 Java多线程技术Java多线程技术简介 目前 线程(Thread)已经为许多 *** 作系统和应用开发系统所采用 线程是程序的单个控制流 具有顺序程序的特点 但是 线程不是一个程序 它仅仅是程序的一个执行序列 线程具有很强的并发功能 在同一时刻可以有多个线程同时处于执行状态 线程是动态的 具有一定的生命周期 分别经历从创建 执行 阻塞 直到消亡的过程 Java语言对多线程编程的支持有两种实现方法 一种是直接继承Thread类 另一种是实现Runnable接口 Thread类提供了对线程的控制方法 如start() stop() run() suspend() resume()和sleep()等方法 它们可以对线程的状态进行控制 动画线程的设计与实现 为了每秒中多次更新屏幕 必须创建一个线程来实现动画的循环 这个循环要跟踪当前帧并响应周期性的屏幕更新要求 许多Java初学者容易犯的一个错误是将动画循环放在paint()中 这样占据了主AWT线程 而主线程将负责所有的绘图和事件处理 因此 应该生成一个独立的动画线程来完成图像的显示和更新 例如 在一个Applet框架下 当Applet启动(Start)时 生成一个动画线程;在Applet停止(stop)时 终止该动画线程以释放它所占用的CPU资源 下列程序代码(简称 C 代码)是该动画线程的具体实现 public void start() { if(animatorThread==null) { animatorThread=new Thread(this);//开始动画线程animatorThread start(); }}public void stop(){ //停止动画线程 animatorThread=null;} 上面终止动画线程的时候 并不是调用该动画线程的stop()方法 而是设置该动画线程为null 因为如果直接调用线程的stop()方法会强制线程终止所有的执行工作 有时会带来不好的结果 设置该动画线程为null 则在run()方法中 由于不满足循环条件 线程会自然退出 这样 也进一步优化了该动画程序 重载update()和双缓冲技术消除闪烁在Java中 动画发生闪烁有两个原因 一个是由于在显示下一帧画面的时候 调用了repaint()方法 而repaint()方法被调用时 要清除整个背景 然后才调用paint()方法显示画面 这样 在清除背景和绘制图像的短暂时间间隔内被用户看见的就是闪烁 另一个是由于paint()方法要进行复杂的计算 绘制每一帧花费的时间太长 图像中的各个像素值不能同时得到 使得动画的生成频率低于显示器的刷新频率 从而造成闪烁 下面两种方法可以明显地消除或减弱闪烁 重载update()方法 当AWT接收到一个Applet的重绘请求时 它就调用Applet的update()方法 缺省情况下 update()方法清除Applet的背景 然后调用paint()方法 重载update()方法就可以将以前在paint()方法中的绘图代码包含在update()方法中 从而避免每次重绘时将整个区域清除 既然背景不再自动清除 Java程序员需要自己在update()中完成 双缓冲技术 另一种消除帧之间闪烁的方法是使用双缓冲技术 它在许多动画Applet中被使用 主要原理是创建一幅后台图像 将每一帧画入图像 然后调用drawImage()方法将整个后台图像一次画到屏幕上去 这种方法的优点在于大部分绘制是离屏的 将离屏图像一次绘至屏幕上 比直接在屏幕上绘制要有效得多 在创建后台图像前 首先要通过调用createImage()方法生成合适的后台缓冲区 然后获得在缓冲区做图的环境(即Graphics类对象) 下列实例程序代码(简称 C 代码)就是这两种方法的结合使用 双缓冲技术在重载update()方法中实现 其中 offImage是Image类的对象 offGraphics是Graphics类的对象 这两个类对象是实现双缓冲技术的关键 相关代码如下 public void paint(Graphics g){ update(g); } public void update(Graphics g){ Dimension d=getSize(); //如果后台图像不存在 就创建一个后台图像if((offGraphics==null)||(d width!=offDimension width) ||(d height!=offDimension height)) { offDimension=d; offImage=createImage(d width d height); offGraphics=offImage getGraphics(); } //擦除上一帧 offGraphics setColor(getBackground()); offGraphics fillRect( d width d height); offGraphics setColor(Color black); //将当前的帧输出到指定的image中 for(int i= ; i<10 ; i++){ offGraphicsdrawImage(images[i],frameNumber5%(dwidth/2) ,idheight/10,this); } //输出指定的后台图像gdrawImage(offImage,frameNumber5%(dwidth/2),0,this); } 双缓冲技术可以使动画平滑,但有一个缺点,要分配一个后台图像的缓冲,如果图像相当大,这将占用很大一块内存。wINgWIt 图像跟踪与程序的逐步完善图像跟踪 当动画线程刚刚启动的时候,由于没有全部载入图像,屏幕上显示的画面经常是残缺不全的。这时可以使用MediaTracker或ImageOberver类对象进行图像跟踪,待图像全部载入后,再调用drawImage()方法将图像输出到屏幕上去。DrawImage()方法的第四个参数正是ImageObserver类对象,所以可以用ImageObserver类对象进行图像跟踪。在实际应用Applet程序的init()方法中实现图像跟踪,相当于在动画线程的DrawImage()方法调用以前就画了一次图像,因为动画线程的初始化过程,即init()方法是先被调用的。下列代码(简称“C3”代码)展示了init()方法使用MediaTracker类对象来实现跟踪图像的载入,代码如下: public void init(){ tracker=new MidiaTracker(this); for(int i=1;i<=10;i++){ image[i-1]=getImage(getCodeBase(),"image"+i+" gif"); //用MediaTracker类对象的addImage()方法跟踪图像的载入 trackeraddImage(images[i-1],0); }}程序的进一步完善 在“C2”代码的重载update()方法中加入下列if语句,从而对MediaTracker类对象的图像跟踪方法做出判断,if语句如下: if(!trackercheckAll()){ //如果图像还没有装载完毕,则仅清除背景,同时输出一个状态 gclearRect(0,0,dwidth,dheight); gdrawString("Please wait",0,dheight/2); return; }在“C1”代码的stop()方法中加入两行代码,用以释放由双缓冲技术所占用的内存资源,这时stop()方法改为: public void stop(){ //停止动画线程 animatorThread=null; //释放用于双缓冲的内存资源 offGraphics=null; offImage=null;} 程序修改到此,还有一个小问题,就是动画线程启动后,第一幅图像有时仍有残留痕迹,而不是随着图像的更新而完全擦除掉。如果想解决此问题,只要将“C2”代码中最后的for()循环和gdrawImage()方法改为如下代码就可以了。 for(int i=0;i<10;i++){ offGraphicsdrawImage(images[frameNumber%10], ,frameNumber5%(dwidth),idheight/10,this);}gdrawImage(offImage,0,0,this);保持恒定的帧速度为了使用户观看动画时没有闪烁感,至少需要达到每秒12帧的速度。更高的帧速度会产生更平滑的动画。通常,在动画显示的每两帧之间,调用线程的sleep()方法休眠一个固定的时间。这样做的缺点是使用绝对的延迟时间会使延迟过长,即造成等待时间过长。为了每秒显示10~20帧图像,并保持恒定的帧速度(也就是恒定的显示频率),在动画线程的run()方法中可加入如下代码: try{ startTime+=delay; Threadsleep(Mathmax(0,startTime-SystemcurrentTimeMillis()));}catch(InterruptedException e){ break;} 本文着重阐述了优化Java动画编程的显示效果的几种方法。当然,随着Java技术以及其它计算机技术的发展,还将会有多种优化动画显示效果的方法,例如,在提高动画的帧速度方面,可在Java中调用微软公司的DirectDraw工具。但是本文所介绍的方法更具有通用性。 lishixinzhi/Article/program/Java/JSP/201311/19234
我写了几种方法,并逐步优化,并且对每一种方法进行了1000000次的调用测试每种方法的速度,仅供参考:
import javamathBigInteger;public class Test_04 {
/
最笨重的一种方法,用该整数分别除以比它小的数,看是否能被整除
/
public boolean isPrimeNum_1(int num) {
// 识别小于2的数
if (num < 2) {
return false;
}
for (int i = 2; i < num; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
/
优化第一种方法<br>
1、偶数不可能是质数<br>
2、对于大于2的数,如果一个数a大于数b的一半,那么b不可能被a整除
/
public boolean isPrimeNum_2(int num) {
// 2特殊处理
if (num == 2) {
return true;
}
// 识别小于2的数和偶数
if (num < 2 || num % 2 == 0) {
return false;
}
int max = num / 2;
for (int i = 3; i < max; i += 2) {
if (num % i == 0) {
return false;
}
}
return true;
}
/
在第二种方法上再次优化,利用数字的性质:<br>
一个数不是素数就是合数,那么一定可以由两个自然数相乘得到,其中一个大于或等于它的平方根,<br>
一个小于或等于它的平方根,并且成对出现。<br>
这样就可以把计算量大幅度减少
/
public boolean isPrimeNum_3(int num) {
if (num == 2) {
return true;// 2特殊处理
}
if (num < 2 || num % 2 == 0) {
return false;// 识别小于2的数和偶数
}
double sqrt = Mathsqrt(num);
for (int i = 3; i <= sqrt; i += 2) {
if (num % i == 0) {
return false;
}
}
return true;
}
/
Java中的BigInteger中已经写好了一个判断是否为质数的方法,直接用就可以了
/
public boolean isPrimeNum_4(int num) {
BigInteger integer = BigIntegervalueOf(num);
return integerisProbablePrime(1);
}
public static void main(String[] args) {
Test_04 test_04 = new Test_04();
int num = 991;
Systemoutprintln(test_04isPrimeNum_1(num));
long startTime = SystemcurrentTimeMillis();
for (int i = 0; i < 1000000; i++) {
test_04isPrimeNum_1(num);
}
long endTime = SystemcurrentTimeMillis();
Systemoutprintln("第一种方法运行时间:" + (endTime - startTime) + "ms");
Systemoutprintln(test_04isPrimeNum_2(num));
startTime = SystemcurrentTimeMillis();
for (int i = 0; i < 1000000; i++) {
test_04isPrimeNum_2(num);
}
endTime = SystemcurrentTimeMillis();
Systemoutprintln("第二种方法运行时间:" + (endTime - startTime) + "ms");
Systemoutprintln(test_04isPrimeNum_3(num));
startTime = SystemcurrentTimeMillis();
for (int i = 0; i < 1000000; i++) {
test_04isPrimeNum_3(num);
}
endTime = SystemcurrentTimeMillis();
Systemoutprintln("第三种方法运行时间:" + (endTime - startTime) + "ms");
Systemoutprintln(test_04isPrimeNum_4(num));
startTime = SystemcurrentTimeMillis();
for (int i = 0; i < 1000000; i++) {
test_04isPrimeNum_4(num);
}
endTime = SystemcurrentTimeMillis();
Systemoutprintln("第四种方法运行时间:" + (endTime - startTime) + "ms");
}
}
输出结果:
true第一种方法运行时间:2732ms
true
第二种方法运行时间:671ms
true
第三种方法运行时间:68ms
true
第四种方法运行时间:1064ms
随着互联网的不断发展,云计算等技术的发展得到了广泛的使用,而今天我们就一起来了解一下,对于java编程开发程序员来说,需要掌握哪些云计算的相关技术。
在日常开发中,Java程序员主要和框架、工具、API和文档等打交道,好像跟云沾不上边。直到应用程序被推向生产,研发人员可能才意识到这个应用需要千兆字节内存才能运行,此时再开始优化显然来不及,如果基于云平台运行,则会造成大量资源浪费。
虽然Java研发人员主要在运行时管理应用程序,但随着容器化和Kubernetes的普及,不少研发人员也会将应用程序直接部署到Kubernetes,因为其可以大规模协调容器化应用程序。
无论是Kubernetes还是管理应用程序的Oracle云基础架构环境,编写云应用程序的开发人员都需要以不同的方式思考编程和优化方式。相比本地运行,开发人员必须让应用程序对重启、故障转移、启动时间和内存消耗等优化做出响应。毕竟,一旦应用程序在云平台运行,消耗的所有资源都直接与金钱挂钩。
无服务器和微服务优化
当然,上述可以通过一些新计算模式得到缓解,但每一种新计算模式的出现都会随之带来一些陷阱。在云计算领域,显著风险来自应用程序的隐藏成本,从表面来看,微服务应该是相对经济的解决方案。
与开源Web应用程序框架Grails一样,Micronaut基于JVM,但这也是二者相似之处。Micronaut是一个模块化、易于测试的开源框架,用于构建现代微服务和无服务器应用程序。
那么,Micronaut和Java程序员有什么关系和云计算成本又有什么关系呢
一般来说,在Java生态系统,研发人员会学习很多关于让应用程序更高效,针对低内存占用进行优化的知识。电脑培训发现云平台同样运行着不少用Java语言编写的框架,比如Hadoop、Kafka和Cassandra,这些框架支持长时间运行进程,这些进程可从JVM即时编译中受益。
public static Object getInnter(Object con){
Object re=null;
Field f;
try {
f = con getClass() getDeclaredField( inner )
f setAccessible(true)
re= f get(con) //取得内部包装的Connection
f setAccessible(false)
} catch Exception e) {
}
return re;
}
以上代码运行后 输出
con Class Type is: mchange v c p impl NewProxyConnection
Inner con Class Type is: mysql jdbc JDBC Connection
Data from DB:
o and o is same object
Data from DB:
上述代码中 首先从数据库连接池获得一个连接 发现连接类型并不是mysql的数据库连接 而是 mchange v c p impl NewProxyConnection 根据类名中可以推测 从数据库连接池中获得的连接只是一个代理 接着 通过反射 取得这个对象中名为inner的属性 并打印其Class类型 发现这才是真正的mysql连接 关闭NewProxyConnection连接 再向池中请求一个新的连接 同样获取该连接内部的实际数据库连接对象 发现 第一次使用的实际数据库连接对象o 和第二次使用的对象o 是完全相同的
这说明 前后两次数据库连接的请求均返回了相同的数据库连接 关闭NewProxyConnection连接时 并没有真正关闭数据库连接 而只是将数据库连接放入连接池保存 使得数据库连接在连接池中得到了复用 而从连接池返回的NewProxyConnection对象 只是对真实数据库连接的包装
除了线程池和数据库连接池 对于普通的Java对象 在必要的时候 也可以进行池化管理 对于那些经常使用 并且创建很费时的大型对象来说 使用对象池维护 不仅可以节省获得对象实例的成本 还可以减轻GC频繁回收这些对象产生的系统压力 但对于生成对象开销很小的对象进行池化 反而可能得不偿失 维护对象池的成本可能会大于对象池带来的好处
注意 在JDK中 new *** 作的效率是相当高的 不需要担心频繁的new *** 作对系统有性能影响 但是new *** 作时所调用的类构造函数可能是非常费时的 对于这些对象 可以考虑池化
返回目录 Java程序性能优化 让你的Java程序更快 更稳定
编辑推荐
Java程序设计培训视频教程
J EE高级框架实战培训视频教程
J ME移动开发实战教学视频
Visual C++音频/视频技术开发与实战
Oracle索引技术
ORACLE G数据库开发优化指南
lishixinzhi/Article/program/Java/gj/201311/27800
我们都知道,服务器数据库的开发一般都是通过java或者是PHP语言来编程实现的,而为了提高我们数据库的运行速度和效率,数据库优化也成为了我们每日的工作重点,今天,河北IT培训>
来做个测试
java用的最多的判空,殊不知,多数人一直在用一种最耗时,性能最差的方式
本测试用例特意比较常用的4种判空形式
/字符串判空性能大比较
/
public class Test{
String s = "";
long n = 10000000;
//s == null || sequals("")
private void function1(){
long startTime = SystemcurrentTimeMillis();
for (long i = 0; i < n; i++){
if (s == null || sequals(""))
;
}
long endTime = SystemcurrentTimeMillis();
Systemoutprintln("[s == null || sequals(\"\")] use time: " + (endTime - startTime) + "ms");
}
//s == null || slength() <= 0
private void function2(){
long startTime = SystemcurrentTimeMillis();
for (long i = 0; i < n; i++){
if (s == null || slength() <= 0)
;
}
long endTime = SystemcurrentTimeMillis();
Systemoutprintln("[s == null || slength() <= 0] use time: " + (endTime - startTime) + "ms");
}
//s == null || sisEmpty()
private void function3(){
long startTime = SystemcurrentTimeMillis();
for (long i = 0; i < n; i++){
if (s == null || sisEmpty())//since jdk16
;
}
long endTime = SystemcurrentTimeMillis();
Systemoutprintln("[s == null || sisEmpty()] use time: " + (endTime - startTime) + "ms");
}
//s == null || s == ""
private void function4(){
long startTime = SystemcurrentTimeMillis();
for (long i = 0; i < n; i++){
if (s == null || s == "")
;
}
long endTime = SystemcurrentTimeMillis();
Systemoutprintln("[s == null || s == \"\"] use time: " + (endTime - startTime) + "ms");
}
public static void main(String[] args){
Test test = new Test();
testfunction1();
testfunction2();
testfunction3();
testfunction4();
}
}
直接右键运行,结果一目了然
[s == null || sequals("")] use time: 73ms
[s == null || slength() <= 0] use time: 29ms
[s == null || sisEmpty()] use time: 33ms
[s == null || s == ""] use time: 29ms
以上就是关于Java日历打印,怎么加输入年份,打印整年12个月打印,输入月份打印季节,下面代码如何优化,给个思路全部的内容,包括:Java日历打印,怎么加输入年份,打印整年12个月打印,输入月份打印季节,下面代码如何优化,给个思路、优化Java动画编程中的显示效果、用java语言写一个判断一个整数是否为质数的程序(要求利用三种方法逐步优化实现)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)