武漢做網(wǎng)站互助系統(tǒng)南昌seo外包公司
一、Lambda表達(dá)式
-
標(biāo)準(zhǔn)格式
? ??
()對應(yīng)方法的形參?;->固定格式
-
注意點(diǎn):
Lambda表達(dá)式可以用來簡化匿名內(nèi)部類的書寫
Lambda表達(dá)式只能簡化函數(shù)式接口的匿名內(nèi)部類的寫法
函數(shù)式接口:
有且僅有一個(gè)抽象方法的接口叫做函數(shù)式接口,接口上方可以加@Functionallnterface注解
-
Lambda表達(dá)式的基本作用
簡化函數(shù)式接口的匿名內(nèi)部類的寫法
-
Lambda表達(dá)式使用前提
必須是接口的匿名內(nèi)部類,接口中只能有一個(gè)抽象方法
-
Lambda的好處
Lambda是一個(gè)匿名函數(shù),我們可以把Lambda表達(dá)式理解為是一段
可以傳遞的代碼,它可以寫出更簡潔、更靈活的代碼,作為一種更緊
湊的代碼風(fēng)格,使Java語言表達(dá)能力得到了提升
-
Lambda表達(dá)式的省略寫法
省略核心:可推導(dǎo),可省略
1、參數(shù)類型可以省略不寫。
2、如果只有一個(gè)參數(shù),參數(shù)類型可以省略,同時(shí)()也可以省略。
3、如果Lambda表達(dá)式的方法體只有一行大括號,分號,return可以省略不寫,需要同時(shí)省略。
?
?二、集合
-
集合體系結(jié)構(gòu)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
-
Collection
Collection是單列集合的祖宗接口,它的功能是全部單列集合都可以繼承使用的
-
?Collection的遍歷方式
1、迭代器遍歷(迭代器在Java中的類是iterator,迭代器是集合專用的遍歷方式)
Collection<String> coll = new ArrayList<>();coll.add("aa");coll.add("bb");coll.add("cc");Iterator<String> it = coll.iterator();while (it.hasNext()){String str = it.next();System.out.println(str);}
注意:?
- 1、報(bào)錯(cuò)NoSuchElementException
- 2、迭代器遍歷完畢,指針不會(huì)復(fù)位
- 3、循環(huán)中只能用一次next方法
- 4、迭代器遍歷時(shí),不能用集合的方法進(jìn)行增加或者刪除
?
2、增強(qiáng)for遍歷
- 增強(qiáng)for的底層就是迭代器,為了簡化迭代器的代碼書寫的
- 其內(nèi)部原理就是一個(gè)Iterator迭代器
- 所有的單列集合和數(shù)組才能用增強(qiáng)for進(jìn)行遍歷
3、Lambda表達(dá)式遍歷
?
-
List系列集合:?
添加的元素是有序、可重復(fù)、有索引
1、特有方法:
- Collection的方法List都繼承了
- List集合因?yàn)橛兴饕?#xff0c;所以多了很多索引操作的方法
-
Set系列集合:
添加的元素是無序、不重復(fù)、無索引
-
?五中遍歷方式對比
-
ArrayList集合底層原理
1、利用空參創(chuàng)建的集合,在底層創(chuàng)建一個(gè)默認(rèn)長度為0的數(shù)組
2、添加第一個(gè)元素時(shí),底層會(huì)創(chuàng)建一個(gè)新的長度為10的數(shù)組?
3、存滿時(shí),會(huì)擴(kuò)容1.5倍
4、 如果一次添加多個(gè)元素,1.5倍還放不下,則新創(chuàng)建數(shù)組的長度以實(shí)際為準(zhǔn)?
-
LinkedList集合
- 底層數(shù)據(jù)結(jié)構(gòu)是雙鏈表,查詢慢,增刪快,但是如果操作的是首尾元素,速度也是極快的。
- LinkedList本身多了很多直接操作首元素的特有API。
?
?
題解:
B - 線段樹 1
?
?線段樹模版
代碼:?
#include<stdio.h>
const int N = 1e5+2;
int n, q;
long long s[N], a, b, c;
int f;struct nb
{int l, r;long long lazy;long long sum;
}t[4 * N];void he(int i)
{t[i].sum = t[i * 2].sum + t[i * 2 + 1].sum; //計(jì)算每個(gè)節(jié)點(diǎn)它的子節(jié)點(diǎn)的和
}void build(int i, int l, int r) //建立線段樹
{t[i].l = l;t[i].r = r;if (l == r){t[i].sum = s[l];t[i].lazy = 0;return;}int mid = (l + r) / 2; //將元素對半分給子節(jié)點(diǎn)(不是值,是索引)build(i * 2, l, mid);build(i * 2 + 1, mid + 1, r);he(i);
}void vis(int i) //用于區(qū)間修改
{if (t[i].lazy){t[i * 2].sum += t[i].lazy * (t[i * 2].r - t[i * 2].l + 1);t[i * 2 + 1].sum += t[i].lazy * (t[i * 2 + 1].r - t[i * 2 + 1].l + 1);t[i * 2].lazy += t[i].lazy;t[i * 2 + 1].lazy += t[i].lazy;t[i].lazy = 0;}
}long long find(int i, int a, int b) //查找區(qū)間和,并返回值
{long long d = 0;if (a <= t[i].l && b >= t[i].r) //如果該節(jié)點(diǎn)在該區(qū)間內(nèi),直接返回該節(jié)點(diǎn)的值return t[i].sum;if (t[i].r<a || t[i].l>b) //如果兩區(qū)間沒有交集,直接結(jié)束返回0return 0;vis(i);if (t[i * 2].r >= a) //部分在,接著往下搜索d += find(i * 2, a, b);if (t[i * 2 + 1].l <= b)d += find(i * 2 + 1, a, b);return d;
}void add(int i, int a, int b, int c) //修改區(qū)間
{if (t[i].l >= a && t[i].r <= b){t[i].sum = t[i].sum + c * (t[i].r - t[i].l + 1);t[i].lazy += c;return;}vis(i);if (t[i * 2].r >= a)add(i * 2, a, b, c);if (t[i * 2 + 1].l <= b)add(i * 2 + 1, a, b, c);he(i);}
int main()
{scanf("%d %d", &n, &q);for (int i = 1; i <= n; i++)scanf("%lld", &s[i]);build(1, 1, n);while (q--){scanf(" %d", &f);if (f == 2){scanf("%lld %lld", &a, &b);printf("%lld\n", find(1, a, b));}else{scanf("%lld %lld %lld", &a, &b, &c);add(1, a, b, c);}}return 0;
}
?