一、StringBuffer、StringBuilder工具类
//StringBuffer线程安全
StringBuffer strb=new StringBuffer();
//StringBuilder线程不安全 优点:快 当对数据要求的安全性不高时使用
StringBuilder strbu=new StringBuilder();
/**
为什么要有这两个工具类
解决在拼接字符串过程中出现的中间量
怎么解决?
使用一个可扩容数组来保存所有的字符
怎样扩容?
默认情况 给与16长度字符数组,初始化
不断添加,如果所需要的空间>当前所分配的空间 就需要扩容
扩多大 原容量*2+2;
如果扩容后的容量还不满足,要多大给多大
新的容量就等于最小所需要的容量
*/
for(int i=97;i<123;i++) {
strb.append((char)i);
}
System.out.println(strb.toString());
二、集合框架
1.集合
Iterable(可迭代)接口:Collection集合接口: List Queue Set
Map接口:HashMap TreeMap
List:ArrayList LinkedList
Set:HashSet TreeSet
2.List
2.1 ArrayList解决两个问题 1.长度 扩容 2.类型问题Object
//使用object数组来保存数据,解决类型问题
//使用数组扩容解决数量问题
//默认容量是10 扩容是 原长度+原长度/2
List l1=new ArrayList();
l1.add("你好");
l1.add(12); //存的是Integer
l1.add(13);
l1.set(0,"hello");
System.out.println(l1);
Iterator it=l1.iterator();
Object obj;
while(it.hasNext()) {
obj=it.next();
System.out.println(obj);
}//打印l1元素
System.out.println(l1.get(0));//获取0号元素并输出
l1.remove(12); //删除下标是12的元素
l1.remove(Integer.valueOf(12));//删除值为12
System.out.println(l1.size());//获取list
例题:1-100所有的奇数放到List中 在打印一遍
List l1=new ArrayList();
for(int i=0;i<100;i++) {
if(i%2!=0) {
l1.add(i);
}
}
for(int i=0;i<l1.size();i++) {
System.out.println(l1.get(i));
}
2.2.LinkedList
LinkedList使用双向链表
List list=new LinkedList();
list.add("你好");
list.add("hello");
list.add("张三");
//获取元素,首先判断从哪一端开始检索能更快的找到元素
//遍历获取节点,返回节点中记录的元素
list.get(1);
//set找到下标节点,将节点中的item重新指向
list.set(1, "李四");
//删除
list.remove(1);
ArrayList和LinkedList不同
1.实现存储方式
//ArrayList使用object数组来保存数据,解决类型问题
//LinkedList使用双向链表
2.检索方式
//ArrayList从头检索
//LinkedList获取元素,首先判断从哪一端开始检索能更快的找到元素
3.ArrayList 查找快,增删慢 LinkList检索慢,增删快
vector 是线程安全的list
2.Set
Set集合不能保存重复数据
Set存储值是无序的(存的顺序和取的顺序是不一样的)
2.1 HashSet
HashSet允许存放null值
Set s1=new HashSet();
s1.add("你好");
s1.add(new String(new char[] {'你','好'}));//不会在存放
s1.add("张三");
System.out.println(s1.contains("你好")); //查找是否有该值,并打印
Iterator it=s1.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
for(Object obj:s1) {
System.out.println(obj);
}
2.2 TreeSet
//排序集合
//不能存重复数据
//Treeset中不可以放null值
//tset.add(null); 运行错误
//Treeset底层是使用TreeMap实现的,底层也是红黑树
TreeSet tset=new TreeSet();
tset.add(12.3);
tset.add("张三"); //异常 类型不能转换
3.Map接口
3.1 HashMap.
// HashMap使用数组加链表存储数据
// 键不能重复,重复就会覆盖
// 键和值都可以为null
Map map=new HashMap();
map.put("aaa","张三");
map.put("ccc","zhang34");
map.put("ddd","null");
map.put(null,null);
map.put("ccc",null);
//打印aaa键的值
System.out.println(map.get("aaa"));
//获取所有的键名的集合
Set keys=map.keySet();
System.out.println(keys);
//获取所有的值
Collection values=map.values();
System.out.println(values);
//查询是否有该键
map.containsKey("from");
//查询是否有该值
map.containsValue("张三");
//删除aaa键和值
map.remove("aaa");
3.2 TreeMap
TreeMap值可以有多个null
Treemap的key不能是null
TreeMap tmap=new TreeMap();
tmap.put("aaa",null);
tmap.put("bbb",null);
tmap.put(null,null);
4.Hashtable
//Hashtable线程安全
//Hashtable中的key值和value值都不能为null
Hashtable table=new Hashtable();
//table.put(null,"");
//table.put("nihao",null);
5.arraycopy方法
int[] arr= {1,2,3,4,5};
int[] arr2=new int[20];
//将arr中的2号元素开始复制到arr2中,从arr2中的15号元素开始替换arr中3个元素
System.arraycopy(arr, 2, arr2, 15, 3);
System.out.println(Arrays.toString(arr2));
三、泛型
public class Easy<T,A,B> {
public static void main(String[] args) {
//泛型?
广泛的数据类型,允许使用时再来规范的数据类型
Easy<String,Integer,Double> e=new Easy<String,Integer,Double>();
e.test("");
}
public void test(T t) {
}
//在方法中指定泛型
public static final <R extends List> R test2(R r) {
return null;
}
四、集合的补充