1.容器
1.什么是容器
我们可以把容器和数组进行比较,这样可以方便我们理解容器.
数组的特点:
- 存储多个数据
- 数据类型相同
- 长度不可变
- 有序(根据索引)
容器的特点
- 存储多个数据
- 长度可以随着内容的多少进行修改
- 可以存储任意类型的数据
2.自定义的容器类: 只能存储字符串类型的数据
我们需要实现以下功能
- 添加功能
- 删除数据
- 修改数据
- 查询数据
public class App01 {
public static void main(String[] args) {
MyContainer container=new MyContainer();
container.add("钢铁侠");
System.out.println(container.size());
container.add("蜘蛛侠");
System.out.println(container.size());
container.add("猪猪侠");
System.out.println(container.size());
System.out.println(container.get(0));
System.out.println(container.get(1));
System.out.println(container.get(2));
System.out.println(container);
container.delete(1);
System.out.println(container);
}
}
//自定义容器类
class MyContainer{
//字符串数组,存储容器中的数据
private String[] arr;
//存储容器中数据的个数
private int size;
public MyContainer() {
arr = new String[0];
}
/*
*
*/
public String get(int index) {
if(index<0 || index>=size){
return "数组索引越界!!!";
}
return arr[index];
}
/*
* 存储数据:
* 返回值:不需要 参数:String
*/
public void add(String value) {
//备份原数组的地址
String[] temp=arr;
arr=new String[size+1];
//原数组中数据拷贝到新数组对应位置
for(int i=0;i<=size-1;i++){
arr[i]=temp[i];
}
//把参数赋值给数组的最后位置
arr[size]=value;
//长度+1
size++;
}
//删除方法
//返回值:没有 参数:根据索引删除
public void delete(int index){
if(index<0 || index>=size){
throw new ArrayIndexOutOfBoundsException( "数组索引越界!!!");
}
String[] temp=arr;
arr=new String[size-1];
//根据索引循环,判断当前索引值是否与要删除的数据的索引相同
for(int i=0;i<=size-1;i++){
if(i>=index){
if(i==index){
continue;
}
arr[i-1]=temp[i];
}else{
arr[i]=temp[i];
}
}
size--;
}
public int size(){
return this.size;
}
@Override
public String toString() {
return "MyContainer [arr=" + Arrays.toString(arr) + ", size=" + size + "]";
}
}
容器类中可以存放不同类型的数据,但是必须都是为引用类型的数据,基本数据类型会自动装箱.
2.遍历
接下来我为大家介绍遍历容器中的数据的几种方法
例子
public class ListDemo02 {
public static void main(String[] args) {
List<String> list=new ArrayList();
list.add("钢铁侠");
list.add("美国队长");
list.add("黑寡妇");
list.add("灭霸");
list.add("蜘蛛侠");
list.add("雷神");
System.out.println(list);
//1.普通for
/*for(int i=0;i<list.size();i++){
if("灭霸".equals(list.get(i))){
list.add("惊奇队长");
}
}*/
//1.for each
//ConcurrentModificationException //出现异常
/*for(String s :list){
if("灭霸".equals(s)){
list.add("惊奇队长");
}
}*/
//3.迭代器
//ConcurrentModificationException 通过多个引用同时操作对象时,不允许同时操作,可能会发生这个异常
/*for(Iterator<String> it=list.iterator();it.hasNext();){
if("灭霸".equals(it.next())){
list.add("惊奇队长");
}
}*/
//4.列表迭代器
//ListIterator<E> listIterator()
ListIterator it=list.listIterator();
while(it.hasNext()){
if("灭霸".equals(it.next())){
it.add("惊奇队长");
}
}
System.out.println(list);
}
}
以上例子中用到迭代器与增强For时出现了异常,通过多个引用同时操作对象时,不允许同时操作.
1.增强For循环 for...each
for(Iterator<String> it=list.iterator();it.hasNext();){
if("灭霸".equals(it.next())){
list.add("惊奇队长");
}
}
2.迭代器
for(Iterator<String> it=list.iterator();it.hasNext();){
if("灭霸".equals(it.next())){
list.add("惊奇队长");
}
}
3.普通For
for(int i=0;i<list.size();i++){
if("灭霸".equals(list.get(i))){
list.add("惊奇队长");
}
}
4.列表迭代器
ListIterator it=list.listIterator();
while(it.hasNext()){
if("灭霸".equals(it.next())){
it.add("惊奇队长");
}
}