泛型、ArrayList、LinkedList、LinkedList的去重

目录

泛型

泛型机制

泛型的特点

泛型类

泛型接口

ArrayList

ArrayList存储字符串并遍历

ArrayList存储自定义对象并遍历

Vector的特有功能

Vector的特有功能的实现

LinkedList的特有功能

LinkedList的特有功能的实现

去除ArrayList中重复字符串元素方式

思路一:创建新集合方式

思路二:不创建新的集合,在原集合中进行操作

思路三:使用LinkedHashSet集合


泛型

泛型机制

泛型机制是一种把数据类型的明确工作,推迟到创建对象或调用方法的时候再执行的一种机制。

例如,在创建集合对象时,如果忽视泛型,直接写上 Object obj = new ArrayList(); 那么此时还是没有明确集合的数据类型,所以创建的集合中是可以存放任何数据类型的元素的(当然集合中只能存放对象)。如果此时存入了一个字符串对象"hello",我们要使用字符串类型的特有方法,就必须要进行向下转型,如下:

 import java.util.ArrayList;
 ​
 public class Test4 {
     public static void main(String[] args) {
         ArrayList list = new ArrayList();
         list.add(new java.lang.String("hello"));
         Object o = list.get(0);
         String s= (String) o;
         int i = s.compareTo("hellow");
         System.out.println(i);
     }
 }

但是,如果我们直接在创建集合的时候明确了数据类型,那么集合的元素的数据类型,就是你明确的这个数据类型。就会少许多麻烦。如下

 import java.util.ArrayList;
 ​
 public class Test5 {
     public static void main(String[] args) {
         ArrayList<String> list = new ArrayList<>();
         list.add(new String("hello"));
         int i = list.get(0).compareTo("hellow");
         System.out.println(i);
     }
 }

泛型的特点

1)只在编译期有效,在运行期就擦除了;

2)提高了代码的扩展性;

3)泛型是在JDK1.5之后引入的。

4)避免了强制类型转换;

5)优化了程序设计,解决了黄色警告线。

泛型类

泛型定义在类上,此类成为泛型类,如

 public class MyDemo<X> {
     public void myDemo(){}
 }

泛型接口

泛型也可以定义在接口上,此接口称为泛型接口

 public interface MyInterface<X, Y> {
     void show(X x, Y y);
 }

在一个实现类实现这个接口时,就可以明确泛型的具体类型。

 public class Test implements Inter<String,Integer>{
 ​
     @Override
     public void show(String s, Integer integer) {
         ;
     }
 }

当然也可以不明确具体的数据类型来实现接口

 public class Test2<X, Y> implements Inter<X,Y> {
 ​
     @Override
     public void show(X x, Y y) {
         
     }
 }

ArrayList

ArrayList存储字符串并遍历

 import java.util.ArrayList;
 import java.util.Iterator;
 ​
 public class Test4 {
     public static void main(String[] args) {
         ArrayList<String> list = new ArrayList<>();
         list.add("Alice");
         list.add("Helen");
         list.add("Jack");
         //迭代器遍历
         Iterator<String> iterator = list.iterator();
         while (iterator.hasNext()) {
             String s = iterator.next();
             System.out.println(s);
         }
         //普通for遍历
         for (int i = 0; i < list.size(); i++) {
             System.out.println(list.get(i));
         }
     }
 }

ArrayList存储自定义对象并遍历

import java.util.ArrayList;
 import java.util.Iterator;
 ​
 public class Test3 {
     public static void main(String[] args) {
         ArrayList<Student> list = new ArrayList<>();
         list.add(new Student("Alice",18));
         list.add(new Student("Jack",19));
         list.add(new Student("Helen",18));
         //迭代器遍历
         Iterator<Student> iterator = list.iterator();
         while (iterator.hasNext()) {
             Student next = iterator.next();
             System.out.println(next);
         }
         //普通for遍历
         for (int i = 0; i < list.size(); i++) {
             System.out.println(list.get(i));
         }
 ​
     }
 }

Vector的特有功能

 public void addElement(E obj)
 //将指定的元素添加到此向量的末尾,将其大小增加 1。如果向量的大小比容量大,则增大其容量。
     
 public E elementAt(int index)
 //返回指定索引处的元素。
 ​
 public Enumeration elements()
 //返回此向量的组件的枚举。返回的 Enumeration 对象将生成此向量中的所有项。生成的第一项为索引 0 处的项,然后是索引 1 处的项,依此类推。 
     
 E firstElement()
 //返回此向量的第一个组件(位于索引 0) 处的项)
     
 E lastElement()
 //返回此向量的最后一个组件。 
     
 void insertElementAt(E obj, int index)
 //将指定对象作为此向量中的组件插入到指定的 index 处。 

Vector的特有功能的实现

 import java.util.Vector;
 ​
 public class Test5 {
     public static void main(String[] args) {
         Vector<String> vector = new Vector<>();
         vector.add("Alice");
         vector.add("Helen");
         //将元素添加到集合的末尾
         vector.addElement("Jack");
         //返回索引处的元素
         String s = vector.elementAt(0);
         //返回第一个元素
         String firstElement = vector.firstElement();
         //返回最后一个元素
         String lastElement = vector.lastElement();
         //将元素插入到指定索引处
         vector.insertElementAt("Insert",1);
     }
 }

LinkedList的特有功能

 //将指定元素插入到此列表的开头
 public void addFirst(E e)
 ​
 //将指定元素添加到此列表的结尾。
 public void addLast(E e)
 ​
 //返回此列表的第一个元素。
 public E getFirst()
 ​
 //返回此列表的最后一个元素。 
 public E getLast()
 ​
 //移除并返回此列表的第一个元素。 
 public E removeFirst()
 ​
 //移除并返回此列表的最后一个元素。 
 public E removeLast()

LinkedList的特有功能的实现

 import java.util.LinkedList;
 ​
 public class Test6 {
     public static void main(String[] args) {
         LinkedList<String> list = new LinkedList<>();
         //将指定元素插入到此列表的开头
         list.addFirst("addFirst");
         //将指定元素添加到此列表的结尾。
         list.addLast("addLast");
         //返回此列表的第一个元素。
         String first = list.getFirst();
         //返回此列表的最后一个元素。
         String last = list.getLast();
         //移除并返回此列表的第一个元素。
         String removeFirst = list.removeFirst();
         //移除并返回此列表的最后一个元素。
         String removeLast = list.removeLast();
     }
 }

去除ArrayList中重复字符串元素方式

需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)

思路一:创建新集合方式

 import java.util.ArrayList;
 import java.util.Iterator;
 ​
 public class Test7 {
     public static void main(String[] args) {
         //ArrayList去除集合中字符串的重复值(字符串的内容相同)
         //创建新集合的方式
         ArrayList<Integer> list = new ArrayList<>();
         list.add(200);
         list.add(400);
         list.add(1);
         list.add(1);
         list.add(900);
         list.add(200);
         list.add(600);
         list.add(2);
         list.add(200);
         list.add(2);
         list.add(50);
 ​
         ArrayList<Integer> newList = new ArrayList<>();
         newList.add(list.get(0));
         Iterator<Integer> iterator = list.iterator();
         while (iterator.hasNext()) {
             Integer next = iterator.next();
             if(!newList.contains(next)){
                 newList.add(next);
             }
         }
         System.out.println(newList);
     }
 }

思路二:不创建新的集合,在原集合中进行操作

import java.util.ArrayList;

public class Test6 {
    public static void main(String[] args) {
        //ArrayList去除集合中字符串的重复值(字符串的内容相同)
        ArrayList<Integer> list = new ArrayList<>();
        list.add(200);
        list.add(400);
        list.add(1);
        list.add(1);
        list.add(900);
        list.add(200);
        list.add(600);
        list.add(2);
        list.add(200);
        list.add(2);
        list.add(50);

        for (int i = 0; i < list.size()-1; i++) {
            for (int j = i+1; j < list.size(); j++) {
                if(list.get(i).equals(list.get(j))){
                    list.remove(j);
                    j--;
                }
            }
        }
        System.out.println(list);
    }
}

思路三:使用LinkedHashSet集合

 import java.util.ArrayList;
 import java.util.LinkedHashSet;
 ​
 public class Test5 {
     public static void main(String[] args) {
         //ArrayList去除集合中字符串的重复值(字符串的内容相同)
         //使用LinkedHashSet集合,
         ArrayList<Integer> list = new ArrayList<>();
         list.add(200);
         list.add(400);
         list.add(1);
         list.add(1);
         list.add(900);
         list.add(200);
         list.add(600);
         list.add(2);
         list.add(200);
         list.add(2);
         list.add(50);
         //使用有参构造创建LinkedHashSet对象,并且将list当做参数传入
         LinkedHashSet<Integer> linkedHashSet = new LinkedHashSet<>(list);
         System.out.println(linkedHashSet);
     }
 }

上一篇:一文带你全面了解RxJava


下一篇:【转载】RxJava2.0——从放弃到入门