Java基础常识及面试题(二)

Sublime Text、Visual Studio Code、nodepad++、vim

https://www.nowcoder.com

一、单项选择题

1        2 A      3 A        4 D      5 B
6 D        7 B        8 D        9        10
11A     12        13A      14B        15
16B        17C        18A        19D        20C


1、表达式“b”+10 =b10  ‘b’+10=108

2、封装、继承、多态

3、chmod 644 filename 拥有者有读写权限,属性组用户和其他用户只有【读权限】

4、提供java存储数据能力的包是java.sql

5、String a = "hello";  String b = "he" + new String("llo");  System.out.println(a == b);  【false】


基础
1、java中会存在内存泄漏吗,简单描述
    存在,程序创建对象,没有使用,却一直被调用,无法被垃圾回收。HashSet。

2、String s = new String("xyz") ,创建几个字符对象,对象位于什么存储区?
    2个对象,一个存放在常量池中(jdk1.8后方法区),另一个存放在堆heap(内存)中。

3、Java异常try里面有return,finally里的code代码会执行吗,什么时候执行,在return前还是后执行?
    会执行,在return将要返回但返回时执行,在return之后执行


4、如何避免运算过程中Double浮点精度丢失问题?
    小数的二进制不准确,1、转换为long、int计算,最终改为dubbo,2、BigDecmal  并且 构造函数使用String类型

5、请详细解释orcle的高水位问题,他对数据操作有什么影响
    在orcle中,High-water mark 被形容数据块的使用位置,形容那些块已经被使用,那些没有
    MSSM和ASSM
    1)回收高水位操作shrink space可对高水位之下未储存数据的block加以回收,并降低高水位线。既能减少空间使用,又能提高查询效率,而对表内的数据、表上的索引没有影响。
    2)回收高水位操作shrink space是表和段级别的操作,【能释放表空间文件内的空】,但不能缩小表空间文件的大小。
    3)回收操作是DDL操作而非DML操作,不由应用程序完成,需要管理员定期执行。

6、接口和抽象类的区别
    1)抽象类是类有构造器,接口没有构造器
    2)抽象类和接口都不能被实例化,都需要子类继承与实现
    3)抽象类可以有抽象方法和非抽象方法,就扣只能有抽象方法    
    4)一个类只能实现一个抽象类,一个类可以实现多个接口
    5)子类继承抽象类建议实现所有的抽象方法,否则子类也需声明为抽象类、接口必须实现接口里面的所有方法
    
7、Spirng如何处理线程并发问题(***)
    Spring的Controller默认是Singleton(单例),非线程安全的(避免在controller使用变量)
    每个请求request过来,系统都需要有instance处理

    1)在Controller中使用【ThreadLocal】变量
        ThreadLocal<Long>startTime = newThreadLocal<Long>();  定义一个ThreadLocal 变量
        startTime.set(System.currentTimeMillis());   写入值
        startTime.get();  读取值
        
    2)在spring配置文件Controller中声明 scope="prototype",每次都创建新的controller

8、Java中内存泄漏常常导致OutOfMemoryError错误,介绍java的内存管理机制并说明那些情况容易引起内存泄漏?

    1 )PermGen space(1.8后更新为Metaspace不存在)程序中使用了大量的jar或class造成
        a、增加java虚拟机中的XX:PermSize和XX:MaxPermSize参数的大小,
        其中XX:PermSize是初始永久保存区域大小,XX:MaxPermSize是最大永久保存区域大小。

        如针对tomcat6.0,在catalina.sh 或catalina.bat文件中一系列环境变量名说明结束处(大约在70行左右) 
        增加一行:JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m"

        b、清理应用程序中web-inf/lib下的jar,如果tomcat部署了多个应用,
        很多应用都使用了相同的jar,可以将共同的jar移到tomcat共同的lib下,减少类的重复加载。

    2) Java heap space(创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了)

        a、 检查代码中是否有死循环或递归调用。
 
        
        b、检查是否有大循环重复产生新对象实体。

        
        c、检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,
        就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,
        上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。

        
        d、检查List、MAP等集合对象是否有使用完后,未清除的问题。
        List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

        e. 增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。如:set JAVA_OPTS= -Xms256m -Xmx1024m

    3)unable to create new native thread  
        
        JVM已经被系统分配了大量的内存(比如1.5G),并且它至少要占用可用内存的一半。
        有人发现,在【线程个数很多】的情况下,你分配给JVM的内存越多,那么,上述错误发生的可能性就越大。
        
        发生内存溢出时进程中到底都有什么样的线程,这些线程是否是应该存在的,是否可以通过优化来降低线程数;
    
        【我们可以通过调整jvm参数】,降低为每个线程分配的栈内存大小来解决问题,例如在jvm参数中添加-Xss128k将线程栈内存大小设置为128k。
        

数据库题

The Employee table holds all employees。Every employee has an Id,a salary,and there is also a column for the department Id


write a sql query to find employess who have the highest salary in each of the departments

for the above tables,Max has the highest salary in the it department 
and henry has the highest in the sales departme

表e  join 中间表g on 表e.did = g.did join 表d on e.id = d.id
where e.s = g.max

SELECT
    d. NAME Department,
    e. NAME Employee,
    e.Salary Salary
FROM
    Employee e
JOIN (
    SELECT
        MAX(Salary) max,
        DepartmentId
    FROM
        Employee
    GROUP BY
        DepartmentId
) g ON e.DepartmentId = g.DepartmentId
JOIN Department d ON (e.DepartmentId = d.Id)
WHERE
    e.Salary = g.max
    
Student(S#,Sname) 10000条记录
Cource(C#,Cname,T#)    9条记录
SC(S#,C#,Score)    89991条记录
Teacher(T#,Tname) 3条记录    
    
1选择课程001的成绩大于课程002的成绩的学生ID;
    SELECT sc1.sid
    FROM sc sc1 
    WHERE sc.cid = 1 AND EXISTS
    (SELECT sc1.sid FROM sc sc2
    WHERE sc2.cid = 2 and sc1.sid = sc2.sid and sc1.score > sc2.score)


2查询所有平均成绩大于60分的学生ID,学生姓名;    
    
    SELECT student.sid,student.sname,avg(sc.score) avgc
    FROM student,sc
    WHERE student.sid = sc.sid
    GROUP BY sc.sid HAVING(avgc >60)

3查询所有学生的学生ID,学生姓名,总科目数,总成绩;

    SELECT student.sid,student.sname,COUNT(*),sum(sc.score)
    FROM student,sc 
    WHERE student.sid = sc.sid
    GROUP BY sc.sid


2、如何在多线程中避免发生死锁?(A)
允许进程同时访问某些资源。
允许进程强行从占有者那里夺取某些资源。
进程在运行前一次性地向系统申请它所需要的全部资源。
把资源事先分类编号,按号分配,使进程在申请,占用资源时不会形成环路。


3、以下为求0到1000以内所有奇数和的算法,从中选出描述正确的算法(A)
①s=0;②i=1;③s=s+i;④i=i+2;⑤如果i≤1000,则返回③;⑥结束
①s=0;②i=1;③i=i+2;④s=s+i;⑤如果i≤1000,则返回③;⑥结束
①s=1;②i=1;③s=s+i;④i=i+2;⑤如果i≤1000,则返回③;⑥结束
①s=1;②i=1;③i=i+2;④s=s+i;⑤如果i≤1000,则返回③;⑥结束

4、关于递归法的说法不正确的是(D )
程序结构更简洁
占用CPU的处理时间更多
要消耗大量的内存空间,程序执行慢,甚至无法执行
递归法比递推法的执行效率更高

5、字符串”ABCD”和字符串”DCBA”进行比较,如果让比较的结果为真,应选用关系运算符(B)
>
<
=
>=
正确答案:B

以下运算符中运算优先级最高的是( D)
+
OR
>
\

若串S=”UP!UP!JD”,则其子串的数目(B)
33
37
39
35

在(D)中,只要指出表中任何一个结点的位置,就可以从它出发依次访问到表中其他所有结点。
线性单链表
双向链表
线性链表
循环链表


下面程序的输出是?(B)
public class Main {
  public static void main(String[] args) {
    Other o = new Other();
    new Main().addOne(o);
    System.out.println(o.i);
  }
  public void addOne(final Other o) {
    o.i++;
  }
}
 
class Other {
  public int i;
}

0
1
编译出错
运行出错


根据类加载器加载类的初始化原理,推断以下代码的输入结果为?(A)
public class Test {

    public static void main(String[] args) throws Exception{
      ClassLoader classLoader=ClassLoader.getSystemClassLoader();
      Class clazz=classLoader.loadClass("A");
      System.out.print("Test");
      clazz.forName("A");
    }
}

class A{
    static {
        System.out.print("A");
    }
}
TestA
ATestA
ATest
Test

Object类不含有以下哪种方法?(A)
equal
wait
notify
clone
正确答案:A


关于下面程序 ThisTest .java 运行结果 说法正确的是 : ( B)
public class ThisTest {
            public static void main(String args[]) {
                String x="7";       
        int y = 2;
                int z=2;              
        System.out.println(x+y+z);
            }  
}

11
722
22
程序有编译错误

以下哪项不属于java类加载过程?B?
生成java.lang.Class对象
int类型对象成员变量赋予默认值
执行static块代码
类方法解析

下面有关JVM内存,说法错误的是?(C)
程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的
Java方法执行内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的
方法区用于存储JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,是线程隔离的
原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的


list是一个ArrayList的对象,哪个选项的代码填到//todo delete处,可以在Iterator遍历的过程中正确并安全的删除一个list中保存的对象?(A)
Iterator it = list.iterator();
int index = 0;
while (it.hasNext())
{
    Object obj = it.next();
    if (needDelete(obj))  //needDelete返回boolean,决定是否要删除
    {
        //todo delete
    }
    index ++;
}

it.remove();
list.remove(obj);
list.remove(index);
list.remove(obj,index);

在Java中,以下关于方法重载和方法重写描述正确的是?(D)
方法重载和方法的重写实现的功能相同
方法重载出现在父子关系中,方法重写是在同一类中
方法重载的返回值类型必须一致,参数项必须不同
方法重写的返回值类型必须相同或相容。(或是其子类)

以下代码打印出(C)
    public static void main(String[] args) {
        String classFile = "com.jd.".replaceAll(".", "/")+"MyClass.class";
        System.out.println(classFile);
    }
com/jd/MyClass.class
com. jd
///////MyClass.class
com. jd

机试题

1、写一段代码,判断一个包括’{‘,’[‘,’(‘,’)’,’]’,’}’的表达式是否合法(注意看样例的合法规则。) 
给定一个表达式A,请返回一个bool值,代表它是否合法。

    解析:利用栈来做,当遇到 ‘{‘, ‘[‘, ‘(’ 等就把当前的括号字符入栈,当遇到 ‘)’ , ‘]’ , ‘}’ 
    就出栈一个括号字符。最后判断栈是否为空,栈空则表达式合法,否则不合法
        
    public static void main(String[] args) {
        String a = "[a+b*(5-4)]*{x+b+b*({1+2})}";
        System.out.println(chkLegal(a));
    }
    public static boolean chkLegal(String A) {
        Stack<Character> stack = new Stack<>();
        for(int i=0;i<A.length();i++) {
            if(A.charAt(i) == '{'||A.charAt(i) == '[' || A.charAt(i) == '('  ) {
                stack.push(A.charAt(i));
            }
            if(A.charAt(i) == '}'||A.charAt(i) == ']' || A.charAt(i) == ')'  ) {
                stack.pop();
            }
        }
        return stack.isEmpty();
    }
    
9、输入一行字符,分别统计其英文字母、空格、数字和其他字符个数
    
    定义变量    if else循环判断  输入Scanner(System.in)对象;  a.nextLine获取String ,
    
    将String转换为toCharArray();  isDigit是否数字  isSpaceChar(arr[i])是否空格 isLetter是否字母
    
    public static void main(String[] args) {
        int num = 0;
        int spcae = 0;
        int england = 0;
        int qita= 0;
        Scanner s = new Scanner(System.in);
        
        String a = s.nextLine();
        char[] arr = a.toCharArray();
        for (int i = 0; i < arr.length; i++) {
            if(Character.isDigit(arr[i])) {
                num++;
            }else if(Character.isSpaceChar(arr[i])) {
                spcae++;
            }else if(Character.isLetter(arr[i])) {
                england++;
            }else {
                qita++;
            }
        }
        System.out.println(num);
        System.out.println(spcae);
        System.out.println(england);
        System.out.println(qita);
    }
    

10、将一个数组逆顺序输出
    
    要求实现函数(不能调用api)
    void Rev(int InputArray[].unsigned int n)
    【输入】InputArray 给定的数组        n:数组的长度
    【输出】InputArray:你顺序的数组
    【返回】无

    1、将数组转换为ArrayList    Arrays.asList(s);
    2、调用集合工具类Conllections.reverse(list);
    3、list.toArray(s);
    
    public static void main(String[] args) {
        int InputArray [] = new int[] {1,2,3,4,6,7};
        int n = InputArray.length;
        Rev(InputArray, n);
    }
    
    public static void Rev(int InputArray[],int n) {
        for (int i = n - 1; i >= 0; --i) { // 逆序输出
            System.out.print(InputArray[i] + " ");
        }
    }


已知显示器上有2个矩形(显示器左上角坐标为0,0,想右下分别为x轴和y轴正方向)
第一个矩形的左上角坐标为(x1,y1)、(x2,y2),
第二个矩形的左上角和右下角坐标为(x3,y3)、(x4,y4),求相交矩形的面积
    
    a、((r1.right < r2.left) || (r1.bottom > r2.top)) 
    ((r2.right < r1.left) || (r2.bottom > r1.top))

    对立事件(Complementary event,直译为互补事件) P(Ac)=1?P(A)

实现快速排序

Git
    初始化
    git init
    git init 目录名

    全局配置
    git config --global user.name 
    git config --global user.email

    本地配置
    git config --local user,name
    git config --local user.email

    查看配置信息
    git config --global --list

    提交文件
    git add .

    把提交过暂存区,已经发生改变的文件再次提交到暂存区
    git add -u

    暂存区文件提交到版本库
    git commit -m "初始版本"
    
    查看git提交日志
    git log
    git log --oneline
    查看前5个日志
    git log -n5 --oneline
    git log --all


JVM

方法区

本地方法栈

程序计数器

新时代  永久代

window10安装环境
    slmgr.vbs -xpr  查看状态
    slmgr.vbs /upk 卸载之前的
    slmgr /ipk VK7JG-NPHTM-C97JM-9MPGT-3V66T
    slmgr /skms kms.xspace.in
    slmgr /ato

tomcat.bat文件

    set JAVA_OPTS=%JAVA_OPTS% -server -Xms1000m -Xmx1000m -XX:MaxNewSize=256m

eclipse.ini配置文件

    -vm
    E:/Program Files/Java/jdk1.8.0_191/bin

    -Xms512m
    -Xmx2048m
    --add-modules=ALL-SYSTEM

eclipse+python+anaconda

    http://pydev.org/updates/
    选择anaconda位置

maven

    C:\Users\Administrator\.m2     加入setting,xml

    cmd 

    mvn - version
    
    下载3.6最新版本

    cd E:\workspace1\noaper-demo-all>

    打包
    mvn clean install -DskipTests -U 
    -DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。
    -Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类。

ArrayList

1、什么是
    数组
         
Redis

1、什么是Redis

    key-value数据库

2、Redis memcached

    1、memcached所以的值均是简单的字符串,redis支持更为丰富的数据类型
    2、redis的速度比memcached快很多
    3、redis可以持久化其数据

3、String 、List、Set SortedSet、hashes

4、Redis主要消耗什么物理资源?内存

5、Remote Dictionary Server


13、会话缓存、全员缓存、队列、排行榜/计算器、发布/订阅

14、Redisson、Jedis、Lettuce

Zookeeper
13、服务器角色
    
    Leader
    Follower
    Observer

14、Zookeeper下Server工作状态

    LOOKING
    FOLLOWING
    LEADING
    OBSERVING

15、Leader选举


SpringMVC

1、用户请求

2、DispatcherServlet重要控制器(减少主键之间的耦合度)

    1)LoadConfig加载配置文件(web.xml)

        ServletConifg(config.getInitParameter("contextConfigLocation"))
        properties.load(inputStream) 

    2)Scanner 初始化所有相关的类,扫描用户设定的包下所有的类(application.properties)
        
        properties.getProperty("scanPackage")   格式化路径,递归读取所有的包

    3)实例化Instance

        Class<?> clazz= Class.forName(className);通过反射实例化
        放入的ioc容器中,

    4)初始化HandlerMapping(将url和method对应上)
        
        initHandlerMapping()

3、HandlerMapping处理器映射器(url)

4、HandlerAdapter调用处理器(controller)---》Handle(Controller)返回ModeAndView

5、ViewReslover视图解析器(解析后返回具体的View)

Spring

AOP 面向切面编程,可以然我们专注用业务逻辑开发,用动态代理实现

IOC 控制反转(用反射实现),让类的创建交给框架处理

SpringBoot

1、什么是SpringBoot
    
    Spring开源项目下的子项目、Spring组件一站式解决方案,
    简化了Spring的难度,简化了繁重的配置
    提供了各种启动器,

2、优点
    独立运行、简化配置、自动配置、无代码生产和xml配置
    应用监控、上手容易

3、SpringBoot的核心配置

    核心配置文件是application和bootstrap配置文件
        
    application配置文件主要用于springboot项目自动化配置
    
    bootstrap配置应用场景
    
        1)使用SpringCloudConifg配置中心时,这时需要在bootstrap配置文件中
        添加连接到配置中心的配置属性来加载外部配置中心的配置信息
        2)一些固定的不能被覆盖的属性
        3)一些加密/解密的场景

0、HashMap底层数组+链表+红黑树
HashTable底层数组+链表实现

1、HashMap key 和value 都可以为空 
HsahTable都不可以回报空指针异常

2、HashMap 继承AbstractMap   , 
HashTable继承Dictionary   
都实现 Map接口  extends implements

3、HashMap线程不安全  
HashTable线程安全 效率低

4、HashTabel初始size为11,扩容newsize = oldsize*2+1
     HashMap初始size为16,扩容 newsize = oldsize*2,size一定为2的n次幂

5、HashTable计算index的方法:index=(hash&0x7FFFFFFF)%tab.length
    HashMap计算index方法 index = hash & (tab.length -1)


6、HashMap的resize()方法
①.在jdk1.8中,resize方法是在hashmap中的键值对大于阀值时或者初始化时,就调用resize方法进行扩容;
②.每次扩展的时候,都是扩展2倍;
③.扩展后Node对象的位置要么在原位置,要么移动到原偏移量两倍的位置。

7、HashMap的putVal()方法

8、hashMap插入元素后才判断该不该扩容,有可能无效扩容(插入后如果扩容,如果没有再次插入,就会产生无效扩容)

9、HashMap和Hashtable都是用hash算法来决定其元素的存储,因此HashMap和Hashtable的hash表包含如下属性:


容量(capacity):hash表中桶的数量
初始化容量(initial capacity):创建hash表时桶的数量,HashMap允许在构造器中指定初始化容量
尺寸(size):当前hash表中记录的数量
负载因子(load factor):负载因子等于“size/capacity”。负载因子为0,表示空的hash表,0.5表示半满的散列表,
依此类推。轻负载的散列表具有冲突少、适宜插入与查询的特点(但是使用Iterator迭代元素时比较慢)

10、ConcurrentHashMap

1、底层采用分段的数组+链表实现,线程安全

2、通过把整个Map分为N个Segment,可以提供相同的线程安全,但是效率提升N倍,
默认提升16倍。(读操作不加锁,由于HashEntry的value变量是 volatile的,也能保证读取到最新的值。

3、Hashtable的synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,
ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术

4、有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,
这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁

5、扩容:段内扩容(段内元素超过该段对应Entry数组长度的75%触发扩容,不会对整个Map进行扩容)
插入前检测需不需要扩容,有效避免无效扩容

6、ConcurrentHashMap是使用了锁分段技术来保证线程安全的。

ConcurrentHashMap是JDK1.5添加的新的集合,用来保证线程安全性,提高Map集合的并发效率
ConcurrentHashMap使用了Segment的概念,莫若友16各Segment
Segment里面依然还是数字+链表的数据结构,相当于给HashMap分桶处理了
因每次只会锁住其中一个Segment,所有性能非常好
然而,有意思的是,随着 JDK 1.8 中对 HashMap 的改进,同时又对 ConcurrentHashMap 进行了改进,
抛弃了 Segment + 数组 + 单向链表 的设计,改为了和 HashMap 同样的 数组 + 单向链表 + 红黑树 的数据结构。

同时,ConcurrentHashMap 使用了 CAS 算法 + Synchronized 来保证集合的线程安全性,
ConcurrentHashMap 相当于一个性能安全的 HashMap。


数组
在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。
这些按序排列的同类数据元素的集合称为数组。

栈 
只能在某一端插入或者删除的特殊线性表,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶
需要数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)

队列
一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而表的后端(rear)进行插入操作,
进行插入操作的端称为队尾,进行删除操作的端称为队头。队列是按照“先进先出”或后进后出”的原则组织数据
队列没有元素的时候,称为空队列

链表
是一种物理存储单元上非连续,非顺序的存储结构,它既可以表示线性结构,也可以表示非线性结构
数据元素的逻辑顺序是通过链表中的指针次序实现的,
链表由一系类结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成
每个结点包括俩个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域

树(n结点、K有穷集、关系N、KO跟结点)

是包含n(n>0)个结点的有穷集合K,且K中定义了一个关系N,

N满足以下条件
1、有且仅有一个结点KO,它对于关系N来说没有前驱,称KO为树的根结点。简称为根(root)
2、除KO外,K中的每个结点,对于关系N来说只有一个前驱
3、K中各结点,对于关系N来说可以有m个后续(m>=0)

图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中结点称为顶点,
边是顶点的有序偶对,若俩个顶点之间存在一条边,就表示这俩个顶点具有相邻关系



在计算机科学中,堆是一种特殊的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。
堆的特点是根节点的值最小(或最大),且根结点的俩个子树也是一个堆

散列表
若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。
称这个对应关系f为散列函数(hash function),按这个思想建立表为散列表


红黑树(Red Black Tree)(自平衡二叉树)

1、节点是红色或黑色。
2、根节点是黑色。
3、每个叶节点(NIL节点,空节点)是黑色的。
4、每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
5、从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。


JSON
(JavaScript Object Notation) 轻量级数据交换格式能够替代XML的工作
eval()
有规则的字符串,(表现形式)是键值对
用于交互(Web项目后端交互、接口、配置文件、文件存储等)

于XML的对比

可读性(差不多)
可扩展性(JSON可以存储Javascript符合对象)
像Java就有Jackson、goson、json-lib、FastJson等等多的去了。
XML有有DOM,SAX,STAX等解析技术,JSON也有我上面说的那些
编码解码

数据格式比较简单,

易于读写, 格式都是压缩的, 占用带宽小,易于解析这种语言。

多线程

1、什么是多线程

1)发挥CPU优势
单核CPU 线程间切换比较快,看似"同时"发生
多核CPU(双核50%、4核75%、8核、16核...) 多线程

2)防止阻塞
多条线程同时运行,哪怕一条线程的代码执行读取数据阻塞,也不会影响其他任务执行。(单核CPU也使用多线程)

3)便于建模(明显的优点)
大任务A(单线程需考虑很多、建模比较麻烦)
将大任务A分解为---》任务B、任务C、任务D分别建立程序模型,通过多线程分别运行这几个任务,那就简单很多

2、创建线程

继承Thread类(java只能单继承,不利于扩展)重写run方法,通过start方法启动线程
实现Runnable接口(减少程序间的耦合度)重新run方法,并把Runnable实例传给Thread对象,通过Thread的start方法调用run方法
再同故宫调用Runnable实例


设计模式

面向接口编程(6大核心原则之一)


分布式软件系统(Distributed Software System)
是支持【分布式处理】的软件系统
是在有【通信网络】互联的
【多处理机制体系结构】上执行任务的系统
它包括【分布式操作系统】
【分布式程序设计】语言及其编译(解释)系统
【分布式文件系统】
具有执行远程文件存取的能力,并以透明的方式对分布在网络上的文件进行管理和存取
【分布式数据库系统】
由分布于多个计算机节点上的若干个数据库系统组成

【邮件系统】
构建自己的邮件服务器
适用于(政府机构、大型集团)有效管理(人员结构)

操作系统
与(集中操作系统)的区别(资源管理、进程通信、系统结构)
程序软件设计
用于编写运行与【分布式计算机系统】上的【分布式程序】
一个分布式程序由若干个可以独立执行的【程序模块】组成
他们分布于一个【分布式处理系统】的多台计算机上被同时执行
特点
分布性、通信性、稳健性


分布式软件系统 Distributed SoftWare System

1、是支持分布式处理的软件系统
2、是在有通信网络互连的  多处理机制体系结构  上执行任务的系统

包括
分布式操作系统
与集中系统的区别--》资源管理、进程通信、系统结构
分布式程序设计

用于编写运行与分布式计算机系统上的分布式程序
一个分布式程序由若干个可以独立执行的程序模块组成
他们可以分布于一个分布式处理系统的多台计算机上被同时执行

分布式文件系统
分布式数据库系统
邮件系统
。。。

特点
分布性、通信性、稳健性

Dubbo

核心部件
1、Remoting网路通信框架,实现了sync-over-async和request-response消息机制
2、RPC一个远程调用的对象,支持负载均衡、容灾和集群功能
3、Registry服务目录框架用于服务的注册和服务时间发布和订阅

1、Provider暴露服务方称之为“服务提供者”

2、Consumer调用远程服务称之为“服务消费者”

3、Registry服务注册与返现的中心目录称之为“服务注册中心”

4、Monitor统计服务的调用次数和调用时间的日志服务称之为“服务监控中心”
5、Container服务运行容器

1、单一应用架构ORM
当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。
此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键。

2、垂直应用架构MVC
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。
此时,用于加速前端页面开发的 Web框架(MVC) 是关键。

3、分布式应用架构RPC
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。
此时,用于提高业务复用及整合的 分布式服务框架(RPC) 是关键。

4、流动计算架构(SOA) 
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。
此时,用于提高机器利用率的 资源调度和治理中心(SOA) 是关键。


RPC(Remote Procedure Call Protocol)远程过程调用
通讯问题 : 主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。

寻址问题 : A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,
方法的名称名称是什么,这样才能完成调用。比如基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。如果是RMI调用的话,还需要一个RMI Registry来注册服务的地址。

序列化 与 反序列化 : 当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,
内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。 
同理,B服务器接收参数要将参数反序列化。
B服务器应用调用自己的方法处理后返回的结果也要序列化给A服务器,A服务器接收也要经过反序列化的过程。


Dubbo是什么

1、一款分布式服务框架
2、高性能和透明化的RPC远程服务调用方案
3、SOA服务治理方案

Provider: 暴露服务的服务提供方。 

Consumer: 调用远程服务的服务消费方。 

Registry: 服务注册与发现的注册中心。 

Monitor: 统计服务的调用次数和调用时间的监控中心。

调用流程 

0.服务容器负责启动,加载,运行服务提供者。

1.服务提供者在启动时,向注册中心注册自己提供的服务。 
2.服务消费者在启动时,向注册中心订阅自己所需的服务。 

3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。 

4.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。 

5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

优点

1、透明化的远程方法调用 
- 像调用本地方法一样调用远程方法;只需简单配置,没有任何API侵入。
2、
软负载均衡及容错机制 

可在内网替代nginx lvs等硬件负载均衡器。

3、
服务注册中心自动注册 & 配置管理 
-不需要写死服务提供者地址,注册中心基于接口名自动查询提供者ip。
使用类似zookeeper等分布式协调服务作为服务注册中心,可以将绝大部分项目配置移入zookeeper集群。

4、服务接口监控与治理 
-Dubbo-admin与Dubbo-monitor提供了完善的服务接口管理与监控功能,
针对不同应用的不同接口,可以进行 多版本,多协议,多注册中心管理。


缺点:


只支持JAVA语言???


微服务
是一种架构模式或者说是一种风格


1、单应用架构?
互联网发展早期,所有软件应用部署在一台机器上,这个阶段的讲究的是效率。效率决定生死。
2、应用服务器的管理
网站上线,访问量上升,服务的负载慢慢提高,单台机器性能遇到瓶颈,
增加机器是一个比较简单好用的方式,投入产出比相当高。
web服务器和数据库服务拆分,提高了单机的负载能力,提高整个系统的容灾能力
应用服务器和数据库服务器完全隔离开来,相互互不影响,大大减少了网站宕机的风险
3、应用服务器集群
负载均衡又可以分为软负载和硬负载。软负载我们可以选择Nginx、Apache等,
硬负载我们可以选择F5等。而session共享问题我们可以通过配置tomcat的session共享解决。

4、数据库压力变大,数据库读写分离
主从数据库之间的数据需要同步(可以使用 mysql 自带的 master-slave 方式实现主从复制 )
应用中需要根据业务进行对应数据源的选择( 采用第三方数据库中间件,例如 mycat )
5、使用搜索引擎缓解读库的压力
6、引入缓存机制缓解数据库的压力
比如 redis、memcache 来作为我们应用层的缓存
另外在某些场景下,如我们对用户的某些 IP 的访问频率做限制, 那这个放内存中就又不合适,放数据库又太麻烦了,
那这个时候可以使用 Nosql 的方式比如 mongDB 来代替传统的关系型数据库。
7、数据库的水平/垂直拆分
垂直拆分:把数据库中不同业务数据拆分到不同的数据库。
水平拆分:把同一个表中的数据拆分到两个甚至更多的数据库中,水平拆分的原因是某些业务数据量已经达到了单个数据库的瓶颈,这时可以采取将表拆分到多个数据库中。


8、应用的拆分

1、numpy(数据结构基础)

    是python科学计算的基础包,它提供以下功能(不限于此):
    (1)快速高效的多维数组对象ndarray 
        (2)用于对数组执行元素级计算以及直接对数组执行数学运算的函数
        (3)用于读写硬盘上基于数组的数据集的工具
        (4)线性代数运算、傅里叶变换,以及随机数生成
        (5)用于将C、C++、Fortran代码集成到python的工具

2、pandas(基础数据分析套件)

    pandas提供了使我们能够快速便捷地处理结构化数据的大量数据结构和函数。pandas兼具Numpy高性能的数组计算功能以及电子表格和关系型数据(如SQL)灵活的数据处理能力。它提供了复杂精细的索引功能,以便更为便捷地完成重塑、切片和切块、聚合以及选取数据子集等操作。
      对于金融行业的用户,pandas提供了大量适用于金融数据的高性能时间序列功能和工具。
      DataFrame是pandas的一个对象,它是一个面向列的二维表结构,且含有行标和列标。
      ps.引用一段网上的话说明DataFrame的强大之处:
      Excel 2007及其以后的版本的最大行数是1048576,最大列数是16384,超过这个规模的数据Excel就会弹出个框框“此文本包含多行文本,无法放置在一个工作表中”。Pandas处理上千万的数据是易如反掌的事情,同时随后我们也将看到它比SQL有更强的表达能力,可以做很多复杂的操作,要写的code也更少。 说了一大堆它的好处,要实际感触还得动手码代码。


    


                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

猜你喜欢

转载自blog.csdn.net/weixin_39650971/article/details/88836456