林和环保网

JAVA实现报表打印?

林和环保网 0

一、JAVA实现报表打印?

采用报表打印插件是最好的方式。报表插件优势:报表插件在服务器端不驻留程序,服务器只要提供约定格式的 XML 数据就行了。所以有如下优势:

1、支持所有的WEB服务器平台。

2、报表的生成是在各自客户端电脑上,这样大大减轻了服务器的负载压力,能够做到更大的并发访问。

3、插件在客户端运行是电脑原生程序,与桌面程序具有一样的运行性能,并能开发出桌面程序类似的报表功能。

4、能驱动打印机直接进行打印,是WEB软件实现打印功能的最好方式。

二、Java实现彩票程序?

import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.Random;public class Main { public static void main(String[] args) { //红球 33 选6 List<Integer> redBall = new ArrayList<Integer>(); for(int i=0;i<33;i++){ redBall.add(i+1); } System.out.println("开奖红球:" + select(redBall, 6)); //篮球16选1 List<Integer> blueBall = new ArrayList<Integer>(); for(int i=0;i<16;i++){ blueBall.add(i+1); } System.out.println("开奖蓝球:" + select(blueBall, 1)); } public static List<Integer> select(List<Integer> list,int count){ List<Integer> selectedList = new ArrayList<Integer>(); Random random = new Random(); for(int i=0;i<count;i++){ int index = random.nextInt(list.size()); Integer number = list.get(index); selectedList.add(number); list.remove(index); } Collections.sort(selectedList); return selectedList; }}

三、内存池的实现原理java?

内存池是一种用于管理和分配内存的机制,它可以提高内存分配和释放的效率,减少内存碎片化。在Java中,内存池的实现原理如下:

1. 预先分配内存块:内存池在启动时会预先分配一定数量的内存块,并将它们保存在一个数据结构中,如链表、数组等。

2. 内存块的分配和释放:当需要分配内存时,内存池会从预先分配的内存块中选择一个合适的块来分配,通常采用首次适应或最佳适应算法。当内存块不再使用时,它将被标记为空闲状态,并返回到内存池中供下次分配使用。

3. 内存块的复用:内存池会尽量重复使用已分配的内存块,而不是频繁地向操作系统申请新的内存。这可以减少内存分配和释放的开销,提高程序的性能。

4. 内存块的管理:内存池还会对内存块进行管理,包括记录内存块的分配情况、大小等信息,以便于高效地分配和释放内存。

通过使用内存池,Java程序可以减少频繁的内存分配和释放操作,提高内存的利用率和性能。在实际应用中,可以使用Java的内存池框架,如Apache Commons Pool或Google Guava的对象池,来方便地实现内存池功能。

四、JAVA怎么实现循环输入?

您好,很高兴能回答你的问题。

java实现循环输入方法。

双for

Scanner sc = new Scanner(System.in);

int i,a,t = sc.nextInt();

for(;0<t;t--){

for(i=0;(i<n)&&(a<=10);i++) a = sc.nextInt();

if(10<a) System.out.println(n);

}

用getLine() 或者其他流类的getLine() 来读取就行了

五、java如何实现填充算法?

import javax.swing.JFrame;

public class EdgeFill {

public static void main(String args[]) {

// A(3,3)B(6,20)C(15,18)D(20,3)

// AB BD AC CD

new EdgeFill();

}

private TwoDimen env;

public EdgeFill() {

JFrame frame = new JFrame();

env = new TwoDimen();

frame.getContentPane().add(env);

frame.setBounds(100, 100, 600, 600);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setResizable(false);

frame.setVisible(true);

int[] x = new int[] { 3, 6, 20, 15 };

int[] y = new int[] { 3, 20, 3, 18 };

for (int i = 0; i < x.length; i++) {

if (i < x.length - 1)

edgeFillOnce(x[i], y[i], x[i + 1], y[i + 1]);

else

edgeFillOnce(x[i], y[i], x[0], y[0]);

}

}

private void edgeFillOnce(int x1, int y1, int x2, int y2) {

int k, i, j;

float x, y, dx, dy;

k = Math.abs(x2 - x1);

if (Math.abs(y2 - y1) > k) {

k = Math.abs(y2 - y1);

}

dx = (float) (x2 - x1) / k;

dy = (float) (y2 - y1) / k;

x = (float) x1;

y = (float) y1;

for (i = 0; i < k+1; i++) {

// env.drawPoint((int)(x+0.5), (int)(y+0.5));

for (j = (int)

六、java远程调用,具体实现?

1、使用java代码通过ssh登陆linux并执行命令,正常情况下sshd服务都会有,知道用户密码就可以使用这种方式了。

2、要在远程linux服务器上执行命令,可以在linux服务器上启动一个服务做执行脚本的代理,不断接受来自你这个项目发来的脚本信息,然后执行,再把结果返回给你项目中去。

第一种:以消息队列的方式发送这些脚本信息,linux代理不断接受,并返回结果。项目同时要不断接受结果。

第二种:项目中产生的脚本,直接记录到数据库,linux上的代理访问这个数据库,获取脚本信息,并将执行结果写入数据库。项目中轮询执行结果。上面我说的消息队列可以采用activemq,或者rabbitmq这些。命令执行,java中直接Runtime.getRuntime().exec(command);就行了。

七、java如何实现对象的深克隆?

/**定义用户**/

public class User {

private String name;

private Address address;

// constructors, getters and setters

}

/**地址**/

public class Address {

private String city;

private String country;

// constructors, getters and setters

}

重载clone()方法

Object父类有个clone()的拷贝方法,不过它是protected类型的,

我们需要重写它并修改为public类型。

除此之外,子类还需要实现Cloneable接口来告诉JVM这个类是可以拷贝的。

重写代码

让我们修改一下User类,Address类,实现Cloneable接口,使其支持深拷贝。

/**

* 地址

*/

public class Address implements Cloneable {

private String city;

private String country;

// constructors, getters and setters

@Override

public Address clone() throws CloneNotSupportedException {

return (Address) super.clone();

}

}

  

/**

* 用户

*/

public class User implements Cloneable {

private String name;

private Address address;

// constructors, getters and setters

@Override

public User clone() throws CloneNotSupportedException {

User user = (User) super.clone();

user.setAddress(this.address.clone());

return user;

}

}

  需要注意的是,super.clone()其实是浅拷贝,

所以在重写User类的clone()方法时,address对象需要调用address.clone()重新赋值。

扩展:

为什么要克隆?

  大家先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗?

  答案是:克隆的对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。那么我把这个对象的临时属性一个一个的赋值给我新new的对象不也行嘛?可以是可以,但是一来麻烦不说,二来,大家通过上面的源码都发现了clone是一个native方法,就是快啊,在底层实现的。

  提个醒,我们常见的Object a=new Object();Object b;b=a;这种形式的代码复制的是引用,即对象在内存中的地址,a和b对象仍然指向了同一个对象。

  而通过clone方法赋值的对象跟原来的对象时同时独立存在的。

八、java如何实现进程间的通信?

客户端与客户端不能直接通信吧,客户端需要与服务器端建立tcp链接。所以两个客户端需要通过服务器连接,你可以建立两个客户端到服务器的长链接,通过服务器转发一个客户端对另一个客户端的信息。

websocket这方面比较方便,非常适合用于聊天室的开发。还可以根据原始邮件的方式,客户端1将信息发给服务器并且存储到一个数据库中,等到客户端2链接服务器时,服务器判断数据库中是否有信息,有的话推送给客户端2,这种方式是非及时通信的。

websocket是即时通信的应用层协议,传输层其实就是tcp长链接。

九、java中怎么实现定时功能?

我们可以使用Timer和TimerTask类在java中实现定时任务,详细说明如下:

1、基础知识java.util.Timer一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。此类是线程安全的:多个线程可以共享单个 Timer 对象而无需进行外部同步。java.util.TimerTask由 Timer 安排为一次执行或重复执行的任务。

2、示例代码该示例实现这样一个功能,在系统运行期间,每30分钟,系统自动检查连接池中的可用连接数,并输出到日志中。首先创建一个需要定时执行的任务类,这个任务类需要继承TimerTask,然后重写run()方法,run()方法体中的代码就是定时需要执行的操作,在本demo中,就是获取连接池中当前可用连接数,并输出到日志中,具体实现代码如下:public class TaskAvailableConnectNumber extends TimerTask { private Logger log = Logger.getLogger(TaskAvailableConnectNumber.class); private ConnectionPool pool=ConnectionPool.getInstance(); @Override publicvoid run() { log.debug("当前连接池中可用连接数"+pool.getAvailableConnectNumber()); }}下面定义一个监听器,负责在应用服务器启动时打开定时器,监听器需要实现ServletContextListener接口,并重写其中的contextInitialized()和contextDestroyed()方法,代码如下:public class OnLineListener implements ServletContextListener{ private Logger log = Logger.getLogger(OnLineListener.class); Timer timer = null; //在应用服务器启动时,会执行该方法 publicvoid contextInitialized(ServletContextEvent arg0) { //创建一个定时器,用于安排需要定时执行的任务。 timer = new Timer(); //为定时器安排需要定时执行的任务,该任务就是前面创建的任务类TaskAvailableConnectNumber,并指定该任务每30分钟执行一次。 timer.schedule(new TaskAvailableConnectNumber(), 0, 30*60*1000); log.debug("启动定时器"); } //应用服务器关闭时,会执行该方法,完成关闭定时器的操作。public void contextDestroyed(ServletContextEvent arg0) { if(timer!=null){ timer.cancel();//关闭定时器 log.debug("-----定时器销毁--------"); } }}监听器要想正常运行,需要在web.xml文件中进行配置,配置信息如下:<!-- 监听器配置开始 --> <listener> <listener-class> cn.sdfi.listen.OnLineListener </listener-class> </listener><!-- 监听器配置结束 -->以上步骤完成后,一个简单的定时器就算开发完成了。

十、JAVA如何用队列实现并发?

如果是抢资源,在不作弊的情况下 按照先来先得的规则 ,那么比较简单的实现就是队列 ,不管请求的并发多高,如果用线程来实现为用户服务,也就是说 来一个人请求资源那么就启动一个线程,那CPU执行线程总是有顺序的,比如 当前三个人(路人甲路人乙路人丙)请求A资源 ,那服务端就起了三个线程为这三个人服务,假设 这三个人不太幸运在请求的时候没有及时的获得CPU时间片,那么他们三个相当于公平竞争CPU资源,而CPU选择运行线程是不确定顺序的 ,又假设 选中了路人丙的线程运行那么将其放入队列就好了,路人乙,路人丙以此类推 ,那可能会想为什么不及时的处理呢 ,因为后续的操作可能是耗时操作对于线程的占用时间较长那请求资源的人多了服务端就可能挂了