复习笔记JAVA

文章目录

    • 数组的工具类Arrays
    • 冒泡排序
    • 如果这个类提供了其他的构造函数,默认的无参构造会被覆盖掉,所以需要手动提供无参构造
    • 静态资源是类资源,随着类的加载而加载,只加载一次,并且优先于对象进行加载,直到类消失,它才会消失
    • 接口其实是对外暴露的一套规则,是一套开发规范,以后要面向接口进行编程,是先天设计的结果
    • 抽象类与接口的区别
    • **常见异常:**
    • String转StringBuilder:
    • StringBuilder的:
    • Integer i1 = Integer.valueOf();数据只要在-128~127有一个高效的效果
    • java集合关系图
    • 线程五态模型
    • 线程实现方式
    • 两种常见的锁
    • 构造方法
    • 对于不想进行序列化的变量,使用transient关键字修饰。
    • string常用方法
    • 集合的跨苏失败机制fail-fast
    • 数组与list转换
    • sql执行顺序
    • 什么是Servlet
    • Linux查看日志
    • **杀死进程命令:**
    • **查询任意服务**
    • **@LoadBalanced**
    • 小节面试分析

数组的工具类Arrays

1)toString(数组名) : 打印数组中所有的元素
2)sort(数组名) :对数组中的元素进行排序
3)copyOf(原来数组的名字,新数组的长度)
如果新长度=旧长度–普通复制
如果新长度>旧长度–扩容
如果新长度<旧长度–缩容
注意:本方法并不会改变原来数组,而是创建指定长度的新数组

冒泡排序

1)如果有n个数,最多比较n-1轮
2)每一轮中如何比较?
从头开始,把所有数过一遍【相邻比较,位置不对就互换】
3)之前轮中比较出来的最大值,不需要参与下一轮的比较
4)写法:外层循环控制的是比较的轮数,内层循环控制的是比较的次数
拓展:可以了解一些其他的排序算法,比如二分排序,快速排序,归并排序,全排序

如果这个类提供了其他的构造函数,默认的无参构造会被覆盖掉,所以需要手动提供无参构造

静态资源是类资源,随着类的加载而加载,只加载一次,并且优先于对象进行加载,直到类消失,它才会消失

接口其实是对外暴露的一套规则,是一套开发规范,以后要面向接口进行编程,是先天设计的结果

抽象类与接口的区别

抽象类是一个特殊的类,使用class定义,特殊在这个类中可以定义没有方法体的方法(抽象方法)
接口可以理解成一个特殊的抽象类,特殊在接口中所有的方法都是抽象方法,但注意接口不是类,用interface定义
抽象类中有构造方法,为了给子类创建对象时调用
接口中没有构造方法的,子类调用的是父类的构造方法
接口可以多继承,但抽象类只能单继承
抽象类可以定义普通的成员变量,但接口只能定义静态常量
接口与抽象类均不可以实例化/创建对象
抽象是后天重构的结果,接口是先天设计的结果

常见异常:

空指针异常
IO异常
sql异常
数据库连接异常
数组越界异常
字符串越界异常
找不到类异常
算数异常

String转StringBuilder:

String s = “abc”; StringBuilder sb = new StringBuilder(s);

StringBuilder的:

StringBuilder转String:
StringBuilder sb = new StringBuilder();
sb.append(“abc”);
String s = sb.toString();
总结一句话,拼接多用StringBuilder,用完转回String用String丰富的方法

Integer i1 = Integer.valueOf();数据只要在-128~127有一个高效的效果

Integer i2 = new Integer(4);没有高效的效果,只是创建了一个包装类的对象

java集合关系图

复习笔记JAVA_第1张图片

线程五态模型

复习笔记JAVA_第2张图片

线程实现方式

  • 多线程编程实现方案一:extends Thread继承方式
  • 多线程编程实现方案二:implements Runnable 实现方式
  • 多线程编程实现方案三:Executors 创建线程池的方式
    1)创建线程池的工具类:Executors.newFixedThreadPool(int n);可以创建包含最多n个线程的线程池对象
    2)创建好的线程池对象:ExecutorService
    使用pool.excute()来讲线程池中的线程以多线程的方式启动,每次调用都会将一个线程对象加入到就绪队列之中
    这个线程池对象负责: 新建/启动/关闭线程,而我们主要负责的是自定义的业务
    注意:线程池是不关闭的,实现的效果就是线程池中线程对象的随取随用,这样就避免了频繁的创建与销毁线程,不会造成资源浪费
    3)合理利用线程池可以拥有的优势:
  1. 降低系统的资源消耗:减少系统创建与销毁线程对象的次数,每个线程都可以重复利用,执行多次任务
  2. 提高响应速度:当任务到达时,任务可以不用等待线程创建就能立即执行
  3. 提高线程的可管理性:可以根据系统的承受能力,调整线程池中线程的数目
    防止因为创建多个线程消耗过多的内存导致服务器的崩溃

两种常见的锁

synchronized 互斥锁(悲观锁,有罪假设)
采用synchronized修饰符实现的同步机制叫做互斥锁机制,它所获得的锁叫做互斥锁。
每个对象都有一个monitor(锁标记),当线程拥有这个锁标记时才能访问这个资源,没有锁标记便进入锁池。任何一个对象系统都会为其创建一个互斥锁,这个锁是为了分配给线程的,防止打断原子操作。每个对象的锁只能分配给一个线程,因此叫做互斥锁。
ReentrantLock 排他锁(悲观锁,有罪假设)
ReentrantLock是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,实际上独占锁是一种相对比较保守的锁策略,在这种情况下任何“读/读”、“读/写”、“写/写”操作都不能同时发生,这在一定程度上降低了吞吐量。然而读操作之间不存在数据竞争问题,如果”读/读”操作能够以共享锁的方式进行,那会进一步提升性能。
ReentrantReadWriteLock 读写锁(乐观锁,无罪假设)
因此引入了ReentrantReadWriteLock,顾名思义,ReentrantReadWriteLock是Reentrant(可重入)Read(读)Write(写)Lock(锁),我们下面称它为读写锁。
读写锁内部又分为读锁和写锁,读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的。
读锁和写锁分离从而提升程序性能,读写锁主要应用于读多写少的场景。

构造方法

1.子类在创建对象时,默认会先调用父类的构造方法
2.原因是子类构造函数中的第一行默认存在super();–表示调用父类的无参构造
3.当父类没有无参构造时,可以通过super(参数)调用父类的其他含参构造
子类必须调用一个父类的构造函数,不管是无参还是含参,选一个即可
构造方法不可以被继承!因为语法的原因:要求构造方法的名字必须是本类类名不能在子类中出现一个父类名字的构造方法
1.子类在创建对象时,默认会先调用父类的构造方法
2.原因是子类构造函数中的第一行默认存在super();–表示调用父类的无参构造
3.当父类没有无参构造时,可以通过super(参数)调用父类的其他含参构造
子类必须调用一个父类的构造函数,不管是无参还是含参,选一个即可
4.构造方法不可以被继承!因为语法的原因:要求构造方法的名字必须是本类类名
不能在子类中出现一个父类名字的构造方法*/

对于不想进行序列化的变量,使用transient关键字修饰。

transient关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被transient修饰的变量值不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法。
注意:
1.javaBean(称之为pojo , entity) 实现序列化接口
2.json数据: web层响应数据到客户端,一般数据是json数据
通常使用json工具把javaBean转换成json,要求javaBean要实现序列化接口
比如: jackSon工具, 带忽略某个字段注解,这个字段不参与序列化@JsonIgnore
比如: jsonLib工具,里面有个api: JsonConfig 灵活指定那些字段不被序列化
比如: fastJSON工具

string常用方法

复习笔记JAVA_第3张图片

集合的跨苏失败机制fail-fast

复习笔记JAVA_第4张图片

数组与list转换

复习笔记JAVA_第5张图片

sql执行顺序

复习笔记JAVA_第6张图片

什么是Servlet

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
概括: Servlet是java后台程序与用户交互的机制(媒介).

 //http://localhost:8090/findUserByIds?id=1,3,5,6,7
    @GetMapping("/findUserByIds")
    public String findUserByIds(HttpServletRequest request){
        String id = request.getParameter("id");
        String[] idStr = id.split(",");
        Integer[] intArray = new Integer[idStr.length];
        for (int i=0;i<idStr.length;i++){
            intArray[i] = Integer.parseInt(idStr[i]);
        }
        System.out.println(intArray);
        return "参数接收成功!!!";
    }

    /**
     * Servlet参数传递核心规则
     * http://localhost:8090/findServlet?name="张三"
     * 问题: String name 值从哪里来????
     * 核心: 参数是取的  而不是传的
     * 请求的流程: 一个request对象,返回response
     * 注意事项:
     *   1.参数名称必须相同.
     *   2.弊端无论什么样的数据,都是String数据类型,需要手动的转化
     * SpringMVC:
     *   在内部封装了Servlet机制.并且可以根据用户的参数类型,实现自动的数据
     *   类型的转化
     */
    @GetMapping("/findServlet")
    public String findServlet(Integer age){

        return "获取数据:"+age;
    }

    /*@GetMapping("/findServlet")
    public String findServlet(HttpServletRequest request){
        String age = request.getParameter("age");
        Integer ageInt = Integer.parseInt(age);
        return "获取数据:"+age;
    }*/

Linux查看日志

cat 输出文件所有的内容
more 输出文档所有的内容,分页输出,空格浏览下一屏,q退出
less 用法和more相同,只是通过PgUp、PgOn键来控制
tail 用于显示文件后几号,使用频繁
tail -10 nginx.conf 查看nginx.conf的最后10行
tail –f nginx.conf 动态查看日志,方便查看日志新增的信息
ctrl+c 结束查看

杀死进程命令:

  1. kill PID号 一般类型的杀死进程
  2. kill -15 PID号 较为强硬的杀死 可以善后
  3. kill -9 PID号 强制杀死 后果自负.

查询任意服务

命令: ps -ef |grep mysql

  • LoadBalancerClient应用
  @Autowired
  private LoadBalancerClient loadBalancerClient;
  
  @Value("${spring.application.name:8090}")
  private String appName;
   
  @GetMapping("/consumer/doRestEcho02")
 public String doRestEcho02(){
     ServiceInstance serviceInstance = loadBalancerClient.choose("sca-provider");
     String url = String.format("http://%s:%s/provider/echo/%s",serviceInstance.getHost(),serviceInstance.getPort(),appName);
     System.out.println("request url:"+url);
     return restTemplate.getForObject(url, String.class);
     }
 }

@LoadBalanced

当使用RestTemplate进行远程服务调用时,假如需要负载均衡,还可以在RestTemplate对象构建时,使用@LoadBalanced对构建RestTemplate的方法进行修饰,例如在ConsumerApplication中构建名字为loadBalancedRestTemplate的RestTemplate对象:

@Bean
@LoadBalanced
public RestTemplate loadBalancedRestTemplate(){
    return new RestTemplate();
}

@Autowired
private RestTemplate loadBalancedRestTemplate;

@GetMapping("/consumer/doRestEcho3")
public String doRestEcho03(){
    String url=String.format("http://%s/provider/echo/%s","sca-provider",appName);
    //向服务提供方发起http请求,获取响应数据
    return loadBalancedRestTemplate.getForObject(
            url,//要请求的服务的地址
            String.class);//String.class为请求服务的响应结果类型
}

小节面试分析

@Bean注解的作用?(一般用于配置类内部,描述相关方法,用于告诉spring此方法的返回值要交给spring管理,bean的名字默认为方法名,假如需要指定名字可以@Bean(“bean的名字”),最多的应用场景是整合第三方的资源-对象)
@Autowired注解的作用?(此注解用于描述属性,构造方法,set方法等,用于告诉spring框架,按找一定的规则为属性进行DI操作,默认按属性,方法参数类型查找对应的对象,假如只找到一个,则直接注入,类型多个时还会按照属性名或方法参数名进行值的注入,假如名字也不同,就出报错.)
Nacos中的负责均衡底层是如何实现的?(通过Ribbon实现,Ribbon中定义了一些负载均衡算法,然后基于这些算法从服务实例中获取一个实例为消费方法提供服务)
Ribbon 是什么?(Netflix公司提供的负载均衡客户端,一般应用于服务的消费方法)
Ribbon 可以解决什么问题? (基于负载均衡策略进行服务调用, 所有策略都会实现IRule接口)
Ribbon 内置的负载策略都有哪些?(8种,可以通过查看IRule接口的实现类进行分析)
@LoadBalanced的作用是什么?(描述RestTemplate对象,用于告诉Spring框架,在使用RestTempalte进行服务调用时,这个调用过程会被一个拦截器进行拦截,然后在拦截器内部,启动负载均衡策略。)
我们可以自己定义负载均衡策略吗?(可以,基于IRule接口进行策略定义,也可以参考NacosRule进行实现)

  • @RefreshScope的作用是在配置中心的相关配置发生变化以后,能够及时看到类中属性值的更新(底层是通过重新创建Controller对象的方式,对属性进行了重新初始化)。
@RefreshScope
@RestController
public class ProviderLogController{
  //.....
}

  • 小节面试分析
    配置中心一般都会配置什么内容?(可能会经常变化的配置信息,例如连接池,日志、线程池、限流熔断规则)
    什么信息一般不会写到配置中心?(服务端口,服务名,服务的注册地址,配置中心)
    项目中为什么要定义bootstrap.yml文件?(此文件被读取的优先级比较高,可以在服务启动时读取配置中心的数据)
    Nacos配置中心宕机了,我们的服务还可以读取到配置信息吗?(可以从内存,客户端获取了配置中心的配置信息以后,会将配置信息在本地内存中存储一份.)
    微服务应用中我们的客户端如何获取配置中心的信息?(我们的服务一般首先会从内存读取配置信息,同时我们的微服务还可以定时向nacos配置中心发请求拉取(pull)更新的配置信息)
    微服务应用中客户端如何感知配置中心数据变化?(1.4.x版本的nacos客户端会基于长轮询机制从nacos获取配置信息,所谓的长轮询就是没有配置更新时,会在nacos服务端的队列进行等待.)
    服务启动后没有从配置中心获取我们的配置数据是什么原因?(依赖,配置文件名字bootstrap.yml,配置中心的dataId名字是否正确,分组是否正确,配置的名字是否正确,缩进关系是否正确,假如是动态发布,类上是否有@RefreshScope注解)
    你项目中使用的日志规范是什么?(SLF4J)
    你了解项目中的日志级别吗?(debug,info,error,…,可以基于日志级别控制日志的输出)
  • Sentinel
    何为降级熔断?(让外部应用停止对服务的访问,生活中跳闸,路障设置-此路不通)
    为什么要进行熔断呢?(平均响应速度越来越慢或经常出现异常,这样可能会导致调用链堆积,最终系统崩溃)
    Sentinel中限流,降级的异常父类是谁?(BlockException)
    Sentinel 出现降级熔断时,系统底层抛出的异常是谁?(DegradeException)
    Sentinel中异常处理接口是谁?(BlockExceptionHandler)
    Sentinel中异常处理接口下默认的实现类为? (DefaultBlockExceptionHandler)
    假如Sentinel中默认的异常处理规则不满足我们的需求怎么办?(自己定义)
    我们如何自己定义Sentinel中异常处理呢?(直接或间接实现BlockExceptionHandler )
    Sentinel熔断降级策略有哪些?(慢调用比例、异常比例、异常数)
  • Gateway
    谓词工厂
  1. 基于Datetime类型的断言工厂
  2. 基于header的断言工厂HeaderRoutePredicateFactory
  3. 基于Method请求方法的断言工厂
  4. 基于Query请求参数的断言工厂,QueryRoutePredicateFactory接收两个参数
    请求param和正则表达式, 判断请求参数是否具 有给定名称且值与正则表达式匹配。例如:Query=pageSize,\d+
  • redis
Expire (设置生效时长-单位秒)


127.0.0.1:6379> set bomb tnt
OK
127.0.0.1:6379> expire bomb 10
(integer) 1
127.0.0.1:6379> ttl bomb
(integer) 5
127.0.0.1:6379> ttl bomb
(integer) 3
127.0.0.1:6379> ttl bomb
(integer) 3
127.0.0.1:6379> ttl bomb
(integer) 2
127.0.0.1:6379> ttl bomb
(integer) 1
127.0.0.1:6379> ttl bomb
(integer) -2
127.0.0.1:6379> ttl bomb
(integer) -2
127.0.0.1:6379>

其中,TTL查看key的剩余时间,当返回值为-2时,表示键被删除。
当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。

  • Linux环境变量
    复习笔记JAVA_第7张图片

你可能感兴趣的:(笔记,java,排序算法,算法)