日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java集合和泛型练习及面试题——博客园:师妹开讲啦

發(fā)布時(shí)間:2023/12/9 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java集合和泛型练习及面试题——博客园:师妹开讲啦 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

給定一段JAVA代碼如下:要打印出list中存儲(chǔ)的內(nèi)容,以下語(yǔ)句正確的是(?B??)

ArrayList?list?=?new?ArrayList(?)??

list.add(“a”)??

list.add(“b”)??

Iterator?it?=?list.iterator(?)?

A.while(it.?Next(?)?)?  system.out.println(it.next(?)?)

B.for(int?i=0;?i<list.size(?)??i++)?  system.out.println(list.get(i))??

C.while(list.hasNext(?)?)?  system.out.println(list.next(?)?)?

D.for(int?i=0;?i<list.size(?)??i++)?  system.out.println(it(i))??

下面代碼運(yùn)行結(jié)果正確的是(C?)--博客園:師妹開講啦

?import?java.util.*;?

public?class?TestListSet{?

  public?static?void?main(String?args[]){?

    List?list?=?new?ArrayList();?

    list.add(“Hello”);

    list.add(“Learn”);

    ?list.add(“Hello”);

    ?list.add(“Welcome”);

    Set?set?=?new?HashSet();?

    set.addAll(list);?

    System.out.println(set.size());?

  }?

}??

A.編譯不通過(guò)                   B.編譯通過(guò),運(yùn)行時(shí)異常  

C.編譯運(yùn)行都正常,//輸出HashSet中不能放重復(fù)值  D.編譯運(yùn)行都正常,輸出4

在java中,(?B)接口位于集合框架的頂層

A.Map  B.Collection  C.Set  D.List

在JAVA中,以下(?C?)類的對(duì)象以鍵-值的方式存儲(chǔ)對(duì)象

A.java.util.List?  B.java.util.ArrayList  C.java.util.HashMap  D.java.util.LinkedList

在JAVA中ArrayList類實(shí)現(xiàn)了可變大小的數(shù)組,便于遍歷元素和隨機(jī)訪問(wèn)元素,已知獲得了ArrayList類的對(duì)象bookTypeList,則下列語(yǔ)句中能夠?qū)崿F(xiàn)判斷列表中是否存在字符串“小說(shuō)”的是(C?)

A.bookTypeList.add("小說(shuō)");?      B.bookTypeList.get("小說(shuō)");?

C.bookTypeList.contains("小說(shuō)");?  ?? D.bookTypeList.remove("小說(shuō)");?

下面敘述哪些是正確的?(ABC??)

A.java中的集合類(如Vector)可以用來(lái)存儲(chǔ)任何類型的對(duì)象,且大小可以自動(dòng)調(diào)整。但需要事先知道所存儲(chǔ)對(duì)象的類型,才能正常使用

B.在java中,可以用異常(Exception)來(lái)拋出一些并非錯(cuò)誤的消息,但這樣比直接從函數(shù)返回一個(gè)結(jié)果要花費(fèi)更大的系統(tǒng)開銷。

C.java接口包含函數(shù)聲明和常量聲明。

D.java中,子類不可以訪問(wèn)父類的私有成員和受保護(hù)的成員

在JAVA中,LinkedList類和ArrayList類同屬于集合框架類,下列(ABC?)選項(xiàng)中的方法是LinkedList類ArrayList類都有的

A.add(Object?o)  B.add(int?index,Object?o)  C.remove(Object?o)?  D.removeLast()

請(qǐng)分析下面程序編譯并運(yùn)行的結(jié)果

class MyNumberException<T> extends Exception{

  public MyNumberException(String message){

    super(message);

  }

}

public class GenericsTest{

  public static void main(String[] args){

    int num=1;

    try{

      if(num<10){

        throw new MyNumberException("數(shù)字小于10");

      }

    }catch(MyNumberException e){

      System.out.println(e);

    }catch(Exception e){

      System.out.println(e);

    }

  }

}

解析:在Java中泛型類繼承Throwable及其子類都是不合法的,所以上面的程序編譯無(wú)法通過(guò)

已知:--博客園:師妹開講啦

public class ListTest{

  public static void main(String[] args){

    LinkedList<String> link=new LinkedList<String>();

    link.add("1");

    link.add("2");

    link.add("3");

    link.addFirst("F");

    link.addLast("L");

    for(int i=0;i<link.size();i++){

      link.remove(i);

    }

    System.out.println(link);

  }

}

程序運(yùn)行結(jié)果:[1,3]

解析:添加完元素后,集合中的元素順序?yàn)閇F,1,2,3,L],各個(gè)元素對(duì)應(yīng)索引位置為0,1,2,3,4 執(zhí)行第一次循環(huán),i=0,刪除F,集合變?yōu)閇1,2,3,L],各個(gè)元素對(duì)應(yīng)的索引位置為0,1,2,3 ? 執(zhí)行第二次循環(huán):i=1,刪除2,集合變?yōu)閇1,3,L],各個(gè)元素對(duì)應(yīng)的索引位置為0,1,2 ?執(zhí)行第三次循環(huán):i=2,刪除L,集合變?yōu)閇1,3],各個(gè)元素對(duì)應(yīng)的索引位置為0,1 所以程序結(jié)束,結(jié)果為[1,3]

利用Map,完成下面的功能:

?從命令行讀入一個(gè)字符串,表示一個(gè)年份,輸出該年的世界杯冠軍是哪支球隊(duì)。如果該年沒有舉辦世界杯,則輸出:沒有舉辦世界杯。

?附:世界杯冠軍以及對(duì)應(yīng)的奪冠年份--博客園:師妹開講啦

public?class?Bk?{

  public?static?void?main(String[]?args)?{?

    BufferedReader?br=new?BufferedReader(new?InputStreamReader(System.in));?

    String?year=null;?

?    try?{?

      year=br.readLine();??

    }?catch?(IOException?e)?{??

      e.printStackTrace();??

    }

    Map<String,String>?map=new?HashMap<String,?String>();??

    map.put("2002",?"巴西");?

    map.put("2006",?"意大利");?

    map.put("2010","南非");??

    if(map.containsKey(year)){??

      System.out.println(map.get(year));??

    }??

    else{?

      System.out.println("這一年沒有承辦世界杯!");??

    }?

  }???

}

完善下列代碼,實(shí)現(xiàn)List?中的內(nèi)容放到一個(gè)Map?中,該Map?的鍵為id值為相應(yīng)的Account?對(duì)象。最后遍歷這個(gè)Map,打印所有Account?對(duì)象的id?和余額

public class Test{

  public static void main(String[] args) {

    List list=new ArrayList();

    list.add(new Account(10.00,"1234"));

    list.add(new Account(15.00,"5678"));

    list.add(new Account(0.0,"1010"));

    Map map=new HashMap();

    for(int i=0;i<list.size();i++){

      Account account=(Account)list.get(i);

      map.put(account.getId(), account);

    }

    Set<Map.Entry<Long,Object>> set=map.entrySet();

    for(Map.Entry<Long, Object> obj:set){

      Account acc=(Account)obj.getValue();

      System.out.println(obj.getKey()+"/"+acc.getBalance());

    }

  }

}

class Account{

  private long id;

  private double balance;

  private String password;

  public Account(){}

  public Account(double balance,String password){

    this.id=new Random().nextLong();

    this.balance=balance;

    this.password=password;

  }

  public long getId() {

    return id;

  }

  public void setId(long id) {

    this.id = id;

  }

  public double getBalance() {

    return balance;

  }

  public void setBalance(double balance) {

    this.balance = balance;

  }

  public String getPassword() {

    return password;

  }

  public void setPassword(String password) {

    this.password = password;

  }

}

寫出下面程序的輸出結(jié)果

import?java.util.*;?

class?MyClass{?

  int?value;?

  public?MyClass(){}?

  public?MyClass(int?value){?

    this.value?=?value;?

  }?

  public?String?toString(){?

    return?value;

  }?

}?

public?class?TestList{?

  public?static?void?main(String?args[]){?

    MyClass?mc1?=?new?MyClass(10);?

    MyClass?mc2?=?new?MyClass(20);

    MyClass?mc3?=?new?MyClass(30);?

    List?list?=?new?ArrayList();?

    list.add(mc1);?

    list.add(mc2);?

    list.add(mc3);?

    MyClass?mc4?=?(MyClass)?list.get(1);

    //MyClass?mc4=(MyClass)mc2;?

    mc4.value?=?50;?

    for(int?i?=?0;?i<list.size();?i++){?

      System.out.println(list.get(i));?

    }?

  }?

}

程序運(yùn)行結(jié)果:

10

50

30

使用HashMap完成學(xué)生信息的管理功能,主要功能包括:添加學(xué)生數(shù)據(jù)、打印學(xué)生名單、刪除學(xué)生數(shù)據(jù)、按學(xué)號(hào)查詢學(xué)生信息四個(gè)功能。并實(shí)現(xiàn)持久化保存--博客園:師妹開講啦

//Java序列化是指把Java對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程;而Java反序列化是指把字節(jié)序列恢復(fù)為Java對(duì)象的過(guò)程

public class Student implements Serializable{

private static final long serialVersionUID = 1L;

private String sno;

private String name;

private String gender;

private int age;

public Student(String sno,String name,String gender,int age){

super();

this.sno=sno;

this.name=name;

this.gender=gender;

this.age=age;

}

public String getSno() {

return sno;

}

public void setSno(String sno) {

this.sno = sno;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getGender() {

return gender;

}

public void setGender(String gender) {

this.gender = gender;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String toString(){

return sno+"\t"+name+"\t"+gender+"\t"+age;

}

}

?

public interface DAOStudent {

public boolean saveAll(HashMap<String, Student> students);

public HashMap<String, Student> getAll();

}

?

public class ImplDAOStudent implements DAOStudent{

@Override

public HashMap<String, Student> getAll() {

HashMap<String,Student> hm=new HashMap<String, Student>();

File file=new File("student.txt");

ObjectInputStream ois=null;

try{

ois=new ObjectInputStream(new FileInputStream(file));

if(file.length()!=0){

hm=(HashMap<String, Student>)ois.readObject();

}

ois.close();

}catch(Exception e){

e.printStackTrace();

}

return hm;

}

@Override

public boolean saveAll(HashMap<String, Student> students){

File file=new File("student.txt");

long l=file.length();

ObjectOutputStream oos=null;

try{

oos=new ObjectOutputStream(new FileOutputStream(file));

oos.writeObject(students);

oos.close();

}catch(Exception e){

e.printStackTrace();

}

if(file.length()>l){

return true;

}

else {

return false;

}

}

}

?

public class StudentControl {

private static DAOStudent DAOstu=new ImplDAOStudent();

private static HashMap<String,Student> students;

public ?static StudentControl st=new StudentControl();

static{

students=DAOstu.getAll();

}

private StudentControl(){}

public static StudentControl getInstance(){

return st;

}

public boolean addStudent(Student s){

if(!students.containsKey(s.getSno())){

students.put(s.getSno(), s);

return true;

}else{

return false;

}

}

public ArrayList<Student> getAll(){

ArrayList<Student> al=new ArrayList<Student>();

Set<Map.Entry<String, Student>> set=students.entrySet();

Iterator<Map.Entry<String,Student>> it=set.iterator();

while(it.hasNext()){

Map.Entry<String,Student> entry= it.next();

Student stu=entry.getValue();

al.add(stu);

}

return al;

}

public boolean deleteStudent(String sno){

if(students.containsKey(sno)){

students.remove(sno);

return true;

}else{

return false;

}

}

public Student queryStudentBySno(String sno){

if(students.containsKey(sno)){

return students.get(sno);

}else

return null;

}

public boolean exitSystem(){

return DAOstu.saveAll(students);

}

}

?

public class ViewStudent {

public void menu(){

System.out.println("*********************");

System.out.println("請(qǐng)選擇需要的功能:");

System.out.println("1.添加學(xué)生數(shù)據(jù)");

System.out.println("2.打印學(xué)生名單");

System.out.println("3.刪除學(xué)生數(shù)據(jù)");

System.out.println("4.打印對(duì)應(yīng)學(xué)號(hào)的學(xué)生數(shù)據(jù)");

System.out.println("0.退出系統(tǒng)");

System.out.println("**********************");

}

}

?

public class ManageStudent{

public static void main(String[] args) {

Scanner sc=new Scanner(System.in);

StudentControl sco=StudentControl.getInstance();

while(true){

new ViewStudent().menu();

int count=sc.nextInt();

switch(count){

case 1: System.out.println("請(qǐng)輸入學(xué)生信息:");

System.out.print("姓名:");

String name=sc.next();

System.out.print("學(xué)號(hào):");

String sno=sc.next();

System.out.print("性別:");

String gender=sc.next();

System.out.print("年齡:");

int age=sc.nextInt();

Student student=new Student(sno,name,gender,age);

if(sco.addStudent(student)){

System.out.println("操作成功");

}else{

System.out.println("操作失敗");

}

break;

case 2:

System.out.println("學(xué)號(hào)\t\t姓名\t性別\t年齡");

ArrayList<Student> list=sco.getAll();

Iterator<Student> it=list.iterator();

while(it.hasNext()){

Student stu=it.next();

System.out.println(stu.toString());

}

break;

case 3:System.out.println("請(qǐng)輸入需要?jiǎng)h除的學(xué)生的學(xué)號(hào):");

String string=sc.next();

if(sco.deleteStudent(string)){

System.out.println("操作成功");

}else{

System.out.println("操作失敗");

}

break;

case 4:System.out.println("輸入你要查找的學(xué)號(hào):");

String str=sc.next();

Student stu=sco.queryStudentBySno(str);

System.out.println("學(xué)號(hào)\t\t姓名\t性別\t年齡");

System.out.println(stu.toString());

break;

case 0:

sco.exitSystem();

System.exit(0);

default:System.out.println("輸入有誤,請(qǐng)重新輸入");

}

}

}

}

?

輸入學(xué)生信息,按學(xué)生成績(jī)排序

public class Stu{

private String name;

private int score;

public Stu(){}

public Stu(String name,int score){

this.name=name;

this.score=score;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getScore() {

return score;

}

public void setScore(int score) {

this.score = score;

}

public String toString(){

return name+":"+score;

}

}

?

public class CompareScore implements Comparator<Stu>{

public boolean equals(Object obj){

return super.equals(obj);

}

@Override

public int compare(Stu s1, Stu s2) {

if(s1.getScore()>s2.getScore()){

return -1;

}else if(s1.getScore()<s2.getScore()){

return 1;

}else{

return s2.getName().compareTo(s1.getName());

}

}

}

?

public class DemoTreeSet {

public static void main(String[] args) {

Scanner sc=new Scanner(System.in);

TreeSet<Stu> ts=new TreeSet<Stu>(new CompareScore());

while(true){

System.out.print("給出你的選擇(1.添加信息、2.降序輸出、3.退出程序)");

int num=sc.nextInt();

switch(num){

case 1:

System.out.print("輸入學(xué)生的姓名:");

String name=sc.next();

System.out.print("輸入學(xué)生的成績(jī):");

int score=sc.nextInt();

ts.add(new Stu(name,score));

break;

case 2:System.out.println(ts);

break;

case 0:System.exit(0);

default:System.out.println("輸入有誤,請(qǐng)重新輸入");

}

}

}

}

?

使用泛型得到數(shù)組的最大和最小值

interface MaxOrMin<T extends Comparable<T>>{

T min(T[] t);

T max(T[] t);

}

public class TextMinOrMax {

public static void main(String[] args) {

Integer[] in=new Integer[]{43,52,66,71,39,33};

Character[] ch=new Character[]{'f','v','d','t','z'};

ComparableElement<Integer> ce1=new ComparableElement<Integer>();

System.out.println("int數(shù)組的最大值:"+ce1.max(in)+",最小值:"+ce1.min(in));

ComparableElement<Character> ce2=new ComparableElement<Character>();

System.out.println("char數(shù)組的最大值:"+ce2.max(ch)+",最小值:"+ce2.min(ch));

}

}

class ComparableElement<T extends Comparable<T>> implements MaxOrMin<T>{

T max;

T min;

@Override

public T max(T[] t) {

?max=t[0];

?for(int i=0;i<t.length;i++){

?if(max.compareTo(t[i])<0){

?max=t[i];

?}

?}

return max;

}

@Override

public T min(T[] t) {

?min=t[0];

?for(int i=0;i<t.length;i++){

?if(min.compareTo(t[i])>0){

?min=t[i];

?}

?}

return min;

}

}

IteratorListIterator有什么區(qū)別?

Iterator:只能正向遍歷集合,適用于獲取移除元素。ListIerator:繼承Iterator,可以雙向列表的遍歷,同樣支持元素的修改。

Collection和Collections的區(qū)別

答:Collection:是java.util包中的接口,是集合類的基本接口,主要的子接口有List和Set

Collections:是java.util包中的類,是針對(duì)集合的一個(gè)實(shí)用工具類,它包含了對(duì)各種集合的搜索、排序和線程安全等一系列的靜態(tài)方法。

ArrayList與Vector的異同--博客園:師妹開講啦

答:相同點(diǎn):ArrayList和Vector都是List的子類,都是有序的集合,可以存儲(chǔ)相同的元素,相當(dāng)于動(dòng)態(tài)數(shù)組,他們都可以按索引位置取得指定的元素。

區(qū)別:(1)出現(xiàn)的時(shí)間:Vector是在JDK1.0就已存在,而ArrayList到了JDK1.2才推出。

(2)同步性:Vector是線程安全的,也就是說(shuō)它的方法之間是線程同步的,而ArrayList是線程不安全的,它的方法之間是線程不同步的。在程序設(shè)計(jì)中,如果是只有一個(gè)線程會(huì)訪問(wèn)到集合,最好選擇使用ArrayList,因?yàn)樗豢紤]線程安全,效率會(huì)高些;如果多個(gè)線程會(huì)訪問(wèn)到集合,最好選擇使用Vector,因?yàn)椴恍枰_發(fā)人員自己編寫線程安全的代碼。

(3)數(shù)據(jù)增長(zhǎng):ArrayList與Vector都存在初始的容量大小,且都為10,當(dāng)存儲(chǔ)進(jìn)集合里的元素的個(gè)數(shù)超過(guò)了容量時(shí),就需要增加ArrayList與Vector的存儲(chǔ)空間。每次要增加存儲(chǔ)空間時(shí),不是只增加一個(gè)存儲(chǔ)單元,而是增加多個(gè)存儲(chǔ)單元。這就要求每次增加的存儲(chǔ)單元的個(gè)數(shù)在內(nèi)存空間利用與線程效率之間要取得一定的平衡。Vector默認(rèn)增長(zhǎng)為原來(lái)一倍,而ArrayList的增長(zhǎng)策略在文檔中沒有明確規(guī)定(從源代碼看到的是增長(zhǎng)為原來(lái)的一半)

(4)輸出方式:Vector可以使用Iterator、foreach和Enumeration方式輸出,而ArrayList只能使用Iterator、foreach方式輸出

簡(jiǎn)述HashMap與Hashtable的異同--博客園:師妹開講啦

答:相同點(diǎn):HashMap與Hashtable都是Map接口的實(shí)現(xiàn)類,而HashMap是Hashtable的輕量級(jí)實(shí)現(xiàn)(非線程安全的實(shí)現(xiàn))。兩者都是用key-value方式獲取數(shù)據(jù)。

區(qū)別:(1)出現(xiàn)的時(shí)間:Hashtable在JDK1.0時(shí)出現(xiàn),屬于舊的操作類,而HashMap是在JDK1.2時(shí)推出的類,屬于較新的操作類

(2)同步性:Hashtable是線程安全的,也就是說(shuō)是同步的,性能相對(duì)較低,而HashMap是線程不安全的,不是同步的,性能相對(duì)較高。

(3)值:Hashtable不允許存放null值和null鍵,而HashMap允許存在一個(gè)null鍵和多個(gè)null值

(4)HashMap沒法保證映射的順序一直不變,但是作為HashMap的子類LinkedHashMap,如果想要預(yù)知的順序迭代(默認(rèn)按照插入順序),你可以很輕易的置換為HashMap,如果使用Hashtable就沒那么容易了。

(5)迭代HashMap采用快速失敗機(jī)制,而Hashtable不是,所以這是設(shè)計(jì)的考慮點(diǎn)

ArrayList中的淺拷貝與深拷貝

淺拷貝:被復(fù)制對(duì)象的所有變量都含有與原來(lái)的對(duì)象相同的值,而所有的對(duì)其他對(duì)象的引用仍然指向原來(lái)的對(duì)象。換言之,淺復(fù)制僅僅復(fù)制所考慮的對(duì)象,而不復(fù)制它所引用的對(duì)象。??

深拷貝:被復(fù)制對(duì)象的所有變量都含有與原來(lái)的對(duì)象相同的值,除去那些引用其他對(duì)象的變量。那些引用其他對(duì)象的變量將指向被復(fù)制過(guò)的新對(duì)象,而不再是原有的那些被引用的對(duì)象。換言之,深復(fù)制把要復(fù)制的對(duì)象所引用的對(duì)象都復(fù)制了一遍.(eg:??1、直接賦值(字符串外都屬于淺拷貝)??2、使用構(gòu)造函數(shù)(深拷貝)??3、使用clone()方法(深拷貝)??)

ArrayList中為何加transient關(guān)鍵字?

?? transient是Java語(yǔ)言的關(guān)鍵字,變量修飾符,如果用transient聲明一個(gè)實(shí)例變量,當(dāng)對(duì)象存儲(chǔ)時(shí),它的值不需要維持。這里的對(duì)象存儲(chǔ)是指,Java的serialization提供的一種持久化對(duì)象實(shí)例的機(jī)制。當(dāng)一個(gè)對(duì)象被序列化的時(shí)候,transient型變量的值不包括在序列化的表示中,然而非transient型的變量是被包括進(jìn)去的。使用情況是:當(dāng)持久化對(duì)象時(shí),可能有一個(gè)特殊的對(duì)象數(shù)據(jù)成員,我們不想用serialization機(jī)制來(lái)保存它。為了在一個(gè)特定對(duì)象的一個(gè)域上關(guān)閉serialization,可以在這個(gè)域前加上關(guān)鍵字transient。

Java中的泛型是什么 ? 使用泛型的好處是什么?

泛型的本質(zhì)是參數(shù)化類型,也就是說(shuō)所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù)。這種參數(shù)類型可以用在類、接口和方法的創(chuàng)建中,分別稱為泛型類、泛型接口、泛型方法。 泛型的好處是在編譯的時(shí)候檢查類型安全,并且所有的強(qiáng)制轉(zhuǎn)換都是自動(dòng)和隱式的,提高代碼的重用率。

Java的泛型是如何工作的 ? 什么是類型擦除

Java中的泛型基本上都是在編譯器這個(gè)層次來(lái)實(shí)現(xiàn)的。在生成的Java字節(jié)碼中是不包含泛型中的類型信息的。使用泛型的時(shí)候加上的類型參數(shù),會(huì)在編譯器在編譯的時(shí)候去掉。這個(gè)過(guò)程就稱為類型擦除。

請(qǐng)舉例說(shuō)明static和泛型的沖突所在

泛型類確定T的類型實(shí)在運(yùn)行是時(shí)期,而static在編譯時(shí)期已經(jīng)存在。

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/xiaoshimei/p/6230735.html

總結(jié)

以上是生活随笔為你收集整理的Java集合和泛型练习及面试题——博客园:师妹开讲啦的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。