工具类:StringBuffer和StringBuilder
StringBuffer:
格式:
StringBuffer(初始容量);
为什么要有这两个工具类:
解决拼接字符串过程中出现的中间量,从开始到结果过程中生成的量
如何解决?
字符串是以字符的数组保存,数组声明后长度就不可变化,我们使用一个可扩容的数组来保存所有的字符。
如何扩容?
默认情况下的给予16长度字符数组初始化,不断添加,如果所需要的空间>当前分配的空间。扩容的容量是原容量<2+2;如果扩容后的容量还不满足,新容量就等于最小所需容量
StringBuilder:和StringBuffer完全一样,只不StringBuilder线程不安全,StringBuffer线程安全。
StringBuffer
sychronized同步的:判断线程安不安全
StringBuffer和StringBuilder的区别:
StringBuffer和StringBuilder实现的功能解决拼接字符串过程中出现的中间量,StringBuffer线程不安全,但是速率相比较快和StringBuilder 线程安全,速率相比于慢。
最后使用
for(int i=0;i<123;i++){
strb.append(char()i)
}
2.集合框架
两个框架 Iterable下的Collection
Collection有一个超级接口 Iterable(可迭代的),集合中的所有接口都实现了Connection和Iterable。
Collection是集合(List Queue Set)的超级接口
List 列表,有序的集合 有两个集合 :
-
1.ArrayList 通过数组实现
- 2.LinkedList通过链表实现
List list=new ArrayList();//List是接口 ArrayList实现类
List.add("12");
list.set(0,"hello")
ArrayList 通过数组实现就要解组的两个弊端:
类型问题--Object使用Object数组来保存数据
长度---使用数组扩容解决数量问题:
默认容量是10,扩容: 原长度+原长度>2;
使用格式:
list.add("你好");/存储
list.add(12); 存的是封装类型Integer 值
list.get(0)//获取
list.remove(12);
list.set(0,"hello");
list.add ("你好");//添加一个就是下标为0
list.add (12);//
list.get(0);//通过下标取出
list.remove(12);//删除下标为12的元素 不是12这个值 注意
list.remove(Integer.valueof(12));
注意:我们在集合中放的值是这个类型的封装类型 .
List list=new ArrayList();//将0-11的奇数存入数组,遍历集合
for (int i = 0; i <100; i++) {
if (i%2!=0) {
list.add(i);
}
}for (int i = 0; i <list.size(); i++) {//list.size()这个方法获取长度
System.out.println(list.get(i);
}list.iterator()//迭代器
列表的接口叫list 上一级是Collection 上一级是Iterable(可迭代的)(接口)
Iterable中一共就三个方法 一个是iterator 迭代器(也是一个接口)
iterator 迭代器(也是一个接口),也有三个方法: 是否有下一个 下一个 删除
迭代器的使用
Iterator it=list.iterator
Object.obj;
while(it.hasnext()){
obj=it.next();
System.out.println(obj);
}
2.LinkedList通过链表实现
LinkedList使用双向链表()
List list=new LinkedList();
list.add("hello");
list.add("你好");
list.add("李四");//获取元素,首先判断从哪一段开始索引能更快的找到元素
//遍历获取节点,返回节点中记录的元素list.get(1);
//找到下标节点,将节点中的item重新指向
list.set(1,"李四");
list.remove(1);
private 不允许类外访问,把下面这个类当作一个个节点 <E>item泛型表示要存储的值 next表示下一个,prev表示前一个
双向链表:先用要存储的下标和整个的链表一般做对比,从哪一段更快的检索的数据。
ArrayList 和LinkedList的区别
ArrayList 和LinkedList都是List接口的实现
1.实现方式
ArrayList是数组,LinkedList是双向链表
2.检索方式
ArrayList通过下标,LinkedList是通过前一个后一个
3.ArrayList查找快,增删慢 LinkedList查找慢,增删块
Stack栈也是list的实现类
vetor有一个需要注意的点 synchronized 同步的 代表线程安全的,vetor只能一个个拿手套。
set
set.add("你好");
set.add("你好");
set//没有get 只关心往里面放
set.contain("你好");//检查有没有某一个元素
Iterator it=set iterator;
while(it.hasNext()){
sout(it.next());
}
特点:
set集合不能保存重复数据
set存储值是无序的(村的顺序和放的顺序不一样)
heshset允许存放null
treeSet:做一些去重的工作
treeSet tset=new TreeSet();
//排序集合
有序:入和出的顺序一样,排序:自动排序
//不能重复数据
//不可以放null值
//实现 底层是TreeMap实现的 红黑树
Tree tset=new TreeSet
tset.add("张三");
tset.add(12.3)
tset用来排序的时候 ,不同类型的不可以排序
Map
集合 不属于Collection 他没有接口 他就是最高接口
语法:
Map map=new HashMap();
map.put("aaa",22);
map.put("aaa",21);
map.put("aaa",24);
map.put(null,null);
sout(map.put("aaa");)
提供的方法:
1.map.keySet();获取所有键的集合 遍历的方法 for循环或遍历器
2.获取所有的值
Collection values =map.values();//返回一个集合collection
//调用Collection的方法 迭代 foreach
map.containKey("aaa");//验证是否存在这个指定的参数
map.containValue("张三");//当然也可以验证是否有value这个值
map.remove("bbb");//删除键名
1.hashmap 存储数值的方式是数组加链表
hashMap能否保存null值,可以
map中只有一个put 键的名字重复了就覆盖.
2.treemap
map里面hashtable是线程安全的
3.hashtable 的k值和value都不能为null
list有序的 可以存重复的值,
set处理权限的时候,不需要获取每一个权限,但是要知道某一个人是否有这个钱权限
map当我们存储数据的时候 需要给他一个名字 。
数组的扩容
3泛型 < E>,
定义:编写代码时不先声明这个类型,允许使用的时候再规定的数据类型
泛型是面向对象的 Object的
package com.eazy9;
import java.util.List;
public class Day718_06<T,A,B>{//类中指定泛型,类中可以使用泛型
public static void main(String[] args) {
Day718_06<String,Integer,Double> e4=new Day718_06<String,Integer,Double>();//泛型是Object 必须传一个面向对象的值
e4.test("");
}
public void test(T t) {
}
//在方法中指定泛型
public <R>R test2(R,r){//在访问权限修饰符后面制定泛型
return null;
}