Kotlin中的范型和Java中的比较相似,可以参考我的关于介绍Java范型的文章 :
Java范型那些事(一)
Java范型那些事(二)
Java范型那些事(三)
Java范型那些事(四)
在上述博文中,讲述了为什么Java要在1.5版本中引入范型,以及一些有关Java范型的基本知识点。
如果把一个对象分为声明、使用两部分的话。泛型主要是侧重于类型的声明的代码复用,通配符则侧重于使用上的代码复用。泛型用于定义内部数据类型的参数化,通配符则用于定义使用的对象类型的参数化。
使用泛型、通配符提高了代码的复用性。同时对象的类型得到了类型安全的检查,减少了类型转换过程中的错误。
范型和数组的型变
Java中数组是协变的
下面的代码是可以正确编译运行的:
Integer[] ints = new Integer[3];
ints[0] = 0;
ints[1] = 1;
ints[2] = 2;
Number[] numbers = new Number[3];
numbers = ints;
for (Number n : numbers) {
System.out.println(n);
}
在Java中,因为 Integer 是 Number 的子类型,数组类型 Integer[] 也是 Number[] 的子类型,因此在任何需要 Number[] 值的地方都可以提供一个 Integer[] 值。
Java对List泛型不是协变的
也就是说, List 不是 List 的子类型,试图在要求 List 的位置提供 List 是一个类型错误。下面的代码,编译器是会直接报错的:
就算我们使用通配符,这样写:
仍然是报错的。
为什么Number的对象可以由Integer实例化,而ArrayList的对象却不能由ArrayList实例化?list中的声明其元素是Number或Number的派生类,为什么不能add Integer?为了解决这些问题,需要了解Java中的逆变和协变以及泛型中通配符用法。
逆变、协变和不变都是用来描述类型转换(type transformation)后的继承关系,其定义:如果A、B表示类型,f(⋅)表示类型转换,≤表示继承关系(比如,A≤B表示A是由B派生出来的子类)
当A≤B时有f(A)≤f(B)成立,则f(⋅)是协变(covariant)的
当A≤B时有f(B)≤f(A)成立,则f(⋅)是逆变(contravariant)的
当A≤B时上述两个式子均不成立,即f(A)与f(B)相互之间没有继承关系,f(⋅)是不变(invariant)的
协变和逆协变都是类型安全的。
Kotlin的数组不是协变的
abstract class Animal(val size: Int)
class Dog(val cuteness: Int): Animal(100)
class Cat(val terrorFactor: Int): Animal(1)
以下数组编译报错:
val dogArr: Array = arrayOf(Dog(1), Dog(2))
val animalArr: Array = dogArr
和Java的普通对象一样,以下代码可以编译通过:
val dog: Dog = Dog(10)
var animal: Animal = dog
而Kotlin中以如下方式定义一个范型类,然后使用时也会编译报错:
class ReadableList{
}
val dogReadable: ReadableList = ReadableList()
//提示报错,需要ReadableList,但却传了ReadableList
val animalReadable: ReadableList = dogReadable
Kotlin对List泛型是协变的
即以下代码可以编译通过
val dogList: List = listOf(Dog(10), Dog(20))
playAnimal(dogList)
fun playAnimal(animalList: List) {
...
}
如何使Java和Kotlin添加协变和逆变支持
Java中泛型是不变的,可有时需要实现逆变与协变,怎么办呢?这时就需要使用我们之前讲的通配符?
。
在Java和Kotlin中可以通过一定的方式对默认不支持协变的参数类型添加支持。 但是Java和Kotlin这两种语言处理的方式不同:
Java : use-site variance(使用端型变)
Kotlin : declaration-site variance(声明端型变)
可以看出Java使用的是使用端型变,而Kotlin使用的是声明端型变。这两者有什么区别呢?
个人理解就是使用端型变(use-site variance)就是在具体使用(初始化)某一个Class的对象时进行协变。
Java 通过
实现了泛型的协变
List list = new ArrayList<>();
这里的? extends Number
表示的是Number类或其子类,我们简记为C。
这里C <= Number
,这个关系成立:List <= List< Number >
。即有:
List list1 = new ArrayList();
List list2 = new ArrayList();
另外一个例子,具体如下代码所示:
List catList = new ArrayList<>();
List animalList = catList;
可以看到,在我们声明animalList时,对泛型进行了一点修改,使用 ? extends Animal 进行修饰之后,以上代码就可以成功编译并运行了。甚至于我们可以定义一个方法来接受这种参数类型,如下所示:
List cats = new ArrayList<>();
playAnimal(cats);
public static void playAnimal(List animal) {
...
}
编译可以顺利通过, 这样我们的代码可扩展性会更高!
⚠️注意:此时除了null之外,不能往animalList中添加任何Animal子类的对象,即以下代码会报错:
如果可以添加的话,List
里面将会持有各种Number子类型的对象(Byte,Integer,Float,Double等等)。Java为了保护其类型一致,禁止向List添加任意对象,不过可以添加null。
Java 通过
实现了泛型的逆变
List list = new ArrayList<>();
? super Number
通配符则表示的类型下界为Number。即这里的父类型F是? super Number
, 子类型C是Number。即当F <=C , 有f(C) <= f(F) , 这就是逆变。代码示例:
List list3 = new ArrayList();
List list4 = new ArrayList();
list3.add(new Integer(3));
list4.add(new Integer(4));
也就是说,我们不能往List
中添加Number的任意父类对象。但是可以向List添加Number及其子类对象。
PECS:何时使用extends?何时使用super?
Joshua Bloch 称那些你只能从中读取 的对象为生产者 ,并称那些你只能写入 的对象为消费者 。他建议:“为了灵活性最大化,在表示生产者或消费者的输入参数上使用通配符类型 ”,并提出了以下助记符:
PECS 代表生产者-Extens,消费者-Super(Producer-Extends, Consumer-Super)。
注意 :如果你使用一个生产者对象,如 List
,在该对象上不允许调用 add()
或 set()
。但这并不意味着该对象是不可变的 :例如,没有什么阻止你调用 clear()
从列表中删除所有项目,因为 clear()
根本无需任何参数。通配符(或其他类型的型变)保证的唯一的事情是类型安全 。不可变性完全是另一回事。
声明处型变
假设有一个泛型接口 Source
,该接口中不存在任何以 T
作为参数的方法,只是方法返回 T
类型值:
// Java
interface Source {
T nextT();
}
那么,在 Source 类型的变量中存储 Source
实例的引用是极为安全的——没有消费者-方法可以调用。但是 Java 并不知道这一点,并且仍然禁止这样操作:
// Java
void demo(Source strs) {
Source objects = strs; // !!!在 Java 中不允许
// ……
}
为了修正这一点,我们必须声明对象的类型为 Source
,这是毫无意义的,因为我们可以像以前一样在该对象上调用所有相同的方法,所以更复杂的类型并没有带来价值。但编译器并不知道。
在 Kotlin 中,有一种方法向编译器解释这种情况。这称为声明处型变 :我们可以标注 Source
的类型参数 T
来确保它仅从 Source
成员中返回 (生产),并从不被消费。 为此,我们提供 out 修饰符:
interface Source {
fun nextT(): T
}
fun demo(strs: Source) {
val objects: Source = strs // 这个没问题,因为 T 是一个 out-参数
// ……
}
一般原则是:当一个类 C
的类型参数 T
被声明为 out 时,它就只能出现在 C
的成员的输出 -位置,但回报是 C
可以安全地作为 C
的超类。
简而言之,他们说类 C
是在参数 T
上是协变的 ,或者说 T
是一个协变的 类型参数。 你可以认为 C
是 T
的生产者 ,而不是 T
的消费者 。
out 修饰符称为型变注解 ,并且由于它在类型参数声明处提供,所以我们讲声明处型变 。 这与 Java 的使用处型变 相反,其类型用途通配符使得类型协变。
另外除了 out ,Kotlin 又补充了一个型变注释:in 。它使得一个类型参数逆变 :只可以被消费而不可以被生产。逆变类型的一个很好的例子是 Comparable
:
interface Comparable {
operator fun compareTo(other: T): Int
}
fun demo(x: Comparable) {
x.compareTo(1.0) // 1.0 拥有类型 Double,它是 Number 的子类型
// 因此,我们可以将 x 赋给类型为 Comparable 的变量
val y: Comparable = x // OK!
}
我们相信 in 和 out 两词是自解释的(因为它们已经在 C# 中成功使用很长时间了), 因此上面提到的助记符不是真正需要的,并且可以将其改写为更高的目标:
存在性(The Existential) 转换:消费者 in, 生产者 out! :-)
在定义一个类的时候处理, 具体如下所示:
// 使用out关键字
class ReadableList{
}
val dogReadable: ReadableList = ReadableList()
val animalReadable: ReadableList = dogReadable
以上代码跟之前唯一的不同点就是我们在定义ReadableList是对泛型添加了一点限制 out , 然后就可以将dogReadable顺利的赋值给animalReadable对象. 看到这我们应该就能猜到为什么之前Kotlin API中的List<泛型>是支持协变的。
⚠️注意:但是使用out关键字修饰了之后,在ReadableList类内部不可以有以T为参数类型的方法
参考:
https://github.com/EasyKotlin/chapter6_generics
https://huanglizhuo.gitbooks.io/kotlin-in-chinese/content/ClassesAndObjects/Generics.html
深入理解Java与Kotlin的泛型(Generic Type)和型变(Variance)
Kotlin中文网:https://www.kotlincn.net/docs/reference/generics.html
你可能感兴趣的:(Kotlin,Java,Kotlin)
初识redux
未命名小孩
前端知识 react js typescript
Redux是一个用于管理JavaScript应用程序状态的可预测状态容器核心概念1.单一数据源整个应用的状态被存储在一个单一的对象树(store)中,这个对象树位于唯一的store里。创建store:conststore=createStore(reducer)2.状态是只读的唯一改变状态的方法是触发一个action,action是一个描述状态变化的纯对象。这保证了所有的状态变化都是可追踪的。一个
题解 | #数组中出现次数超过一半的数字#哈希最简单的解法
2301_79125642
java
前端要转测试大佬们,我是软件工程专业的,毕业后又培训了半年前端,现在公司要我转软件测试,初中级都可以,学着麻烦吗?大概得多长时间?转转java凉面一个数组基本有序应该采用哪种排序方法为什么要有线程池,线程太多会怎么样??阻塞队列与普通队列的区别是?递归与非递归区别是什么?各自的优缺点?递归如何转为非递归题解|#数组中出现次数超过一半的数字#哈希最简单的解法classSolution{public:
如果 main 里面引入 axios ,然后引入 router ,而 router 里面也引入 axios,会不会重复
清风细雨_林木木
技术点 javascript 前端 开发语言
技术点备忘如果main里面引入axios,然后引入router,而router里面也引入axios,会不会重复不会重复的。虽然你在main中引入了axios,并且在router中也引入了axios,但引入的axios是同一个模块。JavaScript的模块系统是基于单例模式的,意思是每个模块只会被加载一次,之后的引用都会指向同一个实例。具体来说:当你在main.js中引入axios,它会在模块加载
【JVM系列】谈一谈JVM调优
goyeer(工蚁)
# JVM JAVA jvm
文章目录一、JVM调优概述二、JVM调优目标三、JVM定位瓶颈四、JVM内存调优1.调整堆内存大小2.调整新生代与老年代比例3.元空间(Metaspace)调优五、垃圾回收(GC)调优**1.选择合适的GC算法****2.优化GC参数**3.启用GC日志六、线程与锁优化七、调优后的验证八、注意事项一、JVM调优概述JVM调优是优化Java应用程序性能的关键环节,目的是通过调整JVM参数、优化垃圾回
基于Java的自助多张图片合成拼接实战
夜郎king
java Java多图片合成 Java图片合成实战
目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前言在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用。从社交媒体到电子商务,从在线教育到虚拟现实,图像的展示和处理方式直接影响着用户体验和信息传递的效率。而图片合成拼接技术作为图像处理中的一个重要分支,其应用范围广泛,需求也日益增长。在实际开发中,图片合成拼接的需求多
Python之json模块的序列化和反序列化
如梦@_@
python基础
序列化:可以理解为压缩反序列化:可以理解为解压Python中序列化和反序列化其实就是一个正反两个过程。序列化就是将Python对象转化为json格式,因为Python对象只有Python语言能够识别,如果想把数据发给Java代码写的程序,那么就识别不了,所以就有一个中间的格式:json,Java中也是一样,就是将Java的数据类型转换成json格式。反序列化就是,Python接收数据的应该是Pyt
java使用递归获取geojson(json)数据
迷茫的小猿
java java json
需要导入的包:org.json-chargebee-1.0.jarpackageparse;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;importjava.util.Arra
阅读Android源码的一些姿势
weixin_34405332
2019独角兽企业重金招聘Python工程师标准>>>前面吐槽了有没有必要阅读Android源码,后面觉得只吐槽不太好,还是应该多少弄点干货。需要说明的是,Android每个系统版本的源码都会有变动,而且代码中时不时Java和Native互相穿插,追求完全看透源码意义不大,把目的定在“理解代码设计的思路,弄清各个生命周期方法调用的顺序”比较实际。日常开发中怎么阅读源码找到正确的源码IDE是日常经常
空间数据存储格式GeoJSON
guokanglun
WebGIS开发 前端
GeoJSON是一种用于表示地理信息的开放标准格式,广泛用于存储和交换地理空间数据。它基于JSON格式,因此易于理解和处理,尤其适用于Web和JavaScript环境中的地图应用。GeoJSON支持多种地理信息类型,如点、线、面、坐标系统等。GeoJSON基本结构GeoJSON文件本质上是一个JSON对象,通常包含以下几个主要部分:type:指定GeoJSON数据的类型。features:一个包含
java面试题:多线程交替打印数字
小猫猫猫◍˃ᵕ˂◍
java python 开发语言
面试题:多线程交替打印数字代码概述这个Java程序使用了三个线程(t1,t2,t3)和三个信号量(first,second,third)来实现交替打印数字1、2、3的功能。每个线程负责打印一个数字,并通过信号量来控制线程的执行顺序。代码结构信号量初始化:first,second,third三个信号量分别用于控制三个线程的执行顺序。初始时,first信号量的许可数为0,表示t1线程需要等待。线程定义
使用 Shiro 和 JPA 结合 MySQL 实现一个简易权限管理系统
Java猿_
mysql 数据库
1.项目设置首先,确保你的项目已经配置好Maven或Gradle依赖管理工具,并添加以下依赖:Maven依赖org.apache.shiroshiro-core1.9.0org.apache.shiroshiro-web1.9.0org.springframework.bootspring-boot-starter-data-jpamysqlmysql-connector-java8.0.26or
如何在Python中进行JSON数据的序列化和反序列化?
计算机学长大白
python python 开发语言
在Python中,JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Python内置的json模块提供了简单易用的方法来实现数据的序列化和反序列化。下面将详细介绍如何在Python中进行JSON数据的序列化和反序列化,并给出具体的示例。1.序列化序列化是指将Python对象转换为JSON格式的字符串。json模块提供
Java 实现 Redis中的GEO数据结构
潇凝子潇
java redis 数据结构
Java实现Redis中的GEO数据结构LBS(基于位置信息服务(Location-BasedService,LBS))应用访问的数据是和人或物关联的一组经纬度信息,而且要能查询相邻的经纬度范围,GEO就非常适合应用在LBS服务的场景中importjava.util.ArrayList;importjava.util.List;//定义一个表示地理位置的类,用于存储地理位置的相关信息publicc
JAVA和Python的区别
草莓味的¥猪
语言 java python 开发语言
一、整体区别语法结构:Java是一种面向对象的编程语言,采用了类和对象的概念,需要使用大括号“{}”来定义代码块和方法。而Python是一种动态类型的编程语言,使用缩进来表示代码块的层级结构,不需要显式地定义类和对象。编程范式:Java是一种静态类型的编程语言,需要在编译时进行类型检查,并且必须声明变量的数据类型。Python是一种动态类型的编程语言,变量的数据类型是根据赋值而确定的,不需要显式声
LeetCode 第 211 场周赛 (哈希表、字符串(取模、枚举)、排序+最长上升子序列和、筛法求约数+并查集)
2401_84046816
程序员 leetcode 散列表 面试
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!for(inti=0;i
Java8适配的markdown转换html工具(FlexMark)
星极天下第一
前端 Java html 前端 java
坐标地址:com.vladsch.flexmarkflexmark-all0.60.0工具类代码:importcom.vladsch.flexmark.ext.tables.TablesExtension;importcom.vladsch.flexmark.ext.toc.TocExtension;importcom.vladsch.flexmark.html.HtmlRenderer;impo
如何在Java中设计大规模稀疏数据处理架构
省赚客app开发者
java 架构 开发语言
如何在Java中设计大规模稀疏数据处理架构大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在大数据时代,稀疏数据在各个领域变得越来越常见,例如推荐系统、自然语言处理、图像处理等。稀疏数据通常包含大量零值或空值,直接使用传统的数据处理架构可能导致效率低下,内存和计算资源浪费。因此,设计一个高效的稀疏数据处理架构成为Java开发者面临的关键挑战。本文将探讨如何在Java中
leaflet手绘地图实现原理-可视化工具设计手绘地图
diygwcom
leaflet 手绘地图 自定义地图瓦片
在Leaflet中实现手绘地图并添加自定义标注是一个有趣且实用的功能。Leaflet是一个开源的JavaScript库,用于在网页上创建交互式地图。下面是一个基本的实现步骤,包括如何加载手绘地图和添加自定义标注。步骤1:设置HTML页面首先,创建一个基本的HTML页面,并引入Leaflet库。Leaflet手绘地图与自定义标注#map{height:100vh;}//JavaScript代码将在这
Java中代码的执行顺序(Java基础)
Java搬码工
javaSE java
在Java里,不同类型代码有着特定的执行顺序,理解这些顺序对掌握程序运行逻辑十分关键。下面将详细阐述Java中不同类型代码(静态代码块、实例代码块、构造方法、静态变量、实例变量、静态方法、实例方法等)的执行顺序。单类中的代码执行顺序当只有一个类时,代码执行顺序通常为:静态变量初始化、静态代码块、实例变量初始化、实例代码块、构造方法。classSingleClassExample{//静态变量sta
CentOS重装Java
GitIDEA
centos java linux
查看java的安装信息rpm-qa|grepjavarpm-e--nodepsjava-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64验证java--version重装Centos7安装JDK21、配置环境变量1.下载jdk21安装包1.进入Oracle官网:https://www.oracle.com/2.点击Products->向下拉点击Java->右上角
【含文档+PPT+源码】基于微信小程序的乡村振兴民宿管理系统
小咕聊编程
微信小程序 小程序
项目介绍本课程演示的是一款基于微信小程序的乡村振兴民宿管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料2.带你从零开始部署运行本套系统3.该项目附带的源码资料可作为毕设使用民宿管理系统的重要核心功能包括用户管理、客房管理、客房评价管理、订单管理、首页轮播图管理和商家管理等,以下为项目功能模块图:技术栈
Java 后端面试必备:Java 中 == 和 equals 有什么区别
刘小炮吖i
Java后端开发面试题 面试 java
欢迎并且感谢大家指出我的问题,由于本人水平有限,有些内容写的不是很全面,只是把比较实用的东西给写下来,如果有写的不对的地方,还希望各路大牛多多指教!谢谢大家!大家如果对Java后端面试题感兴趣可以关注一下面试题专栏引言在Java后端开发的面试中,“Java中==和equals有什么区别”是一个高频问题。虽然这看似基础,但其中蕴含的原理和细节,对于深入理解Java的内存管理和对象比较机制至关重要。接
java 反射创建对象作用_java反射机制(原理/应用场景/创建对象)详解
文艺范理工生
java 反射创建对象作用
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有
JMM
java
章三JMM本文是JVM系列第三篇,主要描述java内存模型,包括原子操作、指令重排序、可见性、有序性等相关内容,是java并发编程核心原理与基础章三JMMJMM介绍JMM介绍JMM是java提供的抽象模型,描述了在多线程环境中,主内存和工作内存的交互,主要目标是屏蔽硬件和操作系统的差异。主内存:主内存用来存储所有共享变量工作内存:线程独享内存,类似cpu缓存,线程从主内存读取共享变量到工作内存,或
详解CountDownlatch
优人ovo
java 开发语言
引言CountDownLatch是Java并发包java.util.concurrent中的一个同步工具类,由著名的并发编程大师DougLea所开发。它允许一个或多个线程等待其他线程完成操作后再继续执行,其核心思想是通过一个计数器,对计数器进行调度来实现原理CountDownLatch初始化时会设置一个计数器的值,该值表示需要等待完成的操作数量。每当一个线程完成了自己的任务后,会调用countDo
[1138]基于JAVA的安全监管网络人员信息智慧管理系统的设计与实现
阿鑫学长【毕设工场】
java 网络 开发语言 课程设计 毕业设计
毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的安全监管网络人员信息智慧管理系统的设计与实现指导老师(一)选题的背景和意义选题背景与意义:随着信息技术的飞速发展和大数据时代的到来,安全监管网络人员信息管理面临着前所未有的挑战与机遇。当前,执法人员、监督员以及各类从业人员的信息档案管理工作日益繁重,传统的人工管理模式效率低下、易出错且难以满足实时更新、精准查询的需求。特别是在复杂的执法环
[0750]基于JAVA的卫生监管智慧管理系统的设计与实现
阿鑫学长【毕设工场】
java 人工智能 开发语言 课程设计 毕业设计
毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的卫生监管智慧管理系统的设计与实现指导老师(一)选题的背景和意义在当前我国卫生监管体系快速发展的背景下,信息化、智能化已成为提升监管效能和公共服务质量的关键手段。随着各类医疗卫生机构数量的增长和服务范围的拓宽,传统的管理模式已难以满足日益复杂的监管需求,尤其是在数据处理、权限控制、事件响应、知识更新、培训考核、任务调度、记录追踪等方面存在明
学C++还是学Java?做软件研发还需掌握哪些知识和技能?_c+
2401_84160087
程序员 c++ java c语言
1.1、Java和C++都很有前途1.2、Java的应用领域与使用场景1.3、C++的应用领域与使用场景1.4、如何选择2、需要掌握的知识和技能2.1、掌握一些基础的网络知识2.2、熟悉一些常用的SQL语句2.3、了解Linux系统,掌握常用的Linux命令2.4、学习汇编语言相关的内容2.5、学习一些其他的专业课程3、最后最近和一些高校的学生朋友交流,他们打算毕业后从事软件研发的工作,但目前有些
Java和SQL测试、性能监控中常用工具
2301_79306982
java sql selenium 单元测试 压力测试 集成测试
下面我会详细列举一些在Java和SQL测试、调试、性能监控中常用的工具,并结合项目中提到的各个技术点说明如何选择合适的工具和方法。一、Java项目常用的测试、调试与性能监控工具单元测试与集成测试:JUnit/TestNG:用于编写单元测试和集成测试。比如在SpringBoot项目中,可以使用JUnit对各个服务进行功能测试。Mockito:用于模拟依赖项,帮助隔离单元测试时的环境。静态代码分析:S
html+css网页设计,我的网站
软件技术NINI
html/css笔记 javascript html css
一、技术简介HTML:超文本标记语言(HyperTextMarkupLanguage),用于创建网页的基本结构和内容。CSS:层叠样式表(CascadingStyleSheets),用于设置网页的样式和布局,包括字体、颜色、边距、对齐方式等。JavaScript:一种用于创建动态和交互式网页的脚本语言。通过JavaScript,可以实现网页的动画效果、表单验证、数据交互等功能。二、创建多页网站的基
辗转相处求最大公约数
沐刃青蛟
C++ 漏洞
无言面对”江东父老“了,接触编程一年了,今天发现还不会辗转相除法求最大公约数。惭愧惭愧!
为此,总结一下以方便日后忘了好查找。
1.输入要比较的两个数a,b
忽略:2.比较大小(因为后面要的是大的数对小的数做%操作)
3.辗转相除(用循环不停的取余,如a%b,直至b=0)
4.最后的a为两数的最大公约数
&
F5负载均衡会话保持技术及原理技术白皮书
bijian1013
F5 负载均衡
一.什么是会话保持? 在大多数电子商务的应用系统或者需要进行用户身份认证的在线系统中,一个客户与服务器经常经过好几次的交互过程才能完成一笔交易或者是一个请求的完成。由于这几次交互过程是密切相关的,服务器在进行这些交互过程的某一个交互步骤时,往往需要了解上一次交互过程的处理结果,或者上几步的交互过程结果,服务器进行下
Object.equals方法:重载还是覆盖
Cwind
java generics override overload
本文译自StackOverflow上对此问题的讨论。
原问题链接
在阅读Joshua Bloch的《Effective Java(第二版)》第8条“覆盖equals时请遵守通用约定”时对如下论述有疑问:
“不要将equals声明中的Object对象替换为其他的类型。程序员编写出下面这样的equals方法并不鲜见,这会使程序员花上数个小时都搞不清它为什么不能正常工作:”
pu
初始线程
15700786134
暑假学习的第一课是讲线程,任务是是界面上的一条线运动起来。
既然是在界面上,那必定得先有一个界面,所以第一步就是,自己的类继承JAVA中的JFrame,在新建的类中写一个界面,代码如下:
public class ShapeFr
Linux的tcpdump
被触发
tcpdump
用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支 持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
实用命令实例
默认启动
tcpdump
普通情况下,直
安卓程序listview优化后还是卡顿
肆无忌惮_
ListView
最近用eclipse开发一个安卓app,listview使用baseadapter,里面有一个ImageView和两个TextView。使用了Holder内部类进行优化了还是很卡顿。后来发现是图片资源的问题。把一张分辨率高的图片放在了drawable-mdpi文件夹下,当我在每个item中显示,他都要进行缩放,导致很卡顿。解决办法是把这个高分辨率图片放到drawable-xxhdpi下。
&nb
扩展easyUI tab控件,添加加载遮罩效果
知了ing
jquery
(function () {
$.extend($.fn.tabs.methods, {
//显示遮罩
loading: function (jq, msg) {
return jq.each(function () {
var panel = $(this).tabs(&
gradle上传jar到nexus
矮蛋蛋
gradle
原文地址:
https://docs.gradle.org/current/userguide/maven_plugin.html
configurations {
deployerJars
}
dependencies {
deployerJars "org.apache.maven.wagon
千万条数据外网导入数据库的解决方案。
alleni123
sql mysql
从某网上爬了数千万的数据,存在文本中。
然后要导入mysql数据库。
悲剧的是数据库和我存数据的服务器不在一个内网里面。。
ping了一下, 19ms的延迟。
于是下面的代码是没用的。
ps = con.prepareStatement(sql);
ps.setString(1, info.getYear())............;
ps.exec
JAVA IO InputStreamReader和OutputStreamReader
百合不是茶
JAVA.io操作 字符流
这是第三篇关于java.io的文章了,从开始对io的不了解-->熟悉--->模糊,是这几天来对文件操作中最大的感受,本来自己认为的熟悉了的,刚刚在回想起前面学的好像又不是很清晰了,模糊对我现在或许是最好的鼓励 我会更加的去学 加油!:
JAVA的API提供了另外一种数据保存途径,使用字符流来保存的,字符流只能保存字符形式的流
字节流和字符的难点:a,怎么将读到的数据
MO、MT解读
bijian1013
GSM
MO= Mobile originate,上行,即用户上发给SP的信息。MT= Mobile Terminate,下行,即SP端下发给用户的信息;
上行:mo提交短信到短信中心下行:mt短信中心向特定的用户转发短信,你的短信是这样的,你所提交的短信,投递的地址是短信中心。短信中心收到你的短信后,存储转发,转发的时候就会根据你填写的接收方号码寻找路由,下发。在彩信领域是一样的道理。下行业务:由SP
五个JavaScript基础问题
bijian1013
JavaScript call apply this Hoisting
下面是五个关于前端相关的基础问题,但却很能体现JavaScript的基本功底。
问题1:Scope作用范围
考虑下面的代码:
(function() {
var a = b = 5;
})();
console.log(b);
什么会被打印在控制台上?
回答:
上面的代码会打印 5。
&nbs
【Thrift二】Thrift Hello World
bit1129
Hello world
本篇,不考虑细节问题和为什么,先照葫芦画瓢写一个Thrift版本的Hello World,了解Thrift RPC服务开发的基本流程
1. 在Intellij中创建一个Maven模块,加入对Thrift的依赖,同时还要加上slf4j依赖,如果不加slf4j依赖,在后面启动Thrift Server时会报错
<dependency>
【Avro一】Avro入门
bit1129
入门
本文的目的主要是总结下基于Avro Schema代码生成,然后进行序列化和反序列化开发的基本流程。需要指出的是,Avro并不要求一定得根据Schema文件生成代码,这对于动态类型语言很有用。
1. 添加Maven依赖
<?xml version="1.0" encoding="UTF-8"?>
<proj
安装nginx+ngx_lua支持WAF防护功能
ronin47
需要的软件:LuaJIT-2.0.0.tar.gz nginx-1.4.4.tar.gz &nb
java-5.查找最小的K个元素-使用最大堆
bylijinnan
java
import java.util.Arrays;
import java.util.Random;
public class MinKElement {
/**
* 5.最小的K个元素
* I would like to use MaxHeap.
* using QuickSort is also OK
*/
public static void
TCP的TIME-WAIT
bylijinnan
socket
原文连接:
http://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux.html
以下为对原文的阅读笔记
说明:
主动关闭的一方称为local end,被动关闭的一方称为remote end
本地IP、本地端口、远端IP、远端端口这一“四元组”称为quadruplet,也称为socket
1、TIME_WA
jquery ajax 序列化表单
coder_xpf
Jquery ajax 序列化
checkbox 如果不设定值,默认选中值为on;设定值之后,选中则为设定的值
<input type="checkbox" name="favor" id="favor" checked="checked"/>
$("#favor&quo
Apache集群乱码和最高并发控制
cuisuqiang
apache tomcat 并发 集群 乱码
都知道如果使用Http访问,那么在Connector中增加URIEncoding即可,其实使用AJP时也一样,增加useBodyEncodingForURI和URIEncoding即可。
最大连接数也是一样的,增加maxThreads属性即可,如下,配置如下:
<Connector maxThreads="300" port="8019" prot
websocket
dalan_123
websocket
一、低延迟的客户端-服务器 和 服务器-客户端的连接
很多时候所谓的http的请求、响应的模式,都是客户端加载一个网页,直到用户在进行下一次点击的时候,什么都不会发生。并且所有的http的通信都是客户端控制的,这时候就需要用户的互动或定期轮训的,以便从服务器端加载新的数据。
通常采用的技术比如推送和comet(使用http长连接、无需安装浏览器安装插件的两种方式:基于ajax的长
菜鸟分析网络执法官
dcj3sjt126com
网络
最近在论坛上看到很多贴子在讨论网络执法官的问题。菜鸟我正好知道这回事情.人道"人之患好为人师" 手里忍不住,就写点东西吧. 我也很忙.又没有MM,又没有MONEY....晕倒有点跑题.
OK,闲话少说,切如正题. 要了解网络执法官的原理. 就要先了解局域网的通信的原理.
前面我们看到了.在以太网上传输的都是具有以太网头的数据包.
Android相对布局属性全集
dcj3sjt126com
android
RelativeLayout布局android:layout_marginTop="25dip" //顶部距离android:gravity="left" //空间布局位置android:layout_marginLeft="15dip //距离左边距
// 相对于给定ID控件android:layout_above 将该控件的底部置于给定ID的
Tomcat内存设置详解
eksliang
jvm tomcat tomcat内存设置
Java内存溢出详解
一、常见的Java内存溢出有以下三种:
1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出JVM在启动的时候会自动设置JVM Heap的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)不可超过物理内存。
可以利用JVM提
Java6 JVM参数选项
greatwqs
java HotSpot jvm jvm参数 JVM Options
Java 6 JVM参数选项大全(中文版)
作者:Ken Wu
Email: ken.wug@gmail.com
转载本文档请注明原文链接 http://kenwublog.com/docs/java6-jvm-options-chinese-edition.htm!
本文是基于最新的SUN官方文档Java SE 6 Hotspot VM Opt
weblogic创建JMC
i5land
weblogic jms
进入 weblogic控制太
1.创建持久化存储
--Services--Persistant Stores--new--Create FileStores--name随便起--target默认--Directory写入在本机建立的文件夹的路径--ok
2.创建JMS服务器
--Services--Messaging--JMS Servers--new--name随便起--Pers
基于 DHT 网络的磁力链接和BT种子的搜索引擎架构
justjavac
DHT
上周开发了一个磁力链接和 BT 种子的搜索引擎 {Magnet & Torrent},本文简单介绍一下主要的系统功能和用到的技术。
系统包括几个独立的部分:
使用 Python 的 Scrapy 框架开发的网络爬虫,用来爬取磁力链接和种子;
使用 PHP CI 框架开发的简易网站;
搜索引擎目前直接使用的 MySQL,将来可以考虑使
sql添加、删除表中的列
macroli
sql
添加没有默认值:alter table Test add BazaarType char(1)
有默认值的添加列:alter table Test add BazaarType char(1) default(0)
删除没有默认值的列:alter table Test drop COLUMN BazaarType
删除有默认值的列:先删除约束(默认值)alter table Test DRO
PHP中二维数组的排序方法
abc123456789cba
排序 二维数组 PHP
<?php/*** @package BugFree* @version $Id: FunctionsMain.inc.php,v 1.32 2005/09/24 11:38:37 wwccss Exp $*** Sort an two-dimension array by some level
hive优化之------控制hive任务中的map数和reduce数
superlxw1234
hive hive优化
一、 控制hive任务中的map数: 1. 通常情况下,作业会通过input的目录产生一个或者多个map任务。 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改);2.
Spring Boot 1.2.4 发布
wiselyman
spring boot
Spring Boot 1.2.4已于6.4日发布,repo.spring.io and Maven Central可以下载(推荐使用maven或者gradle构建下载)。
这是一个维护版本,包含了一些修复small number of fixes,建议所有的用户升级。
Spring Boot 1.3的第一个里程碑版本将在几天后发布,包含许多