集合
容器
java中存储一堆数据的存在,像一个箱子.
前面学过的容器有数组和StringBuffer StringBuilder
数组:同一类型的有序的,长度不可变的,可以存储基本数据类型也可以存储引用数据类型;
int[] arr = {1,2,3};//基本数据类型
String[] arr ={"1","2","3"};//引用数据类型
StringBuffer :字符串缓冲区,线程安全的,长度可变的,常用于多线程中
StringBuilder: 线程不安全的,长度可变 ,,单线程
最终都是要转成String来进行操作
常见方法:
添加:
append(data);//data除了byte和sort类型 尾部追加
删除:
delete(int start, int end)//移除数据 包头不包尾
deleteCharAt(int index)//删除指定位置上的字符
查询:
length()
indexOf(str),indexOf(str,index)//第一次出现的位置
lastIndexOf(str),lastIndexOf(str,index)//最后一次出现的位置
修改:
insert(index,data)//在指定位置插入数据
setCharAt(index,ch)//指定位置设置为字符ch
replace(start,end,str)//替代
reverse()//反转
集合Collection
集合的特点:
长度可变,存储的是对象,不能是基本数据类型,
由于集合存储的数据结构不同分为List和Set
接口Collection的常见方法:
增:
boolean add(e);//增加一个元素
boolean addAll(collection);//增加一个集合中的所有元素
删:
boolean remove(e)
boolean removeAll(coll)
boolean clear()
判断:
boolean isEmpty()
boolean contains(e)
boolean containsAll(coll)
获取:
int size();
Iterator<E> iterator();//获取迭代器 返回的是迭代器接口,由于集合的数据结构不同,每个集合都会有自己的迭代器的,再用迭代器迭代输出集合中的元素时,如果要修改元素,需要使用迭代器的方法.如果使用的是集合的方法进行操作的话,会出现并发修改异常ConcurrentModificationException():此处产生的原因就是因为集合再对元素修改的时候,迭代器iterator并不知道修改了
其他:
取交集 boolean retainAll(coll)
转为数组 toArray()
List
list是collection的子接口
public interface final List<E> extends Collection<E>
List是有序的,元素都有角标,元素是可重复的,null也可以,相对于collection 它有一些特殊的关于角标的方法 .
add(index,e);
addAll(index,coll)
E get(index)//获取角标上的元素
E remove(index)//返回的是被删除的对象
E set(index,e)//修改指定位置上的元素 返回被修改的元素
List subList(start ,end)//包头不包尾
ListIterator<E> listIterator ;//list特有的迭代器
可以使用ListIterator 在迭代输出list的元素时:
进行
添加 void add(e)
修改 void set(e)//用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。
删除 void remove()//移除 next 或 previous 返回的最后一个元素(可选操作)。
for(ListIterator li = list.listIterator(); li.hasNext();) {
syso(li.next);
li.add("我是新来的");
li.remove();//移除了li.next()的值
li.set("我代替了next的值");
}
逆向迭代输出list集合的所有元素
for(ListIterator li = list.listIterator(); li.hasPrevious();) {
syso(li.previous());
}
List的子类
由于数据结构的不同 ,所以list有很多子类,但常用的有3个:
1.ArrayList 数组,有序,不同步,查询快
2.LinkedList 链表和数组,有序,不同步,对首尾进行操作,增删快
3.Vector 数组,有序,同步,效率低,差不多过时了
Arraylist与Vector 跟List的方法差不多
LinkedList 频繁的增删的时候用
1.执行add remove操作时,因为ArrayList是数组实现,每添加一次,都会产生新的数组对象,效率比较低。LinkedList在执行add操作时,要比ArrayList性能高.
2.在执行get操作时,ArrayList是数组实现,可以理解连续内在空间,所以性能比较高。
LinkedList是链表实现,每一个中都保存了前一个的地址,在取出时效率低。
特有方法:
addFirst() addLast()
getFirst() getLast()
removeFirst() removeLast()
Set
Set 元素不重复,无序
常用子类:
HashSet 哈希表实现 无序
为了保证数据的唯一性,在对自定义对象操作的时候,需要自定义对象重写hashCode()和equals()
当obj.hashCode()==obj2.hashCode() 才会进行equals()判断内容,只有当hashCode()和equals()都一致的时候才说对象是相等的,
TreeSet 二叉树实现 默认自然排序
使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法
当自定义对象的时候,需要自定义对象实现Comparable,重写compareTo(obj)
class Student implements Comparable {
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
//需要重写
return 0;
}
}
或者 根据构造函数TreeSet(Comparator<? super E> comparator)
TreeSet set = new TreeSet(new MyComparator());
class MyComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
//需要重写
return 0;
}
}