导图社区 JAVA
JAVA是一门面对对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,此导图内容包括了collection feature等内容
编辑于2022-06-24 12:31:29JAVA
Feature
代码转换的两个时期
complier
将source code转为byte code(不是机器指令)
interpreter
生成可以被机器执行(理解)的机器指令
平台独立性与便携性
java program是protable的
eg可以轻易的从一台电脑转移到另一台
java program不会随着操作系统,处理器的改变而改变
java字节码和初语的size是机器独立的machine-independent
是一种OO语言
几乎所有东西都是对象
control和data是定义在类和对象中的
xome with extensive set of predefined classes
鲁棒性
提供safeguard
incolorporate exception handling
安全性
验证memory access内存访问
没有virues通过applet被introduced
不允许使用指针
分布式distributed
提供了share data和control over network的能力
处理remote远程对象和local object本地对象的方法一致
多线程
处理多个任务simultaneously
动态和可拓展性
支持用其他语言写的程序(C/C++)
可以动态得与其他类的库链接
native方法在运行时动态link
Basic OO concept
继承
继承只能从类到类
类
是a group of 变量和方法
可以被inherit,derive或者extend another class来define一个新的
当一个类被extend的时候,他的实例变量会隐式成为新类的一部分
这些实例变量可以被调用,即使在新类中没有被定义
JAVA中一个子类只能有一个父类,因为是单继承
这也是继承的限制
基本定义
父类
the class being extended
子类
the class inheriting variable and methods from superclass
继承hierarchy
传递性transitive
在层级中
up的class更加general和abstract
down的class更加specialised和domain specific
Super()
调用父类中的构造函数
必须放在子类中构造函数的第一行
super()中输入必要的参数,和new的的方法一样
override
子类override父类的方法
相同的名字和参数
overload
在同一个类中
名字相同,参数不同
Object类
是所有类的mother,所有类都extends Object
没有显性继承某个类的类,都是object类的子类
主要函数
toString()
equalsclone
接口可以继承接口,但!接口不能extends类,类也不能extends接口你
多态
一个behaviour的多种不同形态
在java中是应用在接口上而不是子类上的
一个类可以被看作它implements的接口的实例
Casting
将一个变量从一个类型convert到另一个类型
写法
animal = cow可以
同理,animal=new cow()也可以
cow=animal编译错误
cow=(Cow)animal运行错误
抽象类与抽象方法
抽象类
只能被extend不能被instantiate
抽象方法
永远不会被调用 never be invoked
任何继承extends了包含抽象方法的类的子类,必须override这个方法
用于保证每个子类都要使用这个方法,常用于你知道胡用这个方法,但没确定具体实现方式
接口
是有0或者更多方法的抽象说明
如果一个类implements了一个接口,那么它可以被看作这个接口的type
特征
没有变量和方法实现
没有variablie
也没有方法体,也就是不能有花括号直接public void eat();
像抽象类但没有任何functionality
一个类可以implements任何数量的接口
一个类必须implement接口中所有的方法
命名方式:首字母大写
Data structure
Array
static list
static
contiguous
sequential
局限性
数组中元素的最大num是受限的
oversized的数组要更大的内存开销
Singly LinkedList
每个元素都有向下一个元素的引用
指向第一个元素的引用allow整个list可以被访问
所有元素都被referenceheld,所以新的element可以轻易的被添加
没有而explicit的上限
可以通过obj的引用build一个链表
单链表
每个element可以hold一个变量来store对下一个对象的引用
Person next就是peson类中的next
null是一个值
三种主要函数
insert
要注意区分头指针为空
find
delete
Recursive function
基本概念
是函数call itself 一次或多次
满足递归属性的函数叫递归函数
必须要有stop condition
任何迭代算法都能被写作递归算法
Generics
为了type safety
可能在多态时出现问题,B继承A,但是在linkedlist<>中,B和A不是同一个类型
通用type
<?>
<Object>也会存在问题
<? extends T>
用泛型的好处
在编译时的extensibility和type安全问题
更多是在用户自定义类
Collection
Collection APi
定义
可拓展的类与接口的集合
一个interface hierarchy的提供了定义好的接口的set来implement data Structure
可以用coleection接口来写自己的数据结构,是java的extensive的很好的例子
一个应用arraylist
通过location进行索引
iterator 接口
基本概念
数据结构如arraylist'会提供迭代器
返回值是在collection中什么时候调用了iterator
用来遍历collection尤其在forloop中
Iterator
为了处理/查找某个值,需要迭代
当迭代器在collection中被调用的时候,返回iterator
与foreach loop不同在于, 迭代器允许对某个collection的modification
符号意义
<T>一种特定的类型
<E>也是一种特定的类型
<?>任何类型
其他的在collection上的操作
sort
利用comperable接口
其中由 compare to函数
Protection
类的访问控制modifier
public
是一个exposed暴露的类的一部分
default
internally support一个类的库
子类不可以是no modifier的
protected
没有protected的类
private
单例?
方法的访问控制modifier
public
no modifier
protected
需要被override的抽象方法
private
变量的访问控制
public
常量或者枚举enumeration
no modifier
break encapulasation尽量避免使用
protected
需要accesssuperclass的子类变量
private
类内部使用
Final修饰符
定义total immutability总的不变性
enforced在complie-time
不允许写,只允许读
静态方法
不恶意access任何instance 变量
如this
也不可以访问类中的变量
package不同的包中的类可以重名
Erlang
Feature7种
High-level construct高级构造
declarative
concurrency process and message passing并发进程和信息传递
每个erlang进程在自己的内存空间执行,并且有自己的heap和stack
无法完全避免死锁
通过消息传递
是asynchronous的
一旦发出消息,这个进程任然可以继续processing,不需要等待回信
scalable,safe,efficient concurrency 大范围的,安全的,高效的并发
erlang虚拟机并不胡为erlang进程创os线程,但是它会在erlang虚拟机(独立于操作系统)中创
对于每一次消息传递,data'都是从一个进程的内存空间到另一个
soft real-time
每个进程都使用garbage collectior
Robustness
有鲁棒核心的库
erlang进程之间可以linked,苏哦一如果有一个crash了,其他的可以选择处理crash或者自己也crash
worker进程可以superivse别的进程,相同的,也会被监督
Distributed computing capability分布式计算能力
进程通过network进行消息传递
Integration and openness
提供和其他语言的interoperation
Basic Erlang
基础数据类型
Integer
decimal
bignums
操作任意大小的num
char
$A=65,$a=97,$\n=10
Floats
Atom
constant lieral常数字元
第一次用之后胡implicitly create
首字母小写
Boolean
Built-in function
运算
div
14 div 5=2
rem
Integer remainder
andalso
orelse
=/=不等于
这两者都是对整数操作
高级数据结构
tuple
用{} curly brace括起来
从1开始
可以包含多种数据类型{”Mikes“,2,{2,1}}
一旦创立后据很难改变
主要函数
tuple_size(tuple)
element(index,tuple)
setelement(index,tuple,newelement)
tuple之间的比较
先比较size再比较大小
List
list更加动态
list中的character由integer表示
[Head|Tail]=tail head头元素,tail--身下的list
tuple和list都不是atom
变量
要以首字母大写!!,小写会被认为是原子
一个变量一旦bound之后就不能变了
f().函数可以清除函数值
但注意括号内要是一个变量,不能是表达式--f(TAil)可以,但f([Head|Tail])不行
函数
组成部分
name
argument
arrow
一系列expression
clause
可以用多条clause写一个函数,每个clause之间用;写完一整个函数后,用点.
引用函数 模块:函数()
module
-module(demo).
-export([double/1]).
demo:double(12).来调用
条件判断
if 条件1->表达式1;条件2->表达式2;条件3->表达式3 end.
表达式3后面不用加标点符号,最后要加end结尾
递归
特性
末尾加点.
主题
JavaScript
是什么
最初用于浏览器,创建动态得交互的用户体验
大部分的web app比如搜索引擎使用js写的
feature
五个特点
Html 网页上的动态modification
对用户输入作出反应
验证用户输入
创建cookies
不需要与服务器进行通信
java和JavaScript的区别
java在虚拟机中跑,二s在web浏览器上
java需要complie, js是直接interpretd的
优点
允许更多动态html网页,包括完整的web应用
缺点
要求js-enabled的浏览器
要求 client 信任服务器
JS可能会引起安全问题,安全性比不上java
Basic JS
变量
是大小写敏感的,一般以数字/特殊符号开头¥“或”_“
变量的scope
let
在函数体内重新定义某个值{},出了函数体后还是原来的值
不支持redeclare的
const
interprter强制的
不可改变的
var
在函数体内重新定义某个值,出了函数体,是重新定义的值
global,updated, redeclare
number
0/0=NaN(not a number)
8*NaN=NaN
8*undefined=NaN
8*null=0
8*[]=0
8*{}=NaN
undefined*null=NaN
Infinity+1=Infinity
自动类型转换
”5“+2=”52“
+会变成字符串
“5”-1=4
**是幂运算
String
单引号双引号都可以
字符串操作
Boolean
NaN!=NaN
NaN是js中唯一一个不等于自身的值,null和undefined甚至都===
5==”5“
true
5===”5“
false
一些空值的T/F
True
[]
{}
false
0
""
NaN
null
undefined
type
可以用typeof variable
空值
typeof null=object
在运算中==0
typeof undefined=undefined
typeof ""=string
typeof NaN=number
object
[1,2,3]
Person={name:'Joe',age:18}
obj中的属性可以通过person.name来访问
operation
comparsion
2>"1"
true
[]==[] {}=={}
都是false
logical operation
2||1=2
1||2=1
如果左右两边都!=0(无论正负),返回左边的值
2&&1=2
1&&2=2
如果左右两边都大于0,返回大的
2||0=0||2=2
2&&0=0&&2=0
Destruct
Object
Array
与erlang的比较
和erlang一样,都不一定需要sametype
但js中的数组更像obj,erlang中的则是primitive type
数组操作
index Of()
push()
shift()
pop a element
length
Map
key-value
get(key)来获得value
set
子主题
Obj
car={type:"Tesla",color:"BLACK"}
for(let key in car) console.log(car[key]);
会输出tesla,black
对于obj内部有函数的
car={type:"Tesla",color:"BLACK",fullname:function(){return "fullname"}}
可以通过console.log(car.fullname())获得”fullname
如果直接car.fullname只会是[funcation:fullname]
JSON
Javascript Object Notation
data是一组键值对
使用逗号隔开的
比如:“student":[{"name":"J","age":10},{"name":"K","age":20}]
Function
函数的返回值!return和{要在一行
函数的返回值可以是其他函数 return getName();
函数可以作为对象的一部分
name:function(){}
arguments.length=参数的个数
arguments[i]第i个参数
省略号...x
如果一个变量a在函数外被定义过,在函数体内部被重新定义,在重新定义之前调用了a,此时a=undefined
函数中变量在定义之前也可以使用
因为将函数declaration move到top of their scope
函数提升hoisting
Arrow function
power=(base,exponent)=>{}
square=x=>x*x;
自执行匿名函数
(function(){console.log("hello,world");})()
作用
不会pollute global namespace
closure
常用作计数器
可以从inner function access 外部函数的作用域
是一个enclosed的函数和引用它的surrounding environment组成,前面的括号形成了一个闭包?在闭包中函数之前定义的var变量--类比全局变量
递归
关键词-this
在一个方法(对象中的函数)中,refer他的owner object
alone或者在function中,refer 全局变量
严格模式下,在函数中,refer undefined
my
严格模式
一定要var,let
不能delete已经赋值的量
this 不会指向全局变量
!this=true
但是在普通模式,this指向全局变量,!this=true
函数的赋值
var f= function g(){return 1;}
g-undefined
f-function
f()-number
Call stack
每当一个函数被调用,她都会被存放在栈顶
High-order
操作其函数的function
Filter
把所有没有通过测试的元素过滤掉
不能作用于空数组
不会改变原本的数组
Map
通过函数transform一个数组
简历新的数组包含转换后的值
新数组和原数组有相同的值
Reduce
重复从数组中取出一个值,并把它combine with curent value (类似合成)
高级的特性
error object
try{} catch(error){console.log(error);}
文件的读写
文件创建
fs=require(“fs”)
从网站上读取内容,写入文件
Promise
只是一种更更好的编程方式,相比回调
Node.js
node.js是一个run-time environment,JS可以在除了浏览器之外的地方run
Libraries
require类似import
./ 前缀会告诉nodejs在当下目录而不是系统路径里查找