1.迭代器
当我们在使用迭代器遍历集合的过程中 不允许对集合的
整体进行添加/删除操作 否则都会触发CME异常
(cme异常出现的原因是foreach的底层也是用迭代器实现的)
如果需求一定要求一边遍历 一边删除的话
只能使用迭代器的删除方法:
public static void main(String[] args) {
ArrayList<Student> list =new ArrayList<>();
Student stu1=new Student("张三丰");
Student stu2=new Student("李四光");
Student stu3=new Student("王五");
Student stu4=new Student("王六");
list.add(stu1);
list.add(stu2);
list.add(stu3);
list.add(stu4);
System.out.println(list);
for(Iterator<Student> it=list.iterator();it.hasNext();) {
System.out.println(it.next());
if(it.next().getName().length()>2){
it.remove();
}
}
System.out.println(list);
}
list.remove()
list.remove();底层是用equals()方法进行比较的,可以通过重写的方法来改变底层的判断
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return false;
}
单例模式
例1
单例模式:控制一个类有且只有一个对象
class Sun{
//私有化构造方法 目的是为了防止外界随意的创建对象
private Sun(){}
//创建一个Sun类型的对象
//每一个Sun类型的对象都有一个only属性
//Sun -> only[Sun] -> only[Sun] -> only[Sun] -> only.....
//创建一个私有的 静态的 属于本类类型的对象
private static Sun only = new Sun();
//getter
//提供一个公共的 静态的 返回本类的方法
public static Sun getOnly(){//Sun.getOnly()
return only;
}
}
//Student.name = "李四";
class Student{
//创建一个字符串对象 值:张三
//每一个学生都有自己的name属性
private static String name = new String("张三");//每一个学生都有自己的name
//getter
public String getName(){
return name;
}
}
例2:
public class TestShiDanLi2{
public static void main(String[] args){
Moon x = Moon.getMm();
Moon y = Moon.getMm();
Moon z = Moon.getMm();
System.out.println(x == y);
System.out.println(y == z);
}
}
//醉汉式
class Moon{
//private:私有化构造方法 防止外界随意的创建对象
private Moon(){}
//private:保护他的值不被改变 -》 Moon.mm = null
//static:防止月亮里面套月亮
private static Moon mm = new Moon();
//public:封装的要求
//static:防止方法依赖于对象存在 需要依赖于类存在
public static Moon getMm(){
return mm;
}
}
//懒汉式 -》 尚不完善
class Sun{
private Sun(){}
private static Sun only;
public static synchronized Sun getOnly(){
/*
if(only == null){
only = new Sun();
return only;
}else{
return only;
}
*/
if(only == null)
only = new Sun();
return only;
}
}