vector
vector底层是用数组实现的List,相关方法都加了同步检查,因此“线程安全,效率低”
建议:
1.需要线程安全时,用Vector。
2.不存在线程安全时,并且查找较多用ArrayList(一般使用它)。
3.不存在线程安全时,增加或删除元素较多使用LinkedList。
哈希表的基本结构就是“数组+链表”
hashmap
链表的结构
Entry[]数组作为存储方式
将hashcode除以16,取余数来放入数组中,相同余数放在一起(其中一种散列方法,追求均匀分布)
System.out.println("hash in myHash"+(value&(length-1)));//位运算
System.out.println("hash in myHash"+(value%(length-1)));//得余数
两个值并不一定相同,但系统中debug里是以位运算为标准 分配键与值
HashMap与HashTable区别
HashMap:线程不安全,效率高,允许key或value为null
HashTable:线程安全,效率低,不允许Key或value为null
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class TestStoreData {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String,Object> row1=new HashMap<String,Object>();
row1.put("id", 1001);
row1.put("name", "张三");
row1.put("salary", 20000);
row1.put("入职日期", "2018.5.5");
Map<String,Object> row2=new HashMap<String,Object>();
row2.put("id", 1002);
row2.put("name", "李四");
row2.put("salary", 30000);
row2.put("入职日期", "2005.5.4");
Map<String,Object> row3=new HashMap<String,Object>();
row3.put("id", 1003);
row3.put("name", "王五");
row3.put("salary", 40000);
row3.put("入职日期", "2020.5.4");
List<Map<String,Object>> table1=new ArrayList<Map<String,Object>>();
table1.add(row1);
table1.add(row2);
table1.add(row3);
for(Map<String,Object> row:table1){
Set<String> keyset=row.keySet();
for(String key:keyset){
System.out.print(key+":"+row.get(key)+"\t");
}
System.out.println();
}
}
}
每一行数据使用一个javabean对象
每一个表格使用一个Map/List
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class TestScoreData2 {
public static void main(String[] args) {
User user1=new User(1001,"张三",2000,"2018.5.5");
User user2=new User(1002,"李四",3000,"2005.5.4");
User user3=new User(1003,"王五",4000,"2020.5.4");
List<User> list=new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);
for(User u:list){
System.out.println(u);
}
Map<Integer,User> map=new HashMap<Integer,User>();
map.put(1001, user1);
map.put(1002, user2);
map.put(1003, user3);
Set<Integer> keyset=map.keySet();
for(Integer key:keyset){
System.out.println(key+"--"+map.get(key));
}
}
}
class User{
private int id;
private String name;
private double salary;
private String hiredate;
public User(){
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String getHiredate() {
return hiredate;
}
public void setHiredate(String hiredate) {
this.hiredate = hiredate;
}
public String toString(){
return "id"+id+",name"+name+",salary"+",hiredate"+hiredate;
}
public User(int id, String name, double salary, String hiredate) {
super();
this.id = id;
this.name = name;
this.salary = salary;
this.hiredate = hiredate;
}
}
java.io
FileOutStream 写入数据 与 FileInputStream从文件读出数据,两个类仅对字节或字节数组读取
FileWriter 和FileReader 对应上述两类,这个为字符流
Buffered 等加上面,好处在于增加了缓存区 flush()方法
数据输入输出流
取数据时,不必在关心数值属于哪种字节(允许应用程序以及其无关的方式从底层输入流读取基本java数据类型)
线程
1.继承Thread类
2.实现Runnable接口
3.实现Callable接口
其中 .start() 方法为等待系统调用,与代码顺序无关
.run() 方法为顺序执行
Thread
子类继承Thread 具备了多线程能力
启动线程:子类对象.start()
不建议使用:避免OOP单继承局限
Runnable
实现接口Runnable具有多线程能力
启动线程:传入目标对象+Thread对象.start()
推荐使用:OOP多实现,灵活方便,方便同一份对象的代理