Java泛型( 表示集合中儲存的資料的型別)
阿新 • • 發佈:2019-02-02
1.儲存字串
//建立一個集合儲存abcd
//<E>就代表儲存元素資料的型別
//後面的<> 要跟前面的泛型保持一致
//jdk1.7出來的 菱形泛型
//如果前面聲明瞭泛型,後面的泛型可以省略不寫,省略不寫,就表示型別一致
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
//用迭代器遍歷
Iterator<String >iterator = list.iterator();
while(iterator.hasNext()) {
//新增泛型之後,可以省去強轉的麻煩
String next = iterator.next();
System.out.println(next);
}
}
}
2.泛型編譯期與執行期
public static void fun2() {
//建立集合,儲存三個學生
ArrayList<Student> list = new ArrayList<>();
list .add(new Student("鵬鵬", 11));
list.add(new Student("水水", 12));
list.add(new Student("倩倩", 13));
Iterator<Student> iterator = list.iterator();
while(iterator.hasNext()) {
Student next = iterator.next();
System.out.println(next);
//編譯通過 是這個型別 你才能強轉 執行報錯
//設定泛型 可以把執行期報錯 轉換到編譯期報錯
// Worker worker = (Worker)next;
}
}
3.泛型類
package com.lanou3g.fx;
/*
* 泛型類(泛型類宣告時 尖括號中的字母 可以隨便定義)
* 泛型類的型別 在初始化這個類的物件的時候 確定
*/
public class Worker <W> {
//利用泛型寫成員方法
private W w ;
//利用泛型寫set/get方法
public void setM(W w) {
this.w = w;
}
public W getM() {
return w;
}
//普通成員方法
public void sayHi( W w) {
System.out.println(w);
}
//除了W 還能不能使用其他的泛型 例如 Z
//宣告不同泛型的方法,在呼叫泛型方法的時候,
//指定泛型方法的型別
//宣告一個泛型, 只能宣告過得,才能使用
public <Z> void print(Z z) {
System.out.println(z);
}
//靜態方法中,能不能直接使用W---不能直接使用
//當你呼叫靜態方法的時候,可能還沒有物件,
//沒有物件就沒指定泛型,所以不能用
//呼叫的時候確定型別
public static <Q> void fun(Q q) {
System.out.println(q);
}
//工作的方法
public void work() {
System.out.println("天天搬磚 一天能搬四百塊磚");
}
}
public static void fun3() {
//建立泛型類
Worker<String> worker = new Worker<>();
//給屬性賦值
worker.setM("呀哈哈");
System.out.println(worker.getM());
worker.sayHi("hahha");
//呼叫方法的時候給定型別
worker.print("你好");
//呼叫靜態方法
Worker.fun("好好");
}
4.介面泛型
//實現類的時候給定型別
interface InterA <Y>{
public abstract void fun(Y y);
}
class InterAImple implements InterA<String>{
@Override
public void fun(String y) {
// TODO Auto-generated method stub
System.out.println(y);
}
}
5.向上限定和向下限定
package com.lanou3g.fx;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.lanou3g.bean.Person;
import com.lanou3g.bean.Student;
/*
* ?extends E (向下限定)
*
* ?是子類 E是父類 ?只能是E類的子類
* ?super E
* ?是父類 E是子類 (向上限定) ?只能是E類的父類
*/
public class Demo02 {
public static void main(String[] args) {
//fun1();
//呼叫一:直接傳陣列
/* int [] array = {1,3,5,7,9};
fun2(10,array);
//呼叫二:傳入多個數
fun2(1,3,5,7,9);
*/
//Arrays 類方法 把陣列轉化為集合
int [] array = {1,2,3,4,5};
//把陣列當做集合中的一個元素,轉為了一個集合
List<int[]> asList = Arrays.asList(array);
//
Integer [] array2 = {1,2,3,4,5};//自動裝箱為Integer型別
List<Integer> asList2 = Arrays.asList(array2);
System.out.println(asList2);
System.out.println(asList);
String [] array3 ={"wanglong","wangsong"};
List<String> asList3 = Arrays.asList(array3);
System.out.println(asList3);
//把王建忠新增到 集合中
//使用 asList 陣列轉集合 得到一個集合
//注意:這個集合不允許,進行新增或刪除的操作
//asList3.add("wangjianzhong");
//System.out.println(asList3);
//那這樣轉的意義何在?可以呼叫集合的其他方法
boolean contains = asList3.contains("wanglong");
System.out.println(contains);
}
//int ... num 相當於傳入的引數是個陣列
//int ...num 可以接受多個引數 只能是方法引數最後一個
//jdk1.5之後出來的
public static void fun2(int j,int ... num) {
//遍歷
for (int i = 0; i < num.length; i++) {
System.out.println(num[i]);
}
System.out.println("int j+"+j);
}
/**
*
*/
public static void fun1() {
/*
* 建立一個儲存人的集合 存兩人
* 建立一個儲存學生的集合 存兩人
*/
ArrayList<Person> pList = new ArrayList<>();
pList.add(new Person("張三", 11));
pList.add(new Person("李四", 11));
ArrayList<Student>sList = new ArrayList<>();
sList.add(new Student("鵬鵬", 12));
sList.add(new Student("茜茜", 12));
//pList.addAll(sList);
// System.out.println(pList);
//括號裡面只能填子類
// sList.addAll(pList);
//System.out.println(sList);
}
}
6.集合中的刪除方式
/*
* )
* 1.不使用迭代器
* 2.使用迭代器
*/
public class Demo03 {
public static void main(String[] args) {
//fun1();
//fun2();
//建立集合 儲存 a,b,c,d,e
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
//增強for迴圈遍歷 底層是使用迭代器遍歷的
//增強for迴圈 只能 用來遍歷 也叫快速遍歷
//雙層遍歷的時候 使用比較多
for (String string : list) {
System.out.println(string);
}
}
/**
*
*/
public static void fun2() {
//建立集合 儲存 a,b,c,d,e
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
//迭代器刪除
//如果集合中
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
String next = iterator.next();
if(next.equals("b")) {
iterator.remove();
}
}
System.out.println(list);
}
/**
*
*/
public static void fun1() {
//建立集合 儲存 a,b,c,d,e
//
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
//如果不使用迭代器遍歷
//如果集合中有b就把b刪除了
for (int i = 0; i < list.size(); i++) {
if(list.get(i).equals("b")) {
//先當引數傳進去,在自減
list.remove(i);
i--;
}
}System.out.println(list);
}
}
7.集合中的排序
public class Demo04 {
public static void main(String[] args) {
//fun1();
//建立一個集合,存入五個學生
//按學生姓名進行排序
ArrayList<Student>list = new ArrayList<>();
list.add(new Student("a", 12));
list.add(new Student("b", 14));
list.add(new Student("c", 17));
list.add(new Student("d", 13));
list.add(new Student("e", 18));
//呼叫方法
sortByName(list);
//列印集合列印排序好的
System.out.println(list);
}
//按姓名比較 傳進來的是集合的地址
public static void sortByName(ArrayList<Student>list){
//比較交換
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size()-1-i; j++) {
//
Student stu1 = list.get(j);
Student stu2 = list.get(j+1);
//比較學生姓名
if(stu1.getName().compareTo(stu2.getName()) < 0) {
//交換(修改)在集合中的位置
Collections.swap(list, j, j+1);
}
}
}
System.out.println(list);
}
/**
*
*/
public static void fun1() {
//建立一個集合,存入五個學生
//按學生年齡進行排序
ArrayList<Student>list = new ArrayList<>();
list.add(new Student("峰峰", 12));
list.add(new Student("紅紅", 14));
list.add(new Student("火火", 17));
list.add(new Student("小小", 13));
list.add(new Student("美美", 18));
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size()-1-i; j++) {
//
Student stu1 = list.get(j);
Student stu2 = list.get(j+1);
//比較學生年齡
if(stu1.getAge()>stu2.getAge()) {
//交換(修改)在集合中的位置
//set (int index,Object object)
//Student temp = s1;
list.set(j+1, stu1);
list.set(j, stu2);
}
}
}
System.out.println(list);
}
}