剑指 Offer12
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。(保证数组的稳定性)
//输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,
// 所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
public class Offer12 {
public static void main(String[] args) {
int[] a ={1,2,3,4,5,6,7,8,9};
Offer12 offer12 = new Offer12();
offer12.solution1(a);
System.out.println(Arrays.toString(a));
int[] ints = offer12.solution2(a);
System.out.println(Arrays.toString(ints));
}
public void solution1(int[] a){
for (int i = a.length-1; i >1 ; i--) {
for (int j = 0 ;j<i ; j++){
if (a[j]%2==0&&a[j+1]%2==1){
int temp =a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
public int[] solution2(int[] a){
int count=0;
int j=0;
int[] b =new int[a.length];
for (int i = 0; i <a.length ; i++) {
if (a[i]%2==1){
count++;
}
}
for (int i = 0; i <a.length ; i++) {
if (a[i]%2==1){
b[j++]=a[i];
}else{
b[count++]=a[i];
}
}
return b;
}
}
垃圾回收器概述
GC分类与性能指标
吞吐量:运行用户代码的事件占总运行时长时间的比例
暂停时间:执行垃圾收集器时,程序的工作线程被暂停的时间
内存占用:java堆区所占的大小
一般一款优秀的垃圾回收器满足其中的两项
垃圾回收器的分类
串行回收器:Serial 、Serial Old
并行回收器:ParNew、Parallel Scavenge、Parallel Old
并发回收器:CMS、G1
7款经典收集器与垃圾分代之间的关系
新生代收集器:Serial、ParNew、Paralle1 Scavenge;
老年代收集器:Serial old、Parallel old、CMS;
整堆收集器:G1;
Serial回收器:串行回收
Serial收集器采用复制算法、串行回收和"stop-the-World"机制的方式执行内存回收。
除了年轻代之外,Serial收集器还提供用于执行老年代垃圾收集的Serial old收集器。Serial old收集器同样也采用了串行回收和"stop the World"机制,只不过内存回收算法使用的是标记-压缩算法。
ParNew回收器:并行回收
-
Par是Parallel的缩写,New:只能处理的是新生代
-
ParNew 收集器除了采用并行回收的方式执行内存回收外,两款垃圾收集器之间几乎没有任何区别。ParNew收集器在年轻代中同样也是采用复制算法、"stop-the-World"机制。
Parallel回收器:吞吐量优先
JDK8中默认采用Parallel收集器和Parallel Old收集器组合使用
Parallel old收集器采用了标记-压缩算法,但同样也是基于并行回收和"stop-the-World"机制。
G1回收器:区域化分代式
JDk8之后使用的
G1垃圾回收器的回收过程
- 年轻代GC(Young GC)
- 老年代并发标记过程(Concurrent Marking)
- 混合回收(Mixed GC)
优点
并行与并发 - 并行性:G1在回收期间,可以有多个GC线程同时工作,有效利用多核计算能力。此时用户线程STW
- 并发性:G1拥有与应用程序交替执行的能力,部分工作可以和应用程序同时执行,因此,一般来说,不会在整个回收阶段发生完全阻塞应用程序的情况
分代收集 - 从分代上看,G1依然属于分代型垃圾回收器,它会区分年轻代和老年代,年轻代依然有Eden区和Survivor区。但从堆的结构上看,它不要求整个Eden区、年轻代或者老年代都是连续的,也不再坚持固定大小和固定数量。
- 将堆空间分为若干个区域(Region),这些区域中包含了逻辑上的年轻代和老年代。
- 和之前的各类回收器不同,它同时兼顾年轻代和老年代。对比其他回收器,或者工作在年轻代,或者工作在老年代;
VUE中的时间修饰符
修饰符:作为用来和时间连用,决定促发条件或者是阻止时间的触发机制。
- stop事件修饰符:用来阻止事件冒泡
<body>
<div id="app">
<div class="div1" @click="divClick">
<input type="button" value="点击我" @click.stop="btnClick">
</div>
</div>
<script type="text/javascript">
const app = new Vue({
el: "#app",
data: {},
methods: {
btnClick(){
alert("按钮被点击了")
},
divClick(){
alert("div被点击了")
}
}
})
</script>
- prevent事件修饰符,用来阻止标签的默认行为
<a href="http://www.baidu.com" @click.prevent="a">百度</a>
- self事件修饰符,用来针对与当前标签的事件触发,只触发自己标签上特定修饰符的事件,只关心自己标签上的事件。
- once事件修饰符,只让事件触发一次
按键修饰符
**作用:**用来与键盘中按键事件绑定在一起,用来修饰特定的按键.
- .enter
- .tab
- .detele
- .esc
- .space
- .up
- .down
- .left
- .right
axios
引言: axios是一个一部请求技术,核心技术是用来再页面中发送异步请求,并获取对应数据再页面中的渲染,相当于局部更新技术Ajax
执行get请求
// 为给定 ID 的 user 创建请求
axios.get('/user?ID=12345')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
// 可选地,上面的请求可以这样做
axios.get('/user', {
params: {
ID: 12345
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
执行post请求
axios.post('/user', {
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});