线程安全的集合包含2个问题
1.多线程并发修改一 个 集合 怎么办?
2.如果迭代的过程中 集合 被修改了怎么办?
a.一个线程在迭代,另一个线程在修改
b.在同一个线程内用同一个迭代器对象进行迭代、修改、迭代、修改. . .
共有有3种解决方案
1.用老的Vector/Hashtable类,上面2个问题都不用担心。
Vector/Hashtable所提供的所有方法都是 synchronized的。如果 迭代的过程中数据结构被修改了,迭代器可以反映最新的修改,也不会抛异常。但这种方法效率低下,不建议使用。
2.使用ArrayList/HashMap和同步包装器
可用 同步包装器使容器变成线程安全的
Java代码
1. List synchArrayList = Collections.synchronizedList(new Arr ......
程序设计中经常会碰到用组件来显示图片的情况, 可以显示图片的组件有很多,如awt包中的button,label,panel等都可以在其上面放置图片.图片又可分为两类,一类是放置于button等组件上的ImageIcon(图标),另一类是可以放置在panel等组件上的较大的图片Image。
从本地计算机中读取图片的方法也有很多,比如,利用ImageIcon来读取本地图片,还可以把读取到的ImageIcon转换为Image。还有一种获取Image的方法是利用Toolkit类。我个人较喜欢第二种方法,Toolkit.getDefaultToolkit().createImage("图片名");因为Toolkit类是直接与本地操作系统相联系的一个类,获取到的图片会更真实,更直接。
想要用JPanel来显示获取到的图片就需要重写JPanel类的paint(Graphics g)方法,可以重写一个类来extends Jpanel类,也可以在定义Jpanel类的实例时采用匿名类的写法来重载paint()方法。
示例一:
classImagePanel extends JPanel{
Image image=Toolkit.getDefaultToolkit().createImage("test.jpg");
public void paint(Graphics g) {
g.drawImage(image,0,0,image.getWidth(null),image.getHeight(null),null);
}
}
示例二:
Image image=Toolkit.getDefaultToo ......
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
public class test {
public static void main(String[] args) {
ArrayList<ArrayList<Integer>> list = getArrays(1, 20, 30);
Iterator<ArrayList<Integer>> iter = list.iterator();
while (iter.hasNext())
System.out.println(Arrays.toString(iter.next().toArray()));
}
public static int sum(int min, int max) {
if (min > max)
return 0;
return (min + max) * (max - min + 1) / 2;
}
public static ArrayList<ArrayList<Integer>> getArrays(int min, int max, int sum) {
if (sum(min, max) < sum)
return null;
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
for (int i = max; i >= min; i--) {
ArrayList<Integer> array;
if (i > sum)
contin ......
package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test {
public static void main(String arg[]) {
String fileName = "E:\\share\\test.txt";
File file = new File(fileName);
String writeData = "HelloWorld!\r\nnihao我的内存是2G的 ";
byte[] byteOutData = writeData.getBytes();
byte[] byteInData = new byte[20];
int length = 0;
if (file.isFile()) {
file.delete();
}
try {
if (file.createNewFile() && file.canWrite()) {
FileOutputStream fileOutStream = new FileOutputStream(file);
fileOutStream.write(byteOutData);
fileOutStream.close();
}
if (file.canRead()) {
FileInputStream fileInStream = new FileInp ......
最近公司要求把excel的数据导入到数据库中去。当时没怎么想就直接用java.sql包下的类把数据读出来然后拼装成sql语句,顺利完成了任务。后来用第三方插件实现了读,写,修改excel文件。 现在拿出来就和大家分享。希望能够在某种程度上帮大家解决一些实际问题。
第三方组件可以在此下载:http://nexcel.sourceforge.net/
首先我们先用Jdbc-Odbc桥连接excel文件:
先配置好数据源(我的操作系统是Windows 7英文版,可能和大家的不一样):管理工具(Administrative Tools)->数据源(Data Source ODBC)->添加(Add),选择 Microsoft do Driver Excel->完成(Finish)->填写数据源名(Data Source Name)->选择工作薄(Select Workbook)找到你的excel文件就可以了。这里不多说了,大家可以查找相关资料。下面是我的测试代码:
public static void readXLSByJdbcOdbc() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
......
package test;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test {
public static void main(String arg[]) {
String fileName = "E:\\share\\test.txt";
String writeData = "HelloWorld!\r\nnihao我的内存是3G的 ";
File file = new File(fileName);
if(file.exists()){
file.delete();
}
char[] byteOutData = writeData.toCharArray();
char[] byteInData = new char[50];
int length = 0;
try {
file.createNewFile();
if(file.exists() && file.canWrite()){
FileWriter fileWrite = new FileWriter(file);
fileWrite.write(byteOutData);
fileWrite.close();
}
if (file.exists() && file.canRead()) {
&nb ......