import java.util.*;
public class Conllection_Set_List {
/**
* Collection
* |--List:元素是有序的·元素是重复的,因为该集合体系有索引
* |---ArrayList:底层的数据结构使用的是数组结构。
* 特点:查询速度很快,但是插入和删除比较慢。线程不同步
* |---LinkeList:底层使用的是链表数据结构。
* 特点:查询比较慢,但是插入和删除比较快。
* |---Vector:底层是使用数组数据结构。线程同步,功能和ArrayList一样的。但是被AraayList取代了
* 特点:查询和插入、删除都比较慢,它默认长度为10,如果超过10后会new一个15的数组,将
* 原来的数据传到15的数组后再添加新的额数据,但是ArrayList会new一个长度为20的数组。
* 特有方法:凡事可以操作角标的方法都是该体系的特有方法。
* 增
* add(int index,E element):在列表的指定位置插入指定元素(可选操作)。
* addAll(index,collection):在指定位置插入collection中的全部元素
* 删
* remove(index);删除指定数据。
* 改
* set(index,element);修改指定位置的数据
* 查
* get(index)获取指定数据。
* subList(from,to);获取区间内的数据。
* listIterator();
* |--set:元素是无序的,元素不可以重复。
* @param args
*
* List集合特有迭代器。ListIterator是Iterator的子接口。
* 在迭代时不可以通过集合对象的方法操作集合中的元素。因为会发生修改异常。
* 所以在迭代器中只能通过迭代器的方法操作元素。可是Iterator的方法是有限的。只能对元素进行判断、移除、取出操作。
* 如果想进行其他的操作,比如添加,修改等操作就要用到Iterator的子接口ListIterator
*
* 该接口只能通过List集合的ListIterator方法获取。
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
//method();
//演示列表迭代器
//创建一个容器,通过collection的子类对象ArrayList。
ArrayList al = new ArrayList();
//添加元素
al.add("java1");
al.add("java2");
al.add("java3");
al.add("java4");
ListIterator li = al.listIterator();
System.out.println(li.hasPrevious());
//正向遍历
while(li.hasNext()){
Object obj = li.next();
if(obj.equals("java1")){
//li.add("sheng");
li.set("java5");
}
}
System.out.println(li.hasPrevious());
System.out.println(li.hasNext());
sop(al);
//逆向遍历
while(li.hasPrevious()){
sop(li.previous());
}
/*
Iterator it = al.iterator();
//对取出的元素进行一些操作,在迭代过程中进行一些添加或者删除
while(it.hasNext()){
//sop(it.next());
Object obj = it.next();
if(obj.equals("java2")){
it.remove();
//不能进行添加功能
//al.add("sheng");//在这里会出现修改异常,因为对同一个数据有两种方法在调用,会出现安全隐患。
sop(obj);//在这里obj=java2,因为在迭代中移除的是对象的引用(地址),但是数据还是在内存中,所以会打印java2
sop(al);
}
}*/
}
public static void method(){
//创建一个容器,通过collection的子类对象ArrayList。
ArrayList al = new ArrayList();
//添加元素
al.add("java1");
al.add("java2");
al.add("java3");
al.add("java4");
sop(al);
//在指定位置添加元素
al.add(0, "haisheng");
sop(al);
//删除指定位置的元素
//al.remove(0);
//sop("删除后的数据"+al);
//修改元素
al.set(2, "sheng");
sop("修改后的数据"+al);
//查单个数据
//al.get(1);
//sop(al.get(1));
//获取一段数据,包含头,不包含尾部
sop("获取一段数据"+al.subList(1, 3));
//获取数据
Iterator it = al.iterator();
while(it.hasNext()){
sop(it.next());
}
//通过indexOf获取元素的位置
System.out.println("sheng元素的位置index = "+al.indexOf("sheng"));
//通过角标获取元素
List sub = al.subList(1,3);
sop(sub);
}
public static void sop(Object obj){
System.out.println(obj);
}
}
**********************************************************************************************
Set集合
import java.util.*;
public class SetDemo {
/**
* |----set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
* set集合的功能和collection的功能是一致的。
* |---HashSet:底层数据结构是哈希表。
* HashSet是如何保证元素唯一性的呢?
* 是通过元素的两个方法,HashCode()和equals()来实现的。如果元素的hashCode()的值一样
* 那么就会调用equals来比较内容是否相同,如果相同就不能保存进来。如果HashCode的值不一样
* 那么久不会比较。
* 所以在以后的开发中,一般都要复写对象中的HashCode()函数。是集合底层内部调用的。
* |---TreeSet:
*
* @param args
*
* 往HashSet中存入自定义对象,姓名,年龄相同为同一个对象。
*/
public static void sop(Object obj){
System.out.println(obj);
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
//哈希表中的数据是按照哈希值来存的,如果两者的哈希值一样,就是位置一样是,还要进行判断,判断两者数值
//是否一样?判断是否同一个对象。如果对象不一样,那么会在同一个地址上。在同一个地址上顺延,
// Demo de1 = new Demo();
// Demo de2 = new Demo();
// sop(de1);
// sop(de2);
// HashSet hs = new HashSet();
// hs.add("java1");
// hs.add("java2");
// hs.add("java02");
// hs.add("java3");
// hs.add("java3");
// hs.add("java4");
// //取出只有一种方式:迭代器
// Iterator it = hs.iterator();
// while(it.hasNext()){
//// Object obj = it.next();
// sop(it.next());
// }
// }
HashSet hs = new HashSet();
hs.add(new person1("zhangdan1",20));
hs.add(new person1("zhangdan2",21));
hs.add(new person1("zhangdan3",22));
hs.add(new person1("zhangdan4",20));
hs.add(new person1("zhangdan4",20));
//注意:对于判断元素是否存在和删除等操作,都以来方法:HashCode和equals。先判断HashCode,再判断equals。
sop("zhangdan4"+hs.contains(new person1("zhangdan4", 20)));
hs.remove(new person1("zhangdan3", 22));
Iterator it = hs.iterator();
while(it.hasNext()){
person1 p = (person1)it.next();
sop(p.getName()+"--"+p.getAge());
}
}
}
class person1{
private String name;
private int age;
person1(String name, int age){
this.name = name;
this.age = age;
}
public int hashCode(){
//System.out.print(this.name+"---HashCode");是用来检测HashCode的调用情况
return name.hashCode()+age*37;//尽量是用来保持哈希值的唯一性。
}
public boolean equals(Object obj){
if(!(obj instanceof person1))
return false;
person1 p = (person1)obj;
return this.name.equals(p.name)&& this.age==p.age;
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
|
|