泛型Generics

一般通过“容器”来容纳和管理数据。程序中的“容器”就是用来容纳和管理数据。

数组就是一种容器,可以在其中放置对象或基本类型数据。

数组的优势:是一种简单的线性序列,可以快速地访问数组元素,效率高。如果从效率和类型检查的角度讲,数组是最好的。

数组的劣势:不灵活。容量需要事先定义好,不能随着需求的变化而扩容。比如:在一个用户管理系统中,要把今天注册的所有用户取出来,那么这样的用户有多少个?在写程序时是无法确定的。因此,在这里就不能使用数组。

容器,也叫集合(Collection)

泛型:可以帮助我们建立类型安全的集合。在使用了泛型的集合中,遍历时不必进行强制类型转换。JDK提供了支持泛型的编译器,将运行时的类型检查提前到了编译时执行,提高了代码可读性和安全性。

泛型的本质就是“数据类型的参数化”。可以把“泛型”理解为数据类型的一个占位符(形式参数),即告诉编译器,在调用泛型时必须传入实际类型。

未使用泛型时:

package cn.dym11;
//测试泛型
public class TestGeneric {public static void main(String[] args) {MyCollection mc=new MyCollection();mc.set("代止兮", 0);mc.set(8888, 1);Integer a=(Integer) mc.get(1);String b=(String) mc.get(0);}
}
class MyCollection {Object [] objs=new Object[5];public void set(Object obj,int index) {objs[index]=obj;}public Object get(int index) {return objs[index];}
}

使用泛型:

package cn.dym11;
//测试泛型
public class TestGeneric {public static void main(String[] args) {MyCollection<String> mc=new MyCollection<String>();mc.set("代止兮", 0);String b=mc.get(0);}
}
class MyCollection <E> {Object [] objs=new Object[5];public void set(E e,int index) {objs[index]=e;}public E get(int index) {return (E) objs[index];}
}

自定义泛型、容器中使用泛型

类的声明处增加泛型列表,如:<T,E,V>

public class Test {public static void main(String[] args) {// 以下代码中List、Set、Map、Iterator都是与容器相关的接口;List<String> list = new ArrayList<String>();Set<Man> mans = new HashSet<Man>();Map<Integer, Man> maps = new HashMap<Integer, Man>();Iterator<Man> iterator = mans.iterator();}
}

Collection、List、Set、Map、Iterator接口都定义了泛型。


Collection接口

Collection 表示一组对象,它是集中、收集的意思。Collection接口的两个子接口是List、Set接口。

注:由于List、Set是Collection的子接口,意味着所有List、Set的实现类都有上面的方法。

package cn.dym11;import java.util.ArrayList;
import java.util.Collection;//测试Collection接口中的方法
public class TestList {public static void main(String[] args) {Collection<String> c=new ArrayList<>();System.out.println(c.size());System.out.println(c.isEmpty());c.add("代止兮");c.add("苍凌");System.out.println(c);System.out.println(c.size());System.out.println(c.contains("苍凌"));Object[] objs=c.toArray();System.out.println(objs);c.remove("苍凌");System.out.println(c);c.clear();System.out.println(c.size());}}

package cn.dym11;import java.util.ArrayList;
import java.util.Collection;
import java.util.List;//测试Collection接口中的方法
public class TestList {public static void main(String[] args) {test02();}public static void test02() {List<String> list01=new ArrayList <>();list01.add("aa");list01.add("bb");list01.add("cc");List<String> list02=new ArrayList <>();list02.add("aa");list02.add("dd");list02.add("ee");System.out.println("list01:"+list01);  //list01:[aa, bb, cc]// list01.addAll(list02);// System.out.println("list01:"+list01);  //list01:[aa, bb, cc, aa, dd, ee]// list01.removeAll(list02);// System.out.println("list01:"+list01);  //list01:[bb, cc]list01.retainAll(list02);System.out.println("list01:"+list01); // list01:[aa]System.out.println(list01.containsAll(list02));}
}


List特点和常用方法

List是有序、可重复的容器

有序:List中每个元素都有索引标记。

可重复:List允许加入重复的元素。更确切地讲,List通常允许满足 e1.equals(e2) 的元素重复加入容器。

List接口常用的实现类有3个:ArrayList、LinkedList和Vector

List中操作索引的常用方法

package cn.dym11;import java.util.ArrayList;
import java.util.List;public class TsetList01 {public static void main(String[] args) {test01();}public static void test01(){List<String> list=new ArrayList<>();list.add("A");list.add("B");list.add("C");list.add("D");System.out.println(list);list.add(2,"代止兮");System.out.println(list);list.remove(2);System.out.println(list);list.set(2, "代止兮");System.out.println(list);System.out.println(list.get(2));list.add("C");list.add("B");list.add("A");System.out.println(list);System.out.println(list.indexOf("B"));  //找到,返回索引位置System.out.println(list.indexOf("d"));  //找不到,返回-1System.out.println(list.lastIndexOf("B"));}
}


 ArrayList特点和底层实现

ArrayList底层是用数组实现的存储。   特点:查询效率高,增删效率低,线程不安全。

ArrayList底层使用Object数组来存储元素数据

数组长度是有限的,而ArrayList是可以存放任意数量的对象,长度不受限制,那么它是怎么实现的呢?本质上就是通过定义新的更大的数组,将旧数组中的内容拷贝到新数组,来实现扩容。

自定义实现一个ArrayList,体会底层原理

第一个版本:

package cn.dym11;// 自定义实现一个ArrayList,体会底层原理public class SxtArrayList {private Object[] elementData;private int size;private static final int DEFAULT_CAPACITY=10;public SxtArrayList() {elementData=new Object[DEFAULT_CAPACITY];}public SxtArrayList(int capacity) {elementData=new Object[capacity];}public void add(Object obj) {elementData[size++]=obj;}public String toString() {StringBuilder sb=new StringBuilder();// [a,b,c]sb.append("[");
//      for(Object obj:elementData) {
//          sb.append(obj);
//      }
//      sb.append("]");for(int i=0;i<size;i++) {sb.append(elementData[i]+",");}sb.setCharAt(sb.length()-1, ']');return sb.toString();}public static void main(String[] args) {SxtArrayList s1=new SxtArrayList(20);s1.add("aa");s1.add("bb");System.out.println(s1);}
}

//增加泛型
//增加数组扩容

package cn.dym11;// 自定义实现一个ArrayList,体会底层原理
//增加泛型
//增加数组扩容
public class SxtArrayList02<E> {private Object[] elementData;private int size;private static final int DEFAULT_CAPACITY=10;public SxtArrayList02() {elementData=new Object[DEFAULT_CAPACITY];}public SxtArrayList02(int capacity) {elementData=new Object[capacity];}public void add(E element) {// 什么时候扩容??if(size==elementData.length) {//怎么扩容?? //扩容操作Object[] newArray=new Object[elementData.length+(elementData.length>>1)];System.arraycopy(elementData, 0, newArray, 0,elementData.length );elementData=newArray;}  elementData[size++]=element;}public String toString() {StringBuilder sb=new StringBuilder();// [a,b,c]sb.append("[");
//      for(Object obj:elementData) {
//          sb.append(obj);
//      }
//      sb.append("]");for(int i=0;i<size;i++) {sb.append(elementData[i]+",");}sb.setCharAt(sb.length()-1, ']');return sb.toString();}public static void main(String[] args) {SxtArrayList02 s1=new SxtArrayList02(20);for(int i=0;i<40;i++) {s1.add("dym"+i);}System.out.println(s1);}
}

java的知识点23——泛型Generics、Collection接口、List特点和常用方法、 ArrayList特点和底层实现相关推荐

  1. java(四)【常用API,自定义泛型、collection接口】

    day04[常用API.正则表达式,泛型.Collection集合API] 主要内容 Date类 Java是面向对象的思想,会用一个类来代表一个事物. Date代表了系统当前此刻日期对象!年月日时分秒 ...

  2. 9.1-全栈Java笔记: 容器泛型—认识Collection接口

    开发和学习中需要时刻和数据打交道,如果组织这些数据是我们编程中重要的内容. 我们一般通过"容器"来容纳和管理数据.   事实上,数组就是一种容器,可以在其中放置对象或基本类型数据. ...

  3. Java学习之容器上(Collection接口常用方法,Iterator接口,使用foreach循环遍历Collection集合元素,Set集合通用知识(Hashset类,hashcode()与Lin

    1.容器API的类图结构如下: JAVA的集合类是一种特别有用的工具类,它可以用于存储数量不等的多个对象,并可以实现常用数据结构,如栈,队列等,除此之外,JAVA集合还可用于保存具有映射关系的关联数组 ...

  4. Java核心(集合类1-概述、Collection 接口 、List 集合)

    一.集合类概述 java.util 包中提供了一些集合类,这些集合类又被称为容器.集合类与数组的不同之处是,数组的长度是固定的,集合的长度是可变的:数组用来存放基本类型的数据,集合用来存放对象的引用, ...

  5. java list api_Java核心API -- 6(Collection集合List、Set、ArrayList、HashSet)

    1. Collection集合框架 Java.util.Collection接口 |--List子接口 |--ArrayList实现类 |--LinkedList实现类 |--Vector实现类 |- ...

  6. Java 集合系列(三)Collection 接口

    图片来自网络 public interface Collection<E> extends Iterable<E> 复制代码 前面我们刚刚总结过 Iterable 接口拥有遍历 ...

  7. java基础知识(七)-- 泛型(Generics )

    介绍 用法: List list = new ArrayList();// 1 list .add(new Integer(12));// 2 Integer x = (Integer) list . ...

  8. Java进阶知识笔记2【Collection、泛型】

    [Collection.泛型] 主要内容 Collection集合 迭代器 增强for 泛型 学习目标 能够说出集合与数组的区别 说出Collection集合的常用功能 能够使用迭代器对集合进行取元素 ...

  9. java学习笔记20(Arraylist复习,Collection接口方法,迭代器,增强型for循环)

    集合:集合是Java提供的一种容器,可以用来存储多个数据: 集合与数组的区别:集合的长度是可变的,数组的长度是固定的 集合中存储的数据必须是引用类型数据: ArrayList回顾: public cl ...

最新文章

  1. group by 分组后 返回的是一个同属性的集合
  2. leetcode算法题--爬楼梯
  3. 【android】java.net.ConnectException: localhost/127.0.0.1:8080 - Connection refused
  4. Nancy in .Net Core学习笔记 - 视图引擎
  5. java calendar_Java Calendar getDisplayNames()方法与示例
  6. 求素数算法(C语言)
  7. 【转】健康,运动,习惯
  8. 判断两根线段是否相交
  9. ssh-key生成密钥及SSH无密码登录的配置(转载)
  10. vs不能调试_20200717调试记录(五十四)
  11. 1、win7 scala安装及idea中scala配置
  12. Excel连接到MySQL,将Excel数据导入MySql,MySQL for Excel,,
  13. swagger2 配置访问路径_有了Swagger2 再也不用担心API文档的维护了
  14. Android 开机时间优化
  15. 来听大师讲设计(中)
  16. vue+elementui+自定义Vue-Quill-Editor富文本框(一)
  17. MATLAB程序设计-1.MATLAB简介
  18. LaTeX 对号和错号
  19. 计算机报名无法支付怎么弄,软考官网报名成功了提示不能进行网上支付
  20. FreeMind 思维导图的使用

热门文章

  1. 201807 相关性度量的几种方法-卡方检验、相关系数、信息增益...
  2. web前端【第九篇】JS的DOM对象三
  3. bzoj2190 [SDOI2008]仪仗队(欧拉函数)
  4. 开发错误记录9:Application无法跳转到Activity
  5. 《APUE》中的函数整理
  6. Android系统之Broadcom GPS 移植
  7. 前端页面适配的rem换算
  8. NA-NP-IE系列实验30:CHAP 认证
  9. docker supervisor管理进程
  10. PM2中无法开启ES6的解决方案