Collections、Arrays:是集合框架的工具類,里面的方法都是靜態(tài)的。
比較器:
public class ComparatorByLength implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
int temp=o1.length()-o2.length();
return temp==0?o1.compareTo(o2):temp;
}
}
CollectionsDemo:
public static void main(String[] args) {
/*
Collections:是集合框架的工具類。
里面的方法都是靜態(tài)的。
*/
demo_1();
demo_2();
demo_3();
demo_4();
}
private static void demo_4() {
List<String> list=new ArrayList<String>();
list.add("abcde");
list.add("cba");
list.add("zhangsan");
list.add("zhaoliu");
list.add("xiaoqiang");
System.out.println(list);
// Collections.replaceAll(list, "cba", "nba"); // set(indexOf("cba"),"nba");//替換
Collections.shuffle(list);//隨機(jī)把元素安放在集合的位置上
// Collections.fill(list, "cc");//全部替換成cc
System.out.println(list);
}
private static void demo_3() {
/*逆序
TreeSet<String> ts=new TreeSet<String>(new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
int temp=o2.compareTo(o1);
return temp;
}
});*/
TreeSet<String> ts=new TreeSet<String>(Collections.reverseOrder(new ComparatorByLength()));//逆序比較器再調(diào)用
ts.add("abc");
ts.add("hahaha");
ts.add("zzz");
ts.add("aa");
ts.add("cba");
System.out.println(ts);
}
private static void demo_2() {
List<String> list=new ArrayList<String>();
list.add("abcde");
list.add("cba");
list.add("aa");
list.add("zzz");
list.add("cba");
list.add("nbaa");
System.out.println(list);
int index=Collections.binarySearch(list, "cba");
System.out.println("index="+index);
// 獲取最大值
String max=Collections.max(list,new ComparatorByLength());
System.out.println("max="+max);
}
private static void demo_1() {
List<String> list=new ArrayList<String>();
list.add("abcde");
list.add("cba");
list.add("aa");
list.add("zzz");
list.add("cba");
list.add("nbaa");
System.out.println(list);
// 對list集合進(jìn)行指定順序的排序
// Collections.sort(list);
// mySort(list);
mySort(list,new ComparatorByLength());
}
//Collections中sort方法的原理
private static<T extends Comparable<? super T>> void mySort(List<T> list,Comparator<? super T> comp) {
for(int i=0;i<list.size();i++){
for(int j=i+1;j<list.size();j++){
//if(list.get(i).compareTo(list.get(j))>0)
if(comp.compare(list.get(i),list.get(j))>0){
/*
T temp=list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
*/
Collections.swap(list, i, j);
}
}
}
}
運(yùn)行:
如果數(shù)組中的元素是對象,那么轉(zhuǎn)成集合時(shí),直接將數(shù)組中的元素作為集合中的元素進(jìn)行集合存儲(chǔ)。
如果數(shù)組中的元素是基本類型數(shù)值,那么將該數(shù)組作為集合中的元素進(jìn)行存儲(chǔ)。
ArrayDemo:
//數(shù)組轉(zhuǎn)集合
public static void main(String[] args) {
/*
Arrays:集合框架的工具類。
里面的方法都是靜態(tài)的。
*/
int[] arr={3,1,5,6,3,6};
System.out.println(Arrays.toString(arr));
demo_2();
}
private static void demo_2() {
/*
如果數(shù)組中的元素是對象,那么轉(zhuǎn)成集合時(shí),直接將數(shù)組中的元素作為集合中的元素進(jìn)行集合存儲(chǔ)。
如果數(shù)組中的元素是基本類型數(shù)值,那么將該數(shù)組作為集合中的元素進(jìn)行存儲(chǔ)。
*/
int[] arr={31,11,51,61};
List<int[]> list=Arrays.asList(arr);
System.out.println(list.size());
}
private static void demo_1() {
/*
重點(diǎn):List asList(數(shù)組)將數(shù)組轉(zhuǎn)成集合。
好處:其實(shí)可以使用集合的方法操作數(shù)組中的元素。
注意:數(shù)組的長度是固定的,所以對于集合的增刪方法是不可以使用的
否則會(huì)發(fā)生UnsupportedOperationException
*/
String[] arr={"abc","haha","xixi"};
boolean b=myContains(arr,"xixi");
System.out.println("contains:"+b);
List<String> list=Arrays.asList(arr);
boolean b1=list.contains("xixi");
System.out.println("list contain:"+b1);
// list.add("hiahia");UnsupportedOperationException
System.out.println(list);
}
private static boolean myContains(String[] arr, String key) {
for(int i=0;i<arr.length;i++){
if(arr[i].equals(key))
return true;
}
return false;
}
//toString的經(jīng)典實(shí)現(xiàn),Api里的實(shí)現(xiàn)方法
public static String myToString(int[] a){
int iMax=a.length-1;
if(iMax==-1)
return "[]";
StringBuilder b=new StringBuilder();
b.append('[');
for(int i=0;;i++){//中間省了條件判斷,提高了效率
b.append(a[i]);
if(i==iMax)
return b.append(']').toString();
b.append(",");
}
}
運(yùn)行:
集合轉(zhuǎn)成數(shù)組:使用的是Collections接口中的toArray()
集合轉(zhuǎn)成數(shù)組:可以對集合中的元素操作的方法進(jìn)行限定。不允許對其進(jìn)行增刪。
ToArray:
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("abc1");
list.add("abc2");
list.add("abc3");
/*
toArray方法需要傳入一個(gè)指定類型的數(shù)組。
長度該如何定義?
如果長度小于集合的size,那么該方法創(chuàng)建一個(gè)同類型并和集合相同size的數(shù)組。
如果長度大于集合的size,那么該方法就會(huì)使用指定的數(shù)組,存儲(chǔ)集合中的元素,其他位置默認(rèn)為null。
所以建議,最好長度就指定為集合的size。
*/
String[] arr=list.toArray(new String[list.size()]);
System.out.println(Arrays.toString(arr));
}
運(yùn)行:
1.5特性:
foreach語句:
格式:
for(類型 變量 :Collection集合|數(shù)組){}
傳統(tǒng)for和高級for的區(qū)別?
傳統(tǒng)for可以完成對語句執(zhí)行很多次,因?yàn)榭梢远x控制循環(huán)的變量和條件。
高級for是一種簡化形式。它必須有被遍歷的目標(biāo)。該目標(biāo)要么是數(shù)組,要么是Collection單列集合。
對數(shù)組的遍歷如果僅僅是獲取數(shù)組中的元素,可以使用高級for。如果要對數(shù)組的角標(biāo)進(jìn)行操作建議使用傳統(tǒng)for。
Foreach:
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("abc1");
list.add("abc2");
list.add("abc3");
for(String s:list){//簡化書寫
System.out.println(s);
}
int[] arr={3,1,5,7,4};
for(int i:arr){
System.out.println(i);
}
// 可以使用高級for遍歷map集合嗎?不能直接用,但是可以將map轉(zhuǎn)成單列的set,就可以用了
Map<Integer,String> map=new HashMap<Integer,String>();
map.put(3,"zhagsan");
map.put(1,"wangyi");
map.put(7,"wagnwu");
map.put(4,"zhagsansan");
for(Integer key:map.keySet()){
String value=map.get(key);
System.out.println(key+": :"+value);
}
for(Map.Entry<Integer, String> me:map.entrySet()){
Integer key=me.getKey();
String value=me.getValue();
System.out.println(key+":"+value);
}
}
函數(shù)的可變參數(shù)。其實(shí)就是一個(gè)數(shù)組,但是接收的是數(shù)組的元素。自動(dòng)將這些元素封裝成數(shù)組。簡化了調(diào)用者的書寫。
注意:可變參數(shù)類型,必須定義在參數(shù)列表的結(jié)尾。
ParamterDemo:
public static void main(String[] args) {
int sum=add(4,5);
System.out.println("sum="+sum);
int sum1=add(4,5,6);
System.out.println("sum1="+sum1);
int[] arr={5,1,4,7,3};
int sum3=add(arr);
System.out.println("sum3="+sum3);
int[] arr1={5,9,1,4,7,3,9,8,7,6};
int sum4=add(arr1);
System.out.println("sum4="+sum4);
int sum5=newAdd(5,1,4,7,3);
System.out.println("sum5="+sum5);
int sum6=newAdd(5,9,1,2,7,3,9,8,7,6);
System.out.println("sum6="+sum6);
}
/*
函數(shù)的可變參數(shù)。
其實(shí)就是一個(gè)數(shù)組,但是接收的是數(shù)組的元素。
自動(dòng)將這些元素封裝成數(shù)組。簡化了調(diào)用者的書寫。
注意:可變參數(shù)類型,必須定義在參數(shù)列表的結(jié)尾。
*/
private static int newAdd(int b,int... a) {
int sum=0;
for(int i=0;i<a.length;i++){
sum+=a[i];
}
return sum;
}
private static int add(int[] arr) {
int sum=0;
for(int i=0;i<arr.length;i++){
sum+=arr[i];
}
return sum;
}
private static int add(int i, int j, int k) {
return i+j+k;
}
private static int add(int i, int j) {
return i+j;
}
運(yùn)行:
java Api提供的靜態(tài)方法可以用import導(dǎo)入
StaticImportDemo:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static java.util.Collections.*;//靜態(tài)導(dǎo)入,其實(shí)到入的是類中的靜態(tài)成員。
//import static java.util.Collections.max;//靜態(tài)導(dǎo)入,其實(shí)到入的是類中的靜態(tài)成員。
import static java.lang.System.*;
public class StaticImportDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("abc3");
list.add("abc7");
list.add("abc1");
out.println(list);
sort(list);
System.out.println(list);
String max=max(list);
out.println(max);
}
}
運(yùn)行:
List list = new ArrayList();//非同步的。
list = MyCollections.synList(list);//返回一個(gè)同步的list.
給非同步的集合加鎖的原理:
class MyCollections{
public static List synList(List list){
return new MyList(list);
}
private class MyList implements List{
private List list;
private static final Object lock = new Object();
MyList(List list){
this.list = list;
}
public boolean add(Object obj){
synchronized(lock)
{
return list.add(obj);
}
}
public boolean remove(Object obj){
synchronized(lock)
{
return list.remove(obj);
}
}
}
}