集合类
数组只能存储固定长度的,集合是可变的,数组只能存储基本数据类型,集合可以存储对象,长度是不固定的
java.util package 中
Collection List Set
ArrayList LinkedList Vector HashSet TreeSet
ArrayList a1=new ArrayList();
集合中存放的不是对象实体,只是对象地址
a1.add("kingkong");
a1.add("Jack");
a1.add("Rose");
a1.add("Sam");
Iterator it=a1.iterator();
while(it.hasNext()){ //获取迭代器,用于取出集合中的元素
it.next();
}
或者 用for循环写
for(Iterator it=a1.iterator();it.hasNext();){
it.next();
}
List 中元素是有序的,元素是可以重复的,因为该集合有索引
ArrayList 底层使用的是数组结构,查询速度很快,但是增删稍慢
LinkedList 底层使用的是链表数据结构, 增删速度很快,查询稍慢
Vector 底层是数组结构,线程同步,被ArrayList替代
Set 中元素是无序的,元素是不可以重复的
-----------------------------------------------------------------------
List:特有方法,凡是可以操作角标的都是List的对象
增
add(index,element);
addAll(index,element);
删
remove(index);
改
set(index,element);
查
get(index);
subList(from,to);
listIterator();
for(int x=0;x<a1.size();x++)
ArrayList a1=new ArrayList();
Iterator it=a1.iterator();
ListIterator li=a1.ListIterator();//List所特有的迭代器
while(li.hasNext()){
Object obj=li.next();
if(obj.equals("kingkong"))
li.set(obj);
}
while(it.hasNext()){
Object obj=it.next();
if(obj.equals("kingkong"))
//it.remove();//将kingkong删除
}
List 集合的特有的迭代器,ListIterator是Iterator的子接口
在迭代时,不可以通过集合对象方法操作集合中的元素
因为会发生ConCurrentModificationException异常
所以在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法是有限的
***********************************************************
LinkedList 中特有的方法
addFirst();或者offerFirst();
addLast();或者offerLast();
getFirst();或者peekFirst(); 后面的新方法不会产生异常
getLast();或者peekLast();
removeFirst();或者poolFirst();
removeLast();或者poolLast();
LinkedList link=new LinkedList();
link.add("kingkong");
link.addLast("Jack");
**************************************************************************************************8
Set集合的功能和Collection功能是一样的
HashSet 底层结构式哈希表,线程是非同步的
保证元素唯一性的原理,判断hashCode值是否相同
如果相同,还会继续判断元素的equals方法,是否为true
HashSet是通过元素的两个方法,hashCode和equals来完成
如果元素的两个方法,hashCode和equals来完成
如果元素的HashCode值相同,才会判断equals是否为true
如果元素的HashCode值不同,不会调用equals
对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法
TreeSet 底层结构式二叉树,可以对集合中的元素进行排序
保证元素唯一性的依据:compareTo方法return 0;
TreeSet排序的第一种方式,让元素具备比较性
元素要实现Comparable接口,覆盖compareTo方法
TreeSet的第二种排序方式
当元素不具备比较性,或者具备的比较性不是所需要的
这时就需要让集合自身具备比较性
在集合初始化时就有比较性
HashSet hs=new HashSet();hs.add("kingkong");
hs.add("Jack");
hs.add("Rose");
自定义对象 必须复写函数的equals和hashCode
hs.contains(new Person("a1",11));
hs.remove(new Person());
*****************************************************************************
class Student implements Comparable{
public int comparaTo(){
if(!(obj instanceof Student))
throw new RuntimeException("is not Student instance");
Student s=(Student)obj;
if(this.age>s.age)
return 1;
if(this.age==s.age){
return this.name.compareTo(s.name);
}
return -1;
}
}
TreeSet ts=new TreeSet();
********************************************************************************************
泛型
用于解决安全问题,是一个安全机制
ArrayList<String> a1=new ArrayList<String>();
//迭代器也需要泛型表示
Iterator<String> it=a1.iterator<String>();
1.将运行时期的问题ClassCastException,转移到了编译时期
2.避免强制转换类型
在使用java提供的对象时,什么时候写泛型
在集合框架中很常见,只要见到<>就得定义泛型
<>就是用来接收类型的
当使用集合时,将集合中要要存储的数据类型作为参数传递到<>中
当自定义对象,必须定义hashCode和equals方法,还得实现comparable接口,复写其中的compareTo方法,使其具备默认比较性
TreeSet<Sting> ts=new TreeSet<String>();
ts.add("kingkong");
ts.add("Jack");
Iterator<String>it=new Iterator<String>();
while(it.hasNext()){
String s=it.next();
}
class LenCompatator implements Comparator<String>(){
public int compare(String s1,String s2){
int num=new Integer(s1.length()).compateTo(new Integer(s2.length()));
if(num==0)
return s2.compareTo(s1);
return num;
}
}class Worker{
}
class Tool{
private Object obj;
public void setWorker(Object obj){
this.obj=obj;
}
public Object getWorker(){
return obj;
}
}
//泛型类 ,当不确定其中的引用顺序不确定,可以定义泛型
class Utils<Type>{
private Type type;
public void setObject(Type type){
this.type=type;
}
public Type getObject(){
return type;
}
}
/*
class Tool{
private Worker worker;
public void setWorker(Worker worker){
this.worker=worker;
}
public Worker getWorker(){
return worker;
}
}
**/
静态方法泛型
class Demo<T>{
public void show(T t){
System.out.println(t);
}
public <E> void print(E e){
System.out.println(e);
}
//静态方法不可以访问类上定义的泛型
如果静态方法的操作的应用不确定,可以将泛型定义在方法上
public static <W>void method(W t){
System.out.println(t);
}
}
泛型定义在接口上
interface Inter<T>{
void show(T t);
}
class InterImpl extends Inter<String>{
public void show(String s){
System.out.println(s);
}
}
class InterImpl<T> implements Iner<T>{
public void show(T t){
System.out.println(t);
}
}
静态方法不可以访问类上定义的泛型
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上
方法上的泛型标志放在返回值的前面,修饰符的后面
泛型限定
? 是通配符,也可以理解为占位符
<? extends E>可以接受E类型或者E的子类型,上限
<? super E> 可以接受E类型或者E的父类型,下限
public static void printColl(ArrayList<? extends Person>a1){
Iterator<? extends Person>it=a1.iterator();
}
public static void printColl(ArrayList<?> a1){
Iterator<?> it=a1.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
***************************************************************************************************
Map集合:该集合存储键值对,一对一对的存储
添加
put()
putAll()
删除
clear()
remove()
判断
isEmpty()
获取
get()
size()
values()
keySet()
entrySet()
HashTable:底层是哈希表数据结构,线程同步,不可以存入null键null值
必须实现hashC和equals方法
HashMap:哈希表数据结构,允许使用null值和键,不同步
必须实现hashC和equals方法和CompareTo方法
TreeMap:底层是二叉树,线程不同步,可以用于给map集合中的键进行排序
Map<String,String> map=new HashMap<String,String>();
map.put("01","kingkong");
map.put("02","Jack");
添加相同的值,会覆盖原来的值
map.remove("02");
map.containsKey("02");
Map<Sting,String> map=new HashMap<Sting,string>();
map.put("01","kingkong");
map.put("02","Jack");
Set<String>keySet=map.keySet();
Iterator<String>it=keySet.iterator();
while(it.hasNext()){
String key=it.next();
//有了键就可以通过map集合的get方法获取其对应的value
String value=map.get(key);
//将Map中的映射关系取出,存入到Set集合中
Set<Map.Entry<String,String>> entrySet=map.entrySet();
Iterator<Map.Entry<String,String>>it=entrySet.iterator();
while(it.hasNext()){
Map.Entry<String,String>me=it.next();
String key=me.getKey();
String value=me.getValue();
}
}
实现CompareTo方法
Arrays是对数组操作的工具类
asList:将数组变成List集合
List<String>list=Arrays.asList(arr);
增强for循环
迭代器除了遍历,还可以进行remove集合中元素的动作
如果是用ListIterator,还可以再遍历过程中对集合进行增删改查的操作
ArrayList<String>a1=new ArrayList<String>();
a1.add("kingkong");
a1.add("Jack");
for(String s: a1){ //只能取出不能对集合进行操作
System.out.println(s);
}
int[] arr={2,4,6};
for(int x:arr){
System.out.println(x);
}
----------
----------------------------------------
Properties 是hashtable的子类,具备map集合的特点,而且里面存储的键值对是字符串
是集合中和IO技术想结合的集合容器
该对象的特点:可以用于键值对形式的配置文件
设置和获取元素
public static void setAndGt(){
Properties prop=new Properties();
prop.setProperty("john","10");
prop.setProperty("jack","87");
String value=prop.getProperty("jack");
Set<String> names=prop.stringPropertyNames();
for(String s:names){
sop(prop.getProperty(s));
}
}