基础知识

210 阅读15分钟

Basic

数字常量池(byte):-128~127,在此区间直接拿,不会new,只针对整型,这是一个循环,即:127+1=-128
+= 操作符会进行隐式自动类型转换

自动装箱:底层调用:Interger.valueOf(int ..)
自动拆箱: 底层调用:new Integer(int ..).intValue()

switch..case:为了防止case穿透,每一个case后面都要加上一个break
continue:用于终止某次循环过程,跳过循环体中continue语句下面未执行的循环,开始下一次循环
break只能用于switch和循环语句中;continue只能用于循环中

数组.length; 字符串.length(); 集合.size()

DateFormat.parse(字符串):将字符串转换成日期对象
DateFormat.format(日期) :将日期对象格式化成字符串

Iterator迭代器用于访问集合,可用于迭代ArrayListHashSet(基于HashMap来实现的)等集合,hasNext(),next()

构造器Constructor不能被继承,因此不能重写override,但可以被重载overload

局部变量前不能放置任何访问修饰符 (private,public,和 protected)。
final 可以用来修饰局部变量(lambda局部变量必须是final)

union all 比 union(去重)效率高,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用union all

java中四种创建对象的方式:new创建新对象;通过反射机制;采用clone机制;通过序列化机制
    
序列化:就是把对象转换成二进制字节数组,可以存磁盘,通过网络传输来达到持久化的目的;
Transient:Java关键字,变量修饰符,表示不能被序列化,当对象存储时,它的值不需要维持
    
StringStringBufferStringBuilder三个类都是被final修饰,类不能被继承
    
String:是不可变的字符数组,增删改都会创建新的对象,效率低,但线程安全,重写了equals和hashcode方法
StringBuffer:可变的字符数组,transient修饰的成员变量,synchronized修饰的append方法,保证线程安全,添加的不会创建新的对象,有一定的缓冲区容量,没有重写equals和hashcode方法
StringBuilder:可变的字符数组,线程不安全,但效率高,没有重写equals和hashcode方法
   
String s="a"+"b"+"c"+"d";共创建了几个对象
1个,原因是代码被编译器优化后,相当于直接定义了一个"abcd"的字符串
                                        
8种基本类型的包装类都默认是final修饰,都重写了equals方法
Object类中的equals方法用于比较两个对象的地址值是否相等,底层就是用==号进行判断。
   对象之间比较地址值是没有意义的。子类一般会重写equals方法比较成员变量值是否相等
   48种基本数据类型
   逻辑:boolean - 1个字节,占8位
   文本:char    - 2个字节
   整型:byte    - 1个字节
	 short   - 2个字节
	 int     - 4个字节
	 long    - 8个字节 超出int范围,长整型,需要加l/L
   浮点:float   - 4个字节 浮点数默认时double,需要加f/F
	 double  - 8个字节
	  
容量小的类型自动转换为容量大的数据类型
byte,short,char->int->long->float->double
byte,short,char之间不会互相转换,他们三者在计算时会自动转换成int
容量大的类型转换为容量小的类型,要加上强转,但可能会造成精度降低或溢出
引用数据类型: 类(class),接口(interface),数组([])
   
Overload:方法名相同,参数列表不同(数量,类型,顺序),与返回值类型以及抛出异常无关
Override:参数列表,返回值类型,方法名都相同。方法访问权限必须大于等于父类,抛出异常类型范围不能大于父类。
子类重写父类的方法,子类方法的返回值类型可以是父类方法的返回值类型的子类。如:父类返回值类型为Object,子类可   以是String,可以是任何类(java中Object是所有类的父类)
声明为final,static和private的方法不能被重写;

Java三大特性
封装:隐藏细节,数据安全,成员变量和方法私有化,提供对外的公有方法
继承:子类可以继承父类的非私有属性和方法,并对其进行扩展;Java中类只有单继承,没有多继承;接口之间可以多继承
多态:同一种类型的对象执行同一个方法时可以表现出不同的行为特征。
每个子类对象的内部都有一块儿父类的空间,父类空间不是共享的,即子类是不会影响父类的(变量和方法都不影响)
   多态的体现形式:继承/实现,父类引用指向子类对象,重写(不重写父类的方法不会报错,但没有意义)
   多态的引用就是向上转型(向上一定是安全的): 父类名称 对象名 = new 子类名称(); 
   向下转型的注意点:最多只能向下转成本身,不能转成其他类,即使是其子类也不行。 
      
   JAVA访问变量采用就近原则,局部变量与成员变量重名时,局部变量比较近,使用局部变量
   通过this关键字可以明确地去访问一个类的成员变量,解决与局部变量名称冲突问题。
      
   形参:出现在函数定义中,只在函数内部有效,只有被调用时才会分配内存单元,调用结束后,即刻释放。
   实参:出现在主调函数中,进入被调函数后,实参也不能使用。
      
   值传递:即基本类型作为参数传递,值改变作用到了形参,而不会到实参
   引用传递:即引用类型作为参数传递,值改变作用到了形参,也会作用到实参
   
   注意:类似的 String, Integer, Float, Double, Short, Byte, Long, Character等基本包装类
   虽然他们是引用类型的,但是可以认为它是值传递。
   
   static关键字
   随着类的加载而加载
   优先于对象存在
   被类的所有对象共享
   可以通过类名调用,也可以通过对象名调用
    
   final:
   修饰类,类不能被继承
   修饰变量,就变成了常量,只能被赋值一次
   修饰方法,方法不能被重写
   finally中的代码在returnbreak语句后执行
   finally是无论是否有异常都会被处理的语句,除非在finally前存在被执行的System.exit(int i)时除外
      
   接口成员特点
   成员变量:只能是静态的常量,默认修饰符 public static final
   构造方法:接口没有构造方法
   成员方法:只能是抽象方法,默认修饰符 public abstract
   abstract抽象类与普通类的唯一区别:就是不能创建实例对象和允许有abstract方法
      
   Java泛型:用来接收不同类型的参数
   标记符:E-Element(集合) T-Type(类) K-Key(键)N-Number(数值类型) ?-表示不确定的 java 类型
   类型通配符:List<?> list  ?可以接收不确定的类型,常见:List<T> 接收不同的对象
   
cookie数据存放在客户端,不安全,支持跨域访问,单个cookie不能超过4k
session数据存放在服务端,相对安全,不支持跨域访问,关闭浏览器后,服务器默认30分钟后销毁session

Linux

软连接: ln -s 类似window的快捷方式
创建目录:mkdir 目录名
搜索文件:locate 文件名 
删除文件及其中所有数据:rm -rf 文件名
输出字符串:echo [-e] "hello world"
查看指定文件:cat 文件名
终极版压缩:tar -zcvf 指定的目录名.tar.gz/bz2 源目录名
终极版解压缩:tar -zxvf 指定的目录名.tar.gz/bz2
打开或新建文件(.sh是shell 脚本):vi hello.sh
给脚本添加执行权限:chmod 755 hello.sh    
执行脚本:./hello.sh	
查看磁盘使用量:df -h (-h会显示数据的单位G,M,kb)
设置文件所有者:chown -R test:123 /home/test (-R 把test的所有文件和子目录都设置成test所有)

Hadoop

Hadoop:是一种开源的大数据分析软件
以分布式文件系统HDFSMapReduce为核心
高可靠性:多备份,多集群
高扩展性:hadoop是在可用的计算机集群间分配数据并完成计算任务,可以添加节点,扩大集群
高效性:能够在节点之间动态的移动数据,在数据所在节点进行并发处理
高容错:分布式文件系统HDFS在存储文件时会在多个节点或多台机器上存储文件的备份副本,如果宕机了,系统会调用其他节点的备份文件
低成本,对机器的配置要求不高

HDFS分布式文件系统
主要负责集群数据的存储和读取,是一个主/从(master/slave)结构的分布式文件系统
HDFS是分布在多个集群节点上的文件系统,节点之间通过网络通信进行协作。
数据存储不是文件为单位,而是将一个文件分成一个或多个数据块,数据块又分布存储在
各个节点中,并且数据块会在其他节点有备份。所以读取一个文件时,会从多个节点中找到该文件的数据块,
分布读取所有数据块,直到最后一个数据块读取完毕。
特点:高容错;适合大数据的处理;流式数据访问(一次写入,多次读取,一旦写入,不能修改,只能增加,保证数据一致性)

MapReduce分布式计算框架
适用于大规模数据集(大于1TB)并行运算的模型,包括Map(映射)和Reduce(规约)两部分
工作流程及原理:
启动一个MapReduce任务
Map端读取HDFS上的数据,并以键值对的形式传到ReduceReduce端接收后,根据不同键进行分组处理,整合排序得到新的键值对
最后将新的键值对输出到HDFS

Hbase

Apache Hbase是hadoop数据库,一个分布式,可伸缩的大数据存储
Hbase依赖于hadoop,是在HDFS基础上构建的,列式存储
基础概念
RowKey:行键,唯一
Column Family:列簇,必须定义列簇,官方推荐定义一个,最多3Column:列,可随时扩展

基础流程
client请求到Zookeeper
Zookeeper返回HRegionServer地址给client
client得到Zookeeper返回的地址去请求HRegionServer
HRegionServer读写数据后返回给client

Hbase在写数据的时候,会先写到Mem Store(内存),当Mem Store超过一定阈值,就会将内存中的数据
刷新(flush命令)到硬盘上,形成StoreFile,而storeFile底层是以Hfile(keyVlaue格式存储)的格式保存

HRegionServer是真正干活的,用于hdfs交互,Hbase表用rowkey来横向切分表
HRegion里面会有很多个store,每个store其实就是一个列簇
Store里面有Mem StoreStoreFile(Hfile),其实就是先走一层内存,在刷到磁盘上
HMaster会处理元数据的变更和监控RegionServer的状态

HBase的增删改记录都有version,默认以时间戳的方式实现
Hbase的读写都经过ZK去拉取meta数据,定位到对应的HRegion,然后找到HRegionServer
java导入hbase依赖,即可操作hbase

Dubbo

1.dubbo:分布式系统框架,工作流程
provider向注册中心去注册;
consumer从注册中心订阅服务,注册中心会通知consumer注册好的服务;
consumer调用provider;
consumer和provider都异步的通知监控中心;
区别
springCloud  微服务方案    基于http 注册中心Euerka  负载均衡Ribbon Hystrix熔断 把应用定义为服务 
dubbo  服务治理方案  基于TCP  推荐Zookeeper    客户端负载     无熔断       把接口定义为服务 

2.注册中心宕机了,可以继续通信吗?
可以,因为刚开始初始化的时候,消费者会将提供者的地址等信息拉到本地缓存中。

3.dubbo通信协议
dubbo协议:默认就是走dubbo协议的,单一长连接,NIO异步通信,基于hessian作为序列化协议(适用场景:传输数据量小,并发高)
http协议:走json序列化

4.dubbo负载均衡策略
默认情况下,dubbo是random load balance随机调用实现负载均衡,可以对provider不同实例设置不同的权重,
会按照权重来负载均衡,权重越大分配流量越高,一般就用这个默认的就可以了。

Docker

1.docker:一个开源的应用容器引擎
可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植的容器上,然后发布到任何流行的linux系统上
也可以实现虚拟化。容器(container)是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器开销极低。
沙箱机制:为程序提供一个受限的运行环境;限制应用程序对系统资源的访问;沙箱提供的环境对于每一个运行的程序都是独立的,也不会对现有系统产生影响;
应用场景:web应用的自动化打包发布;持续集成,发布;

2.三个基本概念
仓库Repository:代码控制中心,用来保存镜像
镜像Image:相当于一个root文件系统
容器Container:镜像运行时的实体,类似面向对象中的对象,镜像是类;容器通过镜像来创建


3.docker并非是一个通用的容器工具,它依赖于已存在并运行的linux内核环境;
实质上是在已经运行的linux下制造了一个隔离的文件环境,因此它执行的效率等同于所部署的linux主机;
因此,docker必须部署在linux内核的系统上,如果其他系统如window想部署docker就必须安装一个linux虚拟机。

4.DockerHub拉取镜像可能会很慢,所以国内提供了很多镜像加速器,如阿里云,网易。。
检查加速器是否生效:docker info

5.docker命令
docker run:在容器内运行一个应用程序,例如 docker run ubuntu:15.1(镜像) /bin/echo "hello world"
Docker以ubuntu15.10镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
docker ps:查看容器是否在运行
docker start:启动一个或多个已经被停止的容器
docker stop:停止一个运行中容器
docker pull:从镜像仓库中拉取或更新指定镜像
docker push:将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
docker images:列出本地主机上的镜像

6.Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

总结:docker是一个打包发布用的轻量级容器,只能用在linux内核的系统上,用沙箱机制(每个程序都是独立的,不会对系统产生影响,限制对系统资源的访问)
在系统上制造了一个隔离的文件环境,执行效率等同于linux主机;从仓库拉取程序的镜像到容器中执行

Version

GIT And SVN

Git是一个开源的分布式版本控制系统,存储使用的是hash算法,内容完整性优于SVN
Git的工作就是创建和保存你项目的快照及与之后的快照进行对比
区别:
Git 分布式 版本库与工作区在同一目录	内容按元数据方式存储 全球版本号(40位的16进值字符串) 只能全部检出
SVN 集中式 版本库与工作区分离       内容按文件方式存储   全局版本号                     可全部/可部分检出

说明
workspace:工作区
staging area:暂存区
local repository:本地仓库
remote repository:远程仓库

编辑git配置文件
git config xx xx : 针对当前仓库
git config --global xx xx:针对系统上所有仓库

基本操作:
1.创建github版本库 mkdir learngit
2.初始化库 git init
2.将文件添加到库中 git add xxx.txt
3.提交文件 git commit -m ""   : -m ""  给提交的东西加以说明
4.查看状态 git status
5.查看修改内容 git diff
6.查看提交日志 git log 或者就加(简易的)--pretty=oneline     head(表示当前版本)
7.回滚历史版本 git reset --hard commit_id  (commit_id:提交的版本号)
8.查看命令历史 git reflog
9.修改了文件内容,但还没有添加到暂存区(git add file)可以用:git checkout -- file  丢弃
10.如果放到了暂存区,则用 git reset HEAD file回到9,在用9的命令
连接远程github远程仓库
1.创建SSH Key :ssh-keygen -t rsa -C "youremail@example.com"
2.把本地的master分支的最新修改推送至github :git push origin master
3.克隆远程库到本地:git clone git@github.com:xiaoxuelin8248/gitskill (类似SVN checkout)
创建与合并分支
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
创建标签:git tag -a<name> -m <标签名>
远程仓库操作:git remote
下载远程代码并合并:git pull
从远程获取代码库:git fetch

SVN是一个开源的版本控制系统
repository:源代码库
checkout:从仓库提取代码
commit:检出/提交代码
update:更新代码