【Java】List


目录

🥬初识泛型

🥬包装类

💧装箱与拆箱

🥬List的使用

💧练习

🥬小结


🥬初识泛型

什么是泛型?

泛型本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

为什么要使用泛型?

我们之前所了解的顺序表,里面只能放int类型的数据,但是如果我们要存放其他数据类型的数据,该怎么办呢?

我们在了解多态过程中已知一个前提,基类的引用可以指向子类的对象。 其次,我们也已知 Object java 中所有祖先类 那么,要解决上述问题,我们很自然的想到一个解决办法,将我们的顺序表的元素类型定义成 Object 类型,这 样我们的 Object 类型的引用可以指向 其他类型的对象。
代码示例:
class MyArrayList{                   private Object[] elem;           private int useSize;             public MyArrayList() {           this.elem =new Object[10];   }                                public void add(Object val){     this.elem[useSize]=val;      useSize++;                   }                                public Object get(int pos){      return this.elem[pos];       }                                
}public class Test {                                               public static void main(String[] args) {                      MyArrayList myArrayList=new MyArrayList();                myArrayList.add("abc");                                   myArrayList.add("1");                                     String ret=(String) myArrayList.get(0);                   System.out.println(ret);                                  }                                                                                                 

我们可以看到什么类型的数据都可以存放,且每次取出数据都需要强制类型转换。

 那么问题又来了,用Object,什么类型都能存放,那么能不能存放指定类型?并且每次取出元素不需要强制类型转换?这时候就用到了泛型。

代码示例:

 public static void main(String[] args) {MyArrayList myArrayList=new MyArrayList<>();myArrayList.add("A");myArrayList.add("B");String ret= myArrayList.getpos(1);System.out.println(ret);System.out.println("==================");MyArrayList myArrayList1=new MyArrayList<>();myArrayList1.add(12);myArrayList1.add(34);int ret1=myArrayList1.getpos(0);System.out.println(ret1);}
//1. 尖括号 <> 是泛型的标志
//2. E 是类型变量(Type Variable),变量名一般要大写
//3. E 在定义时是形参,代表的意思是 MyArrayList 最终传入的类型,但现在还不知道 class MyArrayList {private E[] elm;private int useSize;public MyArrayList(){this.elm=(E[]) new Object[10];}public void add(E val){this.elm[useSize]=val;useSize++;}public E getpos(int pos){return this.elm[pos];}
}

ArrayList中的E称为类型参数变量(相当于一个占位符)。

ArrayList中的String为实际类型参数。

class ArrayList表示当前类是一个泛型类。

 总结:

1. 泛型是为了解决某些容器、算法等代码的通用性而引入,并且能在编译期间做类型检查。 2. 泛型利用的是 Object 是所有类的祖先类,并且父类的引用可以指向子类对象的特定而工作。 3. 泛型是一种编译期间的机制,即 MyArrayList MyArrayList 在运行期间是一个类型。 4. 泛型是 java 中的一种合法语法,标志就是尖括号 <> 。

泛型的意义:
1、自动对类型进行检查。
2、自动对类型进行强制类型的转换。

🥬包装类

Object 引用可以指向任意类型的对象,但有例外出现了,8 种基本数据类型不是对象,那岂不是刚才的泛型机制要 失效了? 实际上也确实如此,为了解决这个问题, java 引入了一类特殊的类,即这 8 种基本数据类型的包装类,在使用过程中,会将类似 int 这样的值包装到一个对象中去。

基本就是类型的首字母大写,除了 Integer Character

💧装箱与拆箱

装箱操作,新建一个 Integer 类型对象,将 a 的值放入对象的某个属性中 。 拆箱操作,将 Integer 对象中的值取出,放到一个基本数据类型中 。 (装箱拆箱也可叫装包拆包) 示例代码:

    public static void main(String[] args) {//1.Integer a=12;//装箱(隐式)int b=a;//拆箱//2.Integer integer=new Integer(12);//装箱(显示)int c=integer;//拆箱//3.Integer a1=Integer.valueOf(12);//装箱(显示)int b1=a1.intValue();//拆箱double b2=a1.doubleValue();byte b3=a1.byteValue();float b4=a1.floatValue();long b5=a1.longValue();short b6= a1.shortValue();}

 但是要注意一点:

新建一个Integer类型对象,它的取值范围是-128--127,如果放入a的值超过这个范围,则会新建另一个对象放a。

   //1、   Integer a=127;Integer b=127;System.out.println(a==b);//true//2、Integer a=128;Integer b=128;System.out.println(a==b);//false//3、Integer a=-128;Integer b=-128;System.out.println(a==b);//true//4、Integer a=-129;Integer b=-129;System.out.println(a==b);//false

🥬List的使用

List(线性表)常见方法的使用

我们找到List源码,可以知道List接口继承了Collection接口,所以List可以实现Collection接口的方法。

ArrayList(顺序表):

 LinkedList(链表):

LinkedList()  无参构造

ArrayList打印四种方式:

    public static void main(String[] args) {List list = new ArrayList<>();list.add("hello");list.add("world");list.add("heihei");//1、System.out.println(list);//2、for循环for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i)+" ");}System.out.println();//3、for-eachfor (String s:list) {System.out.print(s+" ");}System.out.println();//4、迭代器打印Iterator it=list.iterator();while(it.hasNext()){System.out.print(it.next()+" ");}System.out.println();System.out.println("========迭代器List相关打印==========");ListIterator it2 = list.listIterator();while (it2.hasNext()) {String ret = it2.next();if (ret.equals("hello")) {it2.remove();//首先需要使用next方法迭代出集合中的元素 ,然后才能调用remove方法} else {System.out.print(ret + " ");}}}

💧练习

扑克牌:

class Card{private int rank;//数字private String suit;//花色public Card(int rank, String suit) {this.rank = rank;this.suit = suit;}public int getRank() {return rank;}public void setRank(int rank) {this.rank = rank;}public String getSuit() {return suit;}public void setSuit(String suit) {this.suit = suit;}@Overridepublic String toString() {return rank +":"+ suit + " ";}
}public class TestDemo4 {public static void main1(String[] args) {List cards=buyCard();System.out.println("买牌"+cards);shuffle(cards);System.out.println("洗牌"+cards);System.out.println("揭牌:三个人轮流揭五张牌");ArrayList> hand=new ArrayList<>();//相当于一个二维数组ArrayList hand1=new ArrayList<>();ArrayList hand2=new ArrayList<>();ArrayList hand3=new ArrayList<>();hand.add(hand1);hand.add(hand2);hand.add(hand3);for(int i=0;i<5;i++){for (int j = 0; j < 3; j++) {Card card = cards.remove(0);//每揭一张牌,剩余的牌就要少一张,相当于每次揭牌揭的都是第一张hand.get(j).add(card);}}System.out.println("hand1"+hand1);System.out.println("hand2"+hand2);System.out.println("hand3"+hand3);System.out.println("剩余的牌"+cards);}
//洗牌public static void shuffle(List cards){int size=cards.size();for (int i = size-1; i >0; i--) {//从最后一张牌开始交换Random random=new Random();//生成随机数int rand=random.nextInt(i);swap(cards,i,rand);}}public static void swap(List cards,int i,int j){Card tmp=cards.get(i);cards.set(i,cards.get(j));cards.set(j,tmp);}//买牌public static final String[] suits = {"♥", "♠", "♣", "♦"};public static List buyCard() {ArrayList cards=new ArrayList<>();for (int i = 0; i < 4; i++) {for (int j = 1; j <= 13; j++) {cards.add(new Card(j,suits[i]));}}return cards;}
}

杨辉三角:

  public static void main(String[] args) {Scanner scanner=new Scanner(System.in);int sc= scanner.nextInt();List> ret= generate(sc);for (int i = 0; i < ret.size(); i++) {System.out.println(ret.get(i));}}public static List> generate(int numRows) {List> ret=new ArrayList<>();List list1=new ArrayList<>();list1.add(1);ret.add(list1);//把第一行的数据放到ret中for (int i = 1; i  list=new ArrayList<>();list.add(1);List prerow=ret.get(i-1);//获取上一行for(int j=1;j

🥬小结

以上就是今天的内容了,有什么问题都可以在评论区留言哦✌✌✌!


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部