1)toString(数组名) : 打印数组中所有的元素
2)sort(数组名) :对数组中的元素进行排序
3)copyOf(原来数组的名字,新数组的长度)
如果新长度=旧长度–普通复制
如果新长度>旧长度–扩容
如果新长度<旧长度–缩容
注意:本方法并不会改变原来数组,而是创建指定长度的新数组
1)如果有n个数,最多比较n-1轮
2)每一轮中如何比较?
从头开始,把所有数过一遍【相邻比较,位置不对就互换】
3)之前轮中比较出来的最大值,不需要参与下一轮的比较
4)写法:外层循环控制的是比较的轮数,内层循环控制的是比较的次数
拓展:可以了解一些其他的排序算法,比如二分排序,快速排序,归并排序,全排序
抽象类是一个特殊的类,使用class定义,特殊在这个类中可以定义没有方法体的方法(抽象方法)
接口可以理解成一个特殊的抽象类,特殊在接口中所有的方法都是抽象方法,但注意接口不是类,用interface定义
抽象类中有构造方法,为了给子类创建对象时调用
接口中没有构造方法的,子类调用的是父类的构造方法
接口可以多继承,但抽象类只能单继承
抽象类可以定义普通的成员变量,但接口只能定义静态常量
接口与抽象类均不可以实例化/创建对象
抽象是后天重构的结果,接口是先天设计的结果
空指针异常
IO异常
sql异常
数据库连接异常
数组越界异常
字符串越界异常
找不到类异常
算数异常
String s = “abc”; StringBuilder sb = new StringBuilder(s);
StringBuilder转String:
StringBuilder sb = new StringBuilder();
sb.append(“abc”);
String s = sb.toString();
总结一句话,拼接多用StringBuilder,用完转回String用String丰富的方法
Integer i2 = new Integer(4);没有高效的效果,只是创建了一个包装类的对象
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只能修饰变量,不能修饰类和方法。
注意:
1.javaBean(称之为pojo , entity) 实现序列化接口
2.json数据: web层响应数据到客户端,一般数据是json数据
通常使用json工具把javaBean转换成json,要求javaBean要实现序列化接口
比如: jackSon工具, 带忽略某个字段注解,这个字段不参与序列化@JsonIgnore
比如: jsonLib工具,里面有个api: JsonConfig 灵活指定那些字段不被序列化
比如: fastJSON工具
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;
}*/
cat 输出文件所有的内容
more 输出文档所有的内容,分页输出,空格浏览下一屏,q退出
less 用法和more相同,只是通过PgUp、PgOn键来控制
tail 用于显示文件后几号,使用频繁
tail -10 nginx.conf 查看nginx.conf的最后10行
tail –f nginx.conf 动态查看日志,方便查看日志新增的信息
ctrl+c 结束查看
命令: ps -ef |grep mysql
@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);
}
}
当使用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
@RestController
public class ProviderLogController{
//.....
}
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 。