Java--泛型理解和使用 (List<String> list = new ArrayList<String>(); )

1

List<String> list = new ArrayList<String>();

public class GenericTest {
 
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("qqyumidi");
        list.add("corn");
        list.add(100);
 
        for (int i = 0; i < list.size(); i++) {
            String name = (String) list.get(i);
            System.out.println("name:" + name);
        }
    }
}  

在这段代码中,定义了一列表对象list,并在其中添加了两个字符串和一个整形数据,在遍历此列表读取数据时,则需要首先将此列表转型为字符串型才能够输出(红色代码),而且,我们也不知道此列表是什么类型的,这就造成了一些不必要的麻烦,而泛型就可以很好的解决这些问题。

看以下代码:

public class GenericTest {
 
    public static void main(String[] args) {
 
 
        List<String> list = new ArrayList<String>();
        list.add("qqyumidi");
        list.add("corn");
        //list.add(100);   //此处会报错,原因是在定义列表对象时就已经声明了这是一个字符串类型的列表,所以不可以在里面添加整形的数据
 
        for (int i = 0; i < list.size(); i++) {
            String name = list.get(i);
            System.out.println("name:" + name);
        }
    }

 上面这段代码用泛型改写(蓝色代码表示泛型写法),其中<String>表示此列表是字符串型,因此,在循环中红色代码处,不需要再对列表进行强制转型。这就是泛型。同理,类似的方法也可以应用到类和方法中,如下代码所示:

public class GenericTest {
 
    public static void main(String[] args) {
 
        Box<String> name = new Box<String>("corn");
        System.out.println("name:" + name.getData());
    }
 
}
 
class Box<T> {
 
    private T data;
 
    public Box(T data) {
        this.data = data;
    }
 
    public T getData() {
        return data;
    }
 
}

 其中,类Box定义时在其旁边加了<T>,T表示此类的数据类型,T的作用相当于方法中的形参,等待被调用时输入实参。  
在main函数中,将Sting类型传入形参,此时,Box类就是String型

### Java 中创建嵌套字符串列表 在 Java 中,可以轻松地创建包含其他 `ArrayList` 实例的 `ArrayList` 来形成所谓的嵌套列表。下面是一个具体的初始化例子: ```java import java.util.ArrayList; public class NestedStringLists { public static void main(String args[]) { // 创建第一个内部 ArrayList 并填充一些字符串 ArrayList<String> listOne = new ArrayList<>(); listOne.add("apple"); listOne.add("banana"); // 创建第二个内部 ArrayList 并填充更多字符串 ArrayList<String> listTwo = new ArrayList<>(); listTwo.add("carrot"); listTwo.add("date"); // 创建外部 ArrayList 用于存储上述两个内部列表 ArrayList<ArrayList<String>> outerList = new ArrayList<>(); outerList.add(listOne); outerList.add(listTwo); // 打印整个嵌套列表的内容 System.out.println(outerList); } } ``` 这段代码展示了如何构建一个由多个 `ArrayList<String>` 组成的新 `ArrayList` 对象[^2]。 对于可能遇到的问题,在处理嵌套列表时需要注意以下几点: - **访问元素**:由于存在两层索引,因此需要两次调用 get 方法来获取最内层的数据项。 - **修改内容**:如果要更改某个特定位置上的值,则同样需指定双重下标;另外要注意当改变任何子列表内的条目时会影响到父级容器所指向的对象。 - **遍历方式**:迭代器模式适用于这种情况下的逐一遍历操作,也可以采用增强 for 循环语法简化书写过程。 ### 常见错误及解决方案 1. 尝试直接向参数为 `ArrayList<?>` 类的外层集合添加新成员会引发编译期异常——这是因为通配符表示未知的具体类,所以不允许写入除 null 外任意对象实例。 解决方案是在声明时不使用不确定类的占位符而是具体化每层的实际承载单元种类,比如上面的例子中就是明确指定了内外均为 `ArrayList<String>` 形式的组合结构。 2. 如果不小心混淆了不同层次间的边界或者误用了单重而非必要的多重索引来定位目标项目的话也会抛出运行时刻错乱状况(IndexOutOfBoundsException 或者 NullPointerException),这通常是因为逻辑上未能正确理解多维数组/链表的概念所致。 3. 当试图复制一份独立于原版之外的新副本却只是简单赋值给另一个变量名的时候实际上二者共享同一内存地址空间从而造成同步更新现象,这不是预期行为。 正确做法应当利用深拷贝技术或是借助序列化的手段完成真正意义上的克隆动作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值