3.数据结构

数据结构是计算机存储,组织数据的方式。是指相互之间存在的一种或多种特定关系的数据元素的集合

通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率

---------常见的数据结构之栈

数据进入栈模型的过程称为:压/进栈

数据离开栈模型的过程称为:弹/出栈

栈是一种数据先进后厨的模型

---------常见的数据结构之队列

数据从后端进入队列模型的过程称为:入队列

数据从前端离开队列模型的过程称为:出队列

3.1数据结构之栈和队列【记忆】

  • 栈结构

    先进后出

  • 队列结构

    先进先出

3.2数据结构之数组和链表【记忆】

---------常见的数据结构之数组

数组是一种查询快,增删慢的模型

查询数据通过地址值和索引定位,查询任意数据耗时相同,查询速度快

删除数据时,要将原始数据删除,同时后面的每个数据前移,删除效率低

添加数据时,添加位置后的每个数据后移,在添加元素,添加效率极低

---------常见的数据结构之链表

链表是一种增删快的模型(对比数组)

链表是一种查询慢的模型(对比数组)

查询数据D是否存在,必须从头(head)开始查询

查询第N个数据,必须从头(head)开始查询

  • 数组结构

    查询快、增删慢

  • 队列结构

    查询慢、增删快

4.List集合的实现类

4.1List集合子类的特点【记忆】

  • ArrayList集合

    底层是数组结构实现,查询快、增删慢

  • LinkedList集合

    底层是链表结构实现,查询慢、增删快

package com.itheima.mylistdemo1;

import java.util.Iterator;
import java.util.LinkedList; public class MyLinkedListDemo3 {
public static void main(String[] args) {
LinkedList<String> list=new LinkedList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc"); for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("----------------");
Iterator<String> it=list.listIterator();
while (it.hasNext()){
String next = it.next();
System.out.println(next);
}
System.out.println("----------------");
for (String s : list) {
System.out.println(s);
}
}
}

  

4.2LinkedList集合的特有功能【应用】

  • 特有方法

    方法名 说明
    public void addFirst(E e) 在该列表开头插入指定的元素
    public void addLast(E e) 将指定的元素追加到此列表的末尾
    public E getFirst() 返回此列表中的第一个元素
    public E getLast() 返回此列表中的最后一个元素
    public E removeFirst() 从此列表中删除并返回第一个元素
    public E removeLast() 从此列表中删除并返回最后一个元素
package com.itheima.mylistdemo1;

import java.util.LinkedList;

public class MyLinkedListDemo4 {
public static void main(String[] args) {
LinkedList<String> list=new LinkedList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
//method1(list);
//method2(list);
//method3(list);
method4(list); } public static void method4(LinkedList<String> list) {
//public E removeFirst() 从此列表中删除并返回第一个元素
//public E removeLast() 从此列表中删除并返回最后一个元素
String first = list.removeFirst();
String last = list.removeLast();
System.out.println(first);
System.out.println(last);
System.out.println(list);
} public static void method3(LinkedList<String> list) {
//public E getFirst() 返回此列表中的第一个元素
//public E getLast() 返回此列表中的最后一个元素
String first = list.getFirst();
String last = list.getLast();
System.out.println(first);
System.out.println(last);
} public static void method2(LinkedList<String> list) {
//public void addLast(E e) 将指定的元素追加到此列表的末尾
list.addLast("www");
System.out.println(list);
} public static void method1(LinkedList<String> list) {
//public void addFirst(E e) 在该列表开头插入指定的元素
list.addFirst("sss");
System.out.println(list);
} }

  双向链表实现  ,查询如果离头近就从头开始查 ,如果离尾近就行尾部往前查

5.泛型

5.1泛型概述【理解】

  • 泛型的介绍

    泛型是JDK5中引入的特性,它提供了编译时类型安全检测机制

  • 泛型可以使用的地方: 类后面-----》泛型类      方法声明上---------》泛型方法        接口后面-------》泛型接口
  • 泛型的好处

    1. 把运行时期的问题提前到了编译期间

    2. 避免了强制类型转换

  • 泛型的定义格式

    • <类型>: 指定一种类型的格式.尖括号里面可以任意书写,一般只写一个字母.例如: <E> <T><Q><M>

    • <类型1,类型2…>: 指定多种类型的格式,多种类型之间用逗号隔开.例如: <E,T> <K,V>

5.2泛型类【应用】

  • 定义格式

    修饰符 class 类名<类型> {  }
  • 示例代码

泛型类

public class Generic<T> {  //此处T可以随便写为任意标识,常见的如T,E,K,V 等形式的参数常用于表示泛型
private T t; public T getT() {
return t;
} public void setT(T t) {
this.t = t;
}
}

测试类

public class GenericDemo1 {
public static void main(String[] args) {
Generic<String> g1 = new Generic<String>();
g1.setT("杨幂");
System.out.println(g1.getT()); Generic<Integer> g2 = new Generic<Integer>();
g2.setT(30);
System.out.println(g2.getT()); Generic<Boolean> g3 = new Generic<Boolean>();
g3.setT(true);
System.out.println(g3.getT());
}
}

  总结:

如果一个类的后面又<E>,表示这个类是一个泛型类

创建泛型类的对象时,必须要给这个泛型确定具体的数据类型

5.3泛型方法【应用】

  • 定义格式

    修饰符 <类型> 返回值类型 方法名(类型 变量名) {  }
  • 范例:public <T> void show(T t){    }               被调用的时候才会有具体的类型
  • 示例代码

    • 带有泛型方法的类

package com.itheima.genericityMethod1;

import java.util.ArrayList;
import java.util.Arrays; /*
* 使用java中的泛型方法
* */
public class GenericityMethod1 {
public static void main(String[] args) {
ArrayList<String> list=new ArrayList<>();
list.add("给小李");
list.add("给小张");
list.add("给小王");
//将list集合转成一个数组 并返回
//如果是空参的,那么返回的数组类型为Object类型的
Object[] objects = list.toArray();
System.out.println(Arrays.toString(objects)); String[] strings = list.toArray(new String[list.size()]);
System.out.println(Arrays.toString(strings));
} }

  练习:定义一个泛型方法,传递一个集合和四个元素,将元素添加到集合中并返回  

package com.itheima.genericityMethod1;

import java.util.ArrayList;

/**
* 自定义泛型方法
*   练习:定义一个泛型方法,传递一个集合和四个元素,将元素添加到集合中并返回  
*
* */
public class GenericityMethod2 {
public static void main(String[] args) {
ArrayList<String> list1 = addElement(new ArrayList<String>(), "a", "b", "c", "d");
System.out.println(list1); ArrayList<Integer> list2 = addElement(new ArrayList<Integer>(), 1, 2, 3, 4);
System.out.println(list2); } public static <T>ArrayList<T> addElement(ArrayList<T> list,T t1,T t2,T t3,T t4){
list.add(t1);
list.add(t2);
list.add(t3);
list.add(t4);
return list;
}
}

 

5.4泛型接口【应用】

泛型接口的使用方式:

  实现类也不给泛型

  实现类确定具体的数据类型

  • 定义格式

    修饰符 interface 接口名<类型> {  }
  • 示例代码

    • 泛型接口

      public interface Generic<T> {
         void show(T t);
      }
    • 泛型接口实现类1

      定义实现类时,定义和接口相同泛型,创建实现类对象时明确泛型的具体类型

 

泛型接口:

package com.itheima.genericitinterface;

public interface Genericity<E> {
public abstract void method(E e);
}

泛型接口实现类1

定义实现类时,定义和接口相同泛型,创建实现类对象时明确泛型的具体类型

package com.itheima.genericitinterface;

public class GenericityImpl1<E> implements Genericity<E>{

    @Override
public void method(E e) {
System.out.println(e);
}
}

泛型接口实现类2

定义实现类时,直接明确泛型的具体类型

package com.itheima.genericitinterface;

public class GenericityImpl2 implements Genericity<Integer>{
@Override
public void method(Integer integer) {
System.out.println(integer);
}
}

测试类

package com.itheima.genericitinterface;

public class GenericityInterface {
public static void main(String[] args) {
GenericityImpl1<String> genericity=new GenericityImpl1<>();
genericity.method("小李给我的"); GenericityImpl2 genericityImpl2=new GenericityImpl2();
genericityImpl2.method(16);
}
}

5.5类型通配符

  • 类型通配符: <?>

    • ArrayList<?>: 表示元素类型未知的ArrayList,它的元素可以匹配任何的类型

    • 但是并不能把元素添加到ArrayList中了,获取出来的也是父类类型

  • 类型通配符上限: <? extends 类型>

    • ArrayListList <? extends Number>: 它表示的类型是Number或者其子类型

  • 类型通配符下限: <? super 类型>

    • ArrayListList <? super Number>: 它表示的类型是Number或者其父类型

  • 泛型通配符的使用

  ?super Number

    Number和Number所有的父类,规定了下边界

规定的类型(Number)

  ?extends Number

    Number和Number所有的子类,规定了上边界

      

  

  

  

  

25.数据结构,LinkedList ,泛型,类型通配符的更多相关文章

  1. java里程碑之泛型--类型通配符

    1,泛型与数组在子类上面的对比 在整理java泛型的类型通配符之前,我们先来研究下java在数组设计上的一个不合理.我们来看下面代码: public class Test { public stati ...

  2. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  3. 一起学 Java集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  4. 09 Collection,Iterator,List,listIterator,Vector,ArrayList,LinkedList,泛型,增强for,可变参数,HashSet,LinkedHashSet,TreeSet

    09 Collection,Iterator,List,listIterator,Vector,ArrayList,LinkedList,泛型,增强for,可变参数,HashSet,LinkedHas ...

  5. Java泛型学习笔记 - (七)浅析泛型中通配符的使用

    一.基本概念:在学习Java泛型的过程中, 通配符是较难理解的一部分. 主要有以下三类:1. 无边界的通配符(Unbounded Wildcards), 就是<?>, 比如List< ...

  6. Java泛型之通配符

    原文点此链接 使用通配符的原因:Java中的数组是协变的,但是泛型不支持协变. 数组的协变 首先了解下什么是数组的协变,看下面的例子: Number[] nums = new Integer[10]; ...

  7. JAVA 泛型与通配符的使用

    泛型的本质是参数化类型.即所操作的数据类型被指定为一个参数. 1.jdk 1.5/1.6 必须显式的写出泛型的类型. 2.jdk 1.7/1.8 不必显式的写出泛型的类型. 一.泛型声明 可以用< ...

  8. java 泛型详解(普通泛型、 通配符、 泛型接口)

    java 泛型详解(普通泛型. 通配符. 泛型接口) JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能---- ...

  9. Java泛型和通配符那点事

    泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法 ...

随机推荐

  1. java集合【12】——— ArrayList,LinkedList,Vector的相同点与区别是什么?

    目录 特性列举 底层存储结构不同 线程安全性不同 默认的大小不同 扩容机制 迭代器 增删改查的效率 总结一下 要想回答这个问题,可以先把各种都讲特性,然后再从底层存储结构,线程安全,默认大小,扩容机制 ...

  2. Java例题_17 猴子偷桃问题

    1 /*17 [程序 17 猴子吃桃问题] 2 题目:猴子吃桃问题 3 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 4 第二天早上又将剩下的桃子吃掉一半,又多吃了一个. 5 以后每天 ...

  3. ASP.NET Core依赖注入初识与思考

    文章首发地址 一.前言 在上一篇中,我们讲述了什么是控制反转(IoC)以及通过哪些方式实现的.这其中,我们明白了,控制反转(IoC) 是一种软件设计的模式,指导我们设计出更优良,更具有松耦合的程序,而 ...

  4. 详解php中函数的引用传递和返回 (附代码)

    本篇文章带大家了解一下php的引用,详细介绍一下函数的引用传递和引用返回.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助.php的引用(就是在变量或者函数.对象等前面加上&符号 ...

  5. CQGUI框架之样式管理

    大家好,我是IT文艺男,来自一线大厂的一线程序员 今天给大家讲解基于C++/Qt的CQGUI框架的样式管理实现. 在Qt平台,实现窗口/控件美化或者自定义效果,有如下两种方式 重绘 样式 对于重绘,我 ...

  6. python mac地址计算

    思路是10/16进制的转换和字符串的处理 开始造轮子 1.判断是否是mac地址 正则匹配是否符合条件 1 import re 2 3 def isMac(string): 4 preg = re.co ...

  7. 【2020.8.23NOIP模拟赛】失落

    [ 2020.8.23 N O I P 模 拟 赛 ] 失 落 [2020.8.23NOIP模拟赛]失落 [2020.8.23NOIP模拟赛]失落 题目描述 出题人心情很失落,于是他直接告诉你让你求出 ...

  8. 自动化kolla-ansible部署ubuntu20.04+openstack-victoria单机

    自动化kolla-ansible部署ubuntu20.04+openstack-victoria单机 欢迎加QQ群:1026880196 进行交流学习 一. 环境信息 1. 硬件信息 型号:Dell ...

  9. Day14_82_反射机制输出整个类

    利用反射机制输出整个类 代码实例 import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class Ref ...

  10. 病毒木马查杀实战第012篇:QQ盗号木马之逆向分析

    前言 在本系列的文章中,对每一个病毒分析的最后一个部分,若无特殊情况,我都会采用逆向分析的手段来为读者彻底剖析目标病毒.但是之前的"熊猫烧香"病毒,我用了三篇文章的篇幅(每篇250 ...