专治Java底子差,不要再认为泛型就是一对尖括号了
文章目录
- 一、泛型
- 1.1 泛型概述
- 1.2 集合泛型的使用
- 1.2.1 未使用泛型
- 1.2.2 使用泛型
- 1.3 泛型类
- 1.3.1 泛型类的使用
- 1.2.2 泛型类的继承
- 1.4 泛型方法
- 1.5 泛型通配符
- 1.5.1 通配符的使用
- 1)参数列表带有泛型
- 2)泛型通配符
- 1.5.2 泛型上下边界
- 1.6 泛型的擦除
- 1.6.1 限制擦除
- 1.6.2 泛型的桥接方法
一、泛型
1.1 泛型概述
泛型定义:把类型明确的工作延迟到创建对象或调用方法的时候才去明确的特殊的类型;
例如,我们知道集合是可以存储任意元素的,那么这样一想,add方法上的参数应该是Object(所有类的父类),但是这样会引入一个新的问题,我们知道,子类都是比父类强大的,我们在使用的时候肯定是希望获取的是当初存进去的具体子类对象;因此我们每次都需要进行强制转换;
但add方法真的是Object吗?
查看ArrayList的add方法:
class ArrayList<E>{ public boolean add(E e){ }public E get(int index){ }....
}
Collection类:
public interface Collection<E> extends Iterable<E> {
}
上面的E就是泛型,集合的定义者也不知道我们需要存储什么元素到集合中,具体的类型只能延迟到创建对象时来决定了;
1.2 集合泛型的使用
1.2.1 未使用泛型
定义一个Province对象:
package com.dfbz.demo01;/*** @author lscl* @version 1.0* @intro:*/
public class Province {private String name; // 名称private String shortName; // 简称private String location; // 所属区域public void intro() {System.out.println("名称: " + name + ",简称: " + shortName + ",所属地区: " + location);}@Overridepublic String toString() {return "Province{" +"name='" + name + '\'' +", shortName='" + shortName + '\'' +", location='" + location + '\'' +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getShortName() {return shortName;}public void setShortName(String shortName) {this.shortName = shortName;}public String getLocation() {return location;}public void setLocation(String location) {this.location = location;}public Province() {}public Province(String name, String shortName, String location) {this.name = name;this.shortName = shortName;this.location = location;}
}
测试类:
package com.dfbz.demo01;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;/*** @author lscl* @version 1.0* @intro:*/
public class Demo01_泛型问题引出 {public static void main(String[] args) {Collection list = new ArrayList();// 往集合存储对象list.add(new Province("台湾", "台","华东"));list.add(new Province("澳门", "澳","华南"));list.add(new Province("香港", "港","华南"));list.add(new Province("河北", "冀","华北"));// 获取迭代器Iterator iterator = list.iterator();while (iterator.hasNext()) {// 集合中的元素都被提升为Object对象了Object obj = iterator.next();// 强制转换为子类Province province = (Province) obj;// 调用子类特有的功能province.intro();}}
}
我们没有给泛型进行明确的定义,对象存储到集合中都被提升为Object类型了,取出来时需要强制转换为具体子类,非常麻烦;
不仅如此,这样的代码还存在这隐藏的风险,集合中可以存储任意的对象,如果往集合中存储其他对象呢?
定义个Book对象:
package com.dfbz.demo01;/*** @author lscl* @version 1.0* @intro:*/
public class Book {private String name;private String author;public void detail() {System.out.println("书名: " + name + ",作者: " + author);}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public Book() {}public Book(String name, String author) {this.name = name;this.author = author;}
}
测试类:
package com.dfbz.demo01;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;/*** @author lscl* @version 1.0* @intro:*/
public class Demo02_泛型出现的问题 {public static void main(String[] args) {Collection list = new ArrayList();// 添加几个省份list.add(new Province("山西", "晋","华北"));list.add(new Province("河南", "豫","华中"));list.add(new Province("江西", "赣","华东"));// 添加几本书list.add(new Book("《史记》","司马迁"));list.add(new Book("《三国志》","陈寿"));// 获取迭代器Iterator iterator = list.iterator();while (iterator.hasNext()) {// 集合中的元素都被提升为Object对象了Object obj = iterator.next();// 强制转换为子类Province province = (Province) obj; // 不可以将Book转换为Province(存在隐藏问题)// 调用子类特有的功能province.intro();}}
}
运行结果:
上述代码编译时是没有什么问题,但运行时出现了类型转换异常:ClassCastException
,代码存在一定的安全隐患;
1.2.2 使用泛型
- 查看List源码:
public interface List<E> extends Collection<E> {boolean add(E e);....
}
集合的定义者发现,无法在定义集合类时就确定该集合存储的具体类型,因此使用泛型进行占位,使用者创建集合时明确该泛型的类型;
- 指定泛型后:
class List<Province>{ boolean add(Province province);....
}
Tips:在创建对象时指定泛型的类型,泛型一旦指定了具体的类型,原来泛型的占位符(E),都将变为此类型;
如何指定泛型类类型?
格式如下:
List<泛型的具体类型> list=new ArrayList();
测试类:
package com.dfbz.demo01;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** @author lscl* @version 1.0* @intro:*/
public class Demo03_使用泛型来存储元素 {public static void main(String[] args) {// 创建集合,并确定好泛型(存储的类型)List<Province> list = new ArrayList();// 往集合存储对象list.add(new Province("甘肃", "甘|陇","西北"));list.add(new Province("陕西", "陕|秦","西北"));list.add(new Province("贵州", "贵|黔","西南"));list.add(new Province("云南", "云|滇","西南"));list.add(new Province("四川", "川|蜀","西南"));// 获取City类型的迭代器Iterator<Province> iterator = list.iterator();while (iterator.hasNext()){// 直接获取province类型Province province = iterator.next();province.intro();}}
}
1.3 泛型类
1.3.1 泛型类的使用
很明显,Collection、List、Set以及其下的子类都是泛型类,我们根据使用情况也可以定义泛型类;让泛型类的类型延迟到创建对象的时候指定;
- 使用格式:
修饰符 class 类名<代表泛型的变量> {}
例如,API中的List接口:
class List<E>{ boolean add(E e);....
}
在创建对象的时候确定泛型
例如,List<String> list = new ArrayList<String>();
此时,变量E的值就是String类型,那么我们的类型就可以理解为:
public interface List<String> extends Collection<String> {boolean add(String e);...
}
再例如,ArrayList<Integer> list = new ArrayList<Integer>();
此时,变量E的值就是Integer类型,那么我们的类型就可以理解为:
public interface List<Integer> extends Collection<Integer> {boolean add(Integer e);...
}
举例自定义泛型类:
package com.dfbz.demo01;public class GetClass<P> {// 使用泛型类型,P具体的类型还不明确,等到创建GetClass对象时再明确P的类型private P p;public P getC() {return p;}public void setC(P p) {this.p = p;}
}
使用:
package com.dfbz.demo01;/*** @author lscl* @version 1.0* @intro:*/
public class Demo04_自定义泛型类 {public static void main(String[] args) {// 创建对象,并明确泛型类型为CityGetClass<Province> getClass = new GetClass<>();// setC(Province province)getClass.setC(new Province("新疆","新","西北"));// Province getC()Province province = getClass.getC();province.intro();}
}
1.2.2 泛型类的继承
定义一个父类,带有泛型:
public class 类名<泛型类型> { }
例如,
package com.dfbz.demo01;/*** @author lscl* @version 1.0* @intro:*/
public class Fu<E> {public void show(E e) {System.out.println(e.toString());}
}
使用格式:
- 1)定义类时确定泛型的类型
例如
package com.dfbz.demo01;/*** @author lscl* @version 1.0* @intro: 在定义子类时就确定好泛型的类型*/
public class Zi1 extends Fu<Province> {@Overridepublic void show(Province province) {System.out.println("zi1: " + province);}
}
此时,泛型E的值就是Province类型。
- 2)始终不确定泛型的类型,直到创建对象时,确定泛型的类型
例如
package com.dfbz.demo01;/*** @author lscl* @version 1.0* @intro: 子类也变为泛型类,泛型类型具体到创建对象的时候再确定*/
public class Zi2<P> extends Fu<P> {@Overridepublic void show(P p) {System.out.println("zi2: " + p);}
}
确定泛型:
package com.dfbz.demo01;/*** @author lscl* @version 1.0* @intro:*/
public class Demo05_测试泛型类的继承 {public static void main(String[] args) {// 注意: Zi1类以及不是一个泛型类了,不能够指定泛型
// Zi1<Book> zi1=new Zi1(); // 报错// 创建子类时确定泛型类型Zi2<Province> zi_a = new Zi2<>();zi_a.show(new Province("青海", "青", "西北"));Zi2<Book> zi_b = new Zi2<>();zi_b.show(new Book("《说岳全传》", "钱彩"));}
}
1.4 泛型方法
泛型类是在创建类时定义泛型类型,在创建对象时确定泛型类型;泛型方法则是在创建方法是定义泛型类型,在调用方法时确定泛型类型;
- 定义格式:
修饰符 <代表泛型的变量> 返回值类型 方法名(参数){}
例如:
package com.dfbz.demo01;/*** @author lscl* @version 1.0* @intro:*/
public class GetClassMethod {// 定义泛型方法public <P> P GetClass(P p) {return p;}
}
使用格式:调用方法时,确定泛型的类型
package com.dfbz.demo01;/*** @author lscl* @version 1.0* @intro:*/
public class Demo06_测试泛型方法 {public static void main(String[] args) {GetClassMethod getClassMethod = new GetClassMethod();// Province getClass(Province province)Province province = getClassMethod.GetClass(new Province("西藏", "藏", "西北"));province.intro();// Book getClass(Book book)Book book = getClassMethod.GetClass(new Book("《天龙八部》", "金庸"));book.detail();}
}
1.5 泛型通配符
1.5.1 通配符的使用
1)参数列表带有泛型
泛型在程序运行中全部会被擦除,我们把这种现象称为泛型擦除;但编译时期在使用泛型类进行方法传参时,不仅要匹配参数本身的类型,还要匹配泛型的类型;
Number是所有数值类的父类:
- 定义一个泛型类:
package com.dfbz.泛型通配符;/*** @author lscl* @version 1.0* @intro:*/
public class TestClass<E> {private E e;public E getE() {return e;}public void setE(E e) {this.e = e;}
}
- 测试带有泛型的方法参数列表:
package com.dfbz.泛型通配符;/*** @author lscl* @version 1.0* @intro:*/
public class Demo01_方法参数带有泛型的问题 {public static void main(String[] args) {TestClass<Number> t1 = new TestClass<>();test1(t1);TestClass<Integer> t2 = new TestClass<>();// 符合方法的参数类型(TestClass),但不符合泛型类型(Number),编译报错
// test1(t2);}public static void test1(TestClass<Number> testClass) {// 可以获取具体的泛型对象Number number = testClass.getE();System.out.println("test1...");}/*和上面的方法冲突了,因为泛型在运行期间会被擦除相当于: public static void test1(TestClass testClass)*//*public static void test1(TestClass<Integer> testClass) {System.out.println("test1...");}
*/}
2)泛型通配符
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。
- 示例:
package com.dfbz.泛型通配符;import com.dfbz.demo01.Book;
import com.dfbz.demo01.Province;/*** @author lscl* @version 1.0* @intro:*/
public class Demo02_泛型通配符的使用 {public static void main(String[] args) {TestClass<String> t1 = new TestClass<>();test1(t1);TestClass<Integer> t2 = new TestClass<>();test1(t2);TestClass<Number> t3 = new TestClass<>();test1(t3);TestClass<Province> t4 = new TestClass<>();test1(t4);TestClass<Book> t5 = new TestClass<>();test1(t5);}// ?: 代表可以接收任意泛型public static void test1(TestClass<?> testClass) {// 被?接收的泛型都将提升为ObjectObject obj = testClass.getE();System.out.println("test1...");}
}
Tips:需要注意的是,被<?>接收过的类型都将提升为Object类型;
1.5.2 泛型上下边界
利用泛型通配符?
可以接收任意泛型,但是随之而然带来一个问题,就是所有类型都提升为Object;范围太广了,使用起来非常不方便,因此为了让泛型也可以利用多态的特点,泛型的上下边界的概念由此引出;
利用泛型的通配符可以指定泛型的边界;
泛型的上限:
- 格式: 类型名称
<? extends 类>
对象名称 - 含义: 只能接收该类型及其子类
- 功能: 在使用时,可以使用上边界类来接收泛型类型。因为能够传递进来的都是上边界的子类;因此可以使用上边界类来接收泛型类型;
泛型的下限:
- 格式: 类型名称
<? super 类>
对象名称 - 含义: 只能接收该类型及其父类型
- 功能: 在使用时,只能使用Object类型来接收泛型类型。因为传递进来的必定是下边界的父类,而下边界的父类可以有N多个,因此只能使用Object来接收泛型类型;
可以看到基本数据类型的包装类都是继承与Number类;
- 测试泛型上下边界:
package com.dfbz.泛型通配符;import java.util.ArrayList;
import java.util.Collection;/*** @author lscl* @version 1.0* @intro:*/
public class Demo03_泛型的上下边界 {public static void main(String[] args) {List<A> list1 = new ArrayList();List<B> list2 = new ArrayList();List<C> list3 = new ArrayList();List<Object> list4 = new ArrayList();// method1(list1); // 不能
// method1(list2); // 能
// method1(list3); // 能
// method1(list4); // 不能// method2(list1); // 能
// method2(list2); // 能
// method2(list3); // 不能
// method2(list4); // 能}public static void method1(List<? extends B> list) {// 上边界的好处: 可以使用上边界的对象for (B b : list) {System.out.println(b);}}public static void method2(List<? super B> list) {// 下边界则必须使用Object来接收for (Object obj : list) {System.out.println(obj);}}
}
class A {
}class B extends A {
}class C extends B {
}
1.6 泛型的擦除
Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程称为类型擦除。
1.6.1 限制擦除
泛型在擦除过程中有限制擦除和无限制擦除;
- 有限制擦除:
- 无限制擦除:将泛型类型提升为Object类型
1.6.2 泛型的桥接方法
在接口使用泛型时,在运行期间接口中的泛型也一样会被擦除;
那如果编写了实现类来实现这个泛型接口,实现类中的泛型在运行期间也会被擦除,这样一来就会出现接口的方法并没有在实现类中得到实现:
好在JVM进行了特殊处理,如果我们编写的类实现了一个带有泛型的接口时,在运行期期间JVM会在实现类中帮我们自动的生产一个方法来帮助我们实现泛型接口中被擦除过后的那个方法,这个方法被称为桥接方法;
- 如图所示:
相关文章:
专治Java底子差,不要再认为泛型就是一对尖括号了
文章目录一、泛型1.1 泛型概述1.2 集合泛型的使用1.2.1 未使用泛型1.2.2 使用泛型1.3 泛型类1.3.1 泛型类的使用1.2.2 泛型类的继承1.4 泛型方法1.5 泛型通配符1.5.1 通配符的使用1)参数列表带有泛型2)泛型通配符1.5.2 泛型上下边界1.6 泛型的擦除1.6.1 …...
PayPal轮询收款的那些事儿
想必做跨境电商独立站的小伙伴,对于PayPal是再熟悉不过了,PayPal是一个跨国际贸易的支付平台,对于做独立站的朋友来说跨境收款绝大部分都是依赖PayPal以及Stripe条纹了。简单来说PayPal跟国内的支付宝有点类似,但是PayPal它是跨国…...
【Linux】项目自动化构建工具——make/Makefile
目录 1.make与Makefile的关系 Makefile make 项目清理 clean .PHONY 当我们编写一个较大的软件项目时,通常需要将多个源文件编译成可执行程序或库文件。为了简化这个过程,我们可以使用 make 工具和 Makefile 文件。Makefile 文件可以帮助我们自动…...
成本降低90%,OpenAI正式开放ChαtGΡΤ
今天凌晨,OpenAI官方发布ChαtGΡΤ和Whisper的接囗,开发人员现在可以通过API使用最新的文本生成和语音转文本功能。OpenAI称:通过一系列系统级优化,自去年12月以来,ChαtGΡΤ的成本降低了90%;现在OpenAI用…...
hls.js如何播放m3u8文件(实例)?
HLS(HTTP Live Streaming)是一种视频流传输协议,是苹果推出的适用于iOS与macOS平台的流媒体传输协议。它将视频分割成若干个小段,每个小段大小一般为2~10秒不等,并通过HTTP协议进行传输。通过在每个小段之间插入若干秒…...
大数据平台建设方法论集合
文章目录从0到1建设大数据解决方案大数据集群的方法论数据集成方法论机器学习算法平台方法论BI建设的方法论云原生大数据的方法论低代码数据中台的方法论大数据SRE运维方法论批流一体化建设的方法论数据治理的方法论湖仓一体化建设的方法论数据分析挖掘方法论数字化转型方法论数…...
25- 卷积神经网络(CNN)原理 (TensorFlow系列) (深度学习)
知识要点 卷积神经网络的几个主要结构: 卷积层(Convolutions): Valid :不填充,也就是最终大小为卷积后的大小. Same:输出大小与原图大小一致,那么N 变成了N2P. padding-零填充. 池化层(Subsampli…...
把数组里面数值排成最小的数
问题描述:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{12, 567},则输出这两个能排成的最小数字12567。请给出解决问题的算法,并证明该算法。 思路:先将…...
云his系统源码 SaaS应用 基于Angular+Nginx+Java+Spring开发
云his系统源码 SaaS应用 功能易扩 统一对外接口管理 一、系统概述: 本套云HIS系统采用主流成熟技术开发,软件结构简洁、代码规范易阅读,SaaS应用,全浏览器访问前后端分离,多服务协同,服务可拆分ÿ…...
小红书场景营销怎么做?场景营销主要模式有哪些
小红书作为新兴媒体领域的佼佼者,凭借着生动,直观,代入感等元素的分享推荐收揽了巨额的流量。但是,随着时代的脚步逐渐加快,发展和变革随之涌来,传统的营销已经无法满足。所以场景营销就出现了。今天就来和…...
c++基础——数组
数组数组是存放相同类型对象的容器,数组中存放的对象没有名字,而是要通过其所在的位置访问。数组的大小是固定的,不能随意改变数组的长度。定义数组数组的声明形如 a[b],其中,a 是数组的名字,b 是数组中元素…...
odoo15 登录界面的标题自定义
odoo15 登录界面的标题自定义 原代码中查询:<title>Odoo<title> <html> <head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>Odoo</title><link rel="shortcut icon…...
【内网服务通过跳板机和公网通信】花生壳内网穿透+Nginx内网转发+mqtt服务搭建
问题:服务不能暴露公网 客户的主机不能连外网,服务MQTT服务部署在内网。记做:p1 (computer 1)堡垒机(跳板机)可以连外网,内网IP 和 MQTT服务在同一个网段。记做:p2 (computer 2)对他人而言&…...
【多线程常见面试题】
谈谈 volatile关键字的用法? volatile能够保证内存可见性,强制从主内存中读取数据,此时如果有其他线程修改被volatile修饰的变量,可以第一时间读取到最新的值 Java多线程是如何实现数据共享的? JVM把内存分成了这几个区域: 方法区,堆区,栈区,程序计数器; 其中堆区…...
深度剖析指针(下)——“C”
各位CSDN的uu们你们好呀,今天小雅兰的内容还是我们的指针呀,上两篇博客我们基本上已经把知识点过了一遍,这篇博客就让小雅兰来带大家看一些和指针有关的题目吧,现在,就让我们进入指针的世界吧 复习: 数组和…...
爬虫与反爬虫技术简介
互联网的大数据时代的来临,网络爬虫也成了互联网中一个重要行业,它是一种自动获取网页数据信息的爬虫程序,是网站搜索引擎的重要组成部分。通过爬虫,可以获取自己想要的相关数据信息,让爬虫协助自己的工作,…...
Pag的2D渲染执行流程
Pag的渲染 背景 根据Pag文章里面说的,Pag之前长时间使用的Skia库作为底层渲染引擎。但由于Skia库体积过大,为了保证通用型(比如兼容CPU渲染)做了很多额外的事情。所以Pag的工程师们自己实现了一套2D图形框架替换掉Skiaÿ…...
k8s 概念说明,k8s面试题
什么是Kubernetes? Kubernetes是一种开源容器编排系统,可自动化应用程序的部署、扩展和管理。 Kubernetes 中的 Master 组件有哪些? Kubernetes 中的 Master 组件包括 API Server、etcd、Scheduler 和 Controller Manager。 Kubernetes 中的…...
Docker--(四)--搭建私有仓库(registry、harbor)
私有仓库----registry官方提供registry仓库管理(推送、删除、下载)私有仓库----harbor私有镜像仓库1.私有仓库----registry官方提供 Docker hub官方已提供容器镜像registry,用于搭建私有仓库 1.1 镜像拉取、运行、查看信息、测试 (一) 拉取镜像 # dock…...
Invalid <url-pattern> [sso.action] in filter mapping
Tomcat 8.5.86版本启动web项目报错Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> [sso.action] in filter mapping 查看项目的web.xml文件相关片段 <filter-mapping><filter-name>SSOFilter</filter-name><url-pattern&g…...
【11】linux命令每日分享——useradd添加用户
大家好,这里是sdust-vrlab,Linux是一种免费使用和自由传播的类UNIX操作系统,Linux的基本思想有两点:一切都是文件;每个文件都有确定的用途;linux涉及到IT行业的方方面面,在我们日常的学习中&…...
Newman+Jenkins实现接口自动化测试
一、是什么Newman Newman就是纽曼手机这个经典牌子,哈哈,开玩笑啦。。。别当真,简单地说Newman就是命令行版的Postman,查看官网地址。 Newman可以使用Postman导出的collection文件直接在命令行运行,把Postman界面化运…...
MySQL:事务+@Transactional注解
事务 本章从了解为什么需要事务到讲述事务的四大特性和概念,最后讲述MySQL中的事务使用语法以及一些需要注意的性质。 再额外讲述一点Springboot中Transactional注解的使用。 1.为什么需要事务? 我们以用户转账为例,假设用户A和用户B的银行账…...
数字IC手撕代码--低功耗设计 Clock Gating
背景介绍芯片功耗组成中,有高达 40%甚至更多是由时钟树消耗掉的。这个结果的原因也很直观,因 为这些时钟树在系统中具有最高的切换频率,而且有很多时钟 buffer,而且为了最小化时钟 延时,它们通常具有很高的驱动强度。 …...
易基因|m6A RNA甲基化研究的数据挖掘思路:干货系列
大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。关于m6A甲基化研究思路(1)整体把握m6A甲基化图谱特征:m6A peak数量变化、m6A修饰基因数量变化、单个基因m6A peak数量分析、m6A peak在基因元件上的分布…...
【微信小程序】-- 页面配置(十八)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...
玩好 StarRocks,大厂 offer 接不完!|字节跳动、小红书、京东物流、唯品会、腾讯音乐要的就是你!
求职黄金季即将到来,你准备好迎接你的 dream offer 了吗?StarRocks 自创立以来,一直主张为用户创造极速统一的数据分析新范式,让数据驱动创新,而优秀的大数据人才对推动创新有着至关重要的作用。因此,我们推…...
C# IoC控制反转学习笔记
一、什么是IOC IoC-Invertion of Control,即控制反转,是一种程序设计思想。 先初步了解几个概念: 依赖(Dependency):就是有联系,表示一个类依赖于另一个类。 依赖倒置原则(DIP&a…...
Python解题 - CSDN周赛第33期
本期四道题全考过,题解在网上也都搜得到。。。没有想法,顺手水一份题解吧。 第一题:奇偶排序 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。 输入描述:第一行输入整数n。(1<n<…...
Session攻击
Session攻击Session攻击简介主要攻击方式会话预测会话劫持中间人攻击会话固定Session攻击简介 Session对于Web应用是最重要的,也是最复杂的。对于Web应用程序来说,加强安全性的首要原则就是:不要信任来自客户端的数据,一定要进行数据验证以及…...
如何免费弄一个网站/网站推广的作用在哪里
新建基础软件工程 作者: RootCode 申明:该文档仅供个人学习使用 一、写在前面 目前 Keil 的四款产品(软件):MDK-ARM、C51、C251、C166,在用法上极为相似,包括本文讲述的新建软件工程。 本文以…...
网站建设 青海/seo外包公司专家
其实可以用存储过程,但想用另一种方法实现: 首先创建一个辅助表,可以设置CREATE TABLE t4 (id int(11) NOT NULL AUTO_INCREMENT,num int(11) DEFAULT NULL,PRIMARY KEY (id) )insert into t4(num) select id from xxx limit 31;(偷懒插入31条…...
网页游戏宣传片排行榜/自动app优化下载
VSFTP全称为Very Safe Ftp,可见相对于Linux的其它FTP版本安全性有了很大的提高。<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />本人曾为某一学院创建了一个FTP站点,其中学生只能只读,而教师可以写入。以…...
漯河小学网站建设/湖南靠谱的关键词优化
目录 概述测试环境 安装过程配置启动客户端介绍多级DC的ldif文件的配置 [一]、概述 什么叫LDAP呢,概念的东西这里就不多讲了,网上搜索下有很多,本文的重点是介绍如何在windows平台上安装和配置openLDAP软件。 openLDAP官方网站࿱…...
有做网站代理运营的吗/品牌咨询
我们的疑问是:iPad充电器可以给iPhone充电吗,iPad充电器不能为iPhone充电吗?使用iPad给iPhone充电的危害?用iPhone充电器会损害iPad吗?iPad充电器可以给iPhone快充吗?iPhone用iPad充电器是不是可以的呢&…...
商务网站设计/百度网页版链接
作者:贾春生,http://dwz.win/mygSELECT COUNT( * ) FROM TABLE 是个再常见不过的 SQL 需求了。在 MySQL 的使用规范中,我们一般使用事务引擎 InnoDB 作为(一般业务)表的存储引擎,在此前提下,COUNT( * )操作的时间复杂度…...