A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 黄玉昆   /  2013-3-14 15:42  /  8836 人查看  /  43 人回复  /   7 人收藏 转载请遵从CC协议 禁止商业使用本文

20、String s1 = newString("ABC");和String s2 = "ABC";中,先写第一句和后写第一句的区别和联系?
对于上面的代码,有一点要说的:就是无论String s2 = new String("abc")s1前面写还是后面写,s2都会检查StringPool中是否有"abc"
若有,就直接在堆内存中创建一个对象;若没有,则要先在StringPool中创建"abc"后,再在堆内存中创建一个对象。这和20题一样的。
但是对于这道题,s1在前,创建两个对象,s1在后,这创建一个对象,因为s2已经在常量池中创建了一个“abc”的字符串对象,则s1就不会在创建了,直接在堆内存中new一个对象。

回复 使用道具 举报
21、同步函数是静态的和是非静态的这两者所用的锁有何区别和联系?
1、非静态同步函数中的锁---> this
函数需被对象调用,那么函数都有一个所属的对象引用,就是this,因此同步函数使用的锁为this
2、静态同步函数中的锁:
如果同步函数被静态修饰后,经验证,使用的锁不是this了,因为静态方法中不可定义this,所以,这个锁不再是this了。静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象:类名.class;该对象的类型是Class
所以静态的同步方法使用的锁是该方法所在类的字节码文件对象,即类名.class

回复 使用道具 举报
22、在使用String类的split()方法是,下面这样写会成功分割为元素吗?如果成功,结果是什么?不成功的话,只使用split()方法,如何成功分割?        Strings = "A.B.C.D.E.java";     s.split(".");
这样截取是不会成功的,会报角标越界的异常,因为无法引号中的点不会被作为截取的标志,如果想让点成为被截取的标志,需要这样操作:s.split("\\.");就可以了。点是特殊字符,需要用\\来转义成普通字符

回复 使用道具 举报
23、List集合的特有迭代器是什么?
特有的迭代器是listIterator
  1. public static void methodListIterator()  
  2.     {  
  3.         //演示列表迭代器:  
  4.         ArrayList list = new ArrayList();  
  5.         //1.添加元素--->add(Object obj),多态   
  6.         list.add("java01");  
  7.         list.add("java02");  
  8.         list.add("java03");  
  9.         list.add("java04");  
  10.   
  11.         //打印原集合  
  12.         sop("原集合:" + list);  
  13.         sop("------------------");  
  14.   
  15.          
  16.   
  17.         //在迭代过程中,准备添加或删除元素  
  18.         for (ListIterator it = list.listIterator();it.hasNext(); )  
  19.         {  
  20.             Object obj = it.next();  
  21.             if (obj.equals("java01"))  
  22.                 it.remove();  
  23.             else if(obj.equals("java02"))  
  24.                 it.add("增加java200");  
  25.             else if(obj.equals("java03"))  
  26.                 it.set("修改为java300");  
  27.             sop("obj:" + obj);  
  28.         }  
  29.         sop("list :" + list);  
  30.     }
复制代码
回复 使用道具 举报
24、集合中的两种排序方式?
排序有两个要素:元素和集合
1)第一种排序方式:自然排序:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法,这种方式也称为元素的自然排序或默认排序方式。
  1. /*
  2. 第一种排序方式:自然排序,实现Comparable接口,重写compareTo方法
  3. 需求:
  4. 向TreeSet集合中存储自定义对象学生
  5. 按照学生的年龄进行排序
  6. */  
  7. import java.util.*;  
  8. //此接口强制让Student实现比较性  
  9. class Student implements Comparable   
  10. {  
  11.     //定义Student私有属性  
  12.     private String name;  
  13.     private int age;  
  14.     //构造Student函数,初始化  
  15.     Student(String name,int age)
  16.     {  
  17.         this.name = name;  
  18.         this.age = age;  
  19.     }  
  20.     //公共访问方法,访问私有属性  
  21.     public String getName()  
  22.     {  
  23.         return name;      
  24.     }  
  25.     public int getAge()  
  26.     {  
  27.         return age;  
  28.     }  
  29.     //复写Comparator中的compare方法,自定义比较器  
  30.     public int compareTo(Object obj)  
  31.     {  
  32.         //判断是否属于Student类型,否则抛异常  
  33.         if (!(obj instanceof Student))  
  34.             throw new RuntimeException("NotSuchTypeException");  
  35.         //将Object类对象强转为Student类  
  36.         Student s = (Student)obj;  
  37.          
  38.         //System.out.println(this.age + "--compare-" + s.age);//测试用,查看比较情况  
  39.   
  40.         //按年龄大小比较,相同则比较姓名大小,不同返回两年龄之差  
  41.         if (this.age == s.age)  
  42.         {  
  43.             return this.name.compareTo(s.name);  
  44.         }  
  45.         else if (this.age <s.age)  
  46.             return this.age-s.age;  
  47.         return this.age-s.age;  
  48.     }  
  49.     /*
  50.     //如果按照存入顺序输出
  51.     public int compareTo()
  52.     {
  53.         return 1;//改为-1则按倒叙输出
  54.     }
  55.     */  
  56. }  
  57. //测试  
  58. class TreeSetTest  
  59. {  
  60.     public static void main(String[] args)   
  61.     {  
  62.         //创建集合,并添加元素  
  63.         TreeSet ts = new TreeSet();  
  64.         ts.add(new Student("li01",25));  
  65.         ts.add(new Student("li02",20));  
  66.         ts.add(new Student("li01",22));  
  67.         ts.add(new Student("li05",24));  
  68.         ts.add(new Student("li08",40));  
  69.         //打印集合中元素  
  70.         printE(ts);  
  71.          
  72.         System.out.println("Hello World!");  
  73.     }  
  74.   
  75.     //定义打印集合中元素的功能  
  76.     public static void printE(TreeSet ts)  
  77.     {  
  78.         //迭代器方法获取  
  79.         Iterator it = ts.iterator();  
  80.       
  81.         while (it.hasNext())  
  82.         {  
  83.             //将返回的元素(Object类)强转为Student类  
  84.             Student s = (Student)it.next();  
  85.             System.out.println(s.getName() + "---" + s.getAge());  
  86.         }  
  87.     }  
  88. }  
复制代码
2)第二种排序方式:比较器
      当元素自身不具备比较性是,或者具备比较性,却不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时就有了比较方式(即参阅构造函数)。
当两种排序方式都存在时,以比较器为主。
      如何构造比较器:定义一个类,实现Comparator接口,覆盖compare方法。
  1. import java.util.*;  
  2. //此接口强制让Student实现比较性  
  3. class Student implements Comparable  
  4. {  
  5.     //定义Student私有属性  
  6.     private String name;  
  7.     private int age;  
  8.     //构造Student函数,初始化  
  9.     Student(String name,int age)  
  10.     {  
  11.         this.name = name;  
  12.         this.age = age;  
  13.     }  
  14.     //公共访问方法,访问私有属性  
  15.     public String getName()  
  16.     {  
  17.         return name;  
  18.     }  
  19.     public int getAge()  
  20.     {  
  21.         return age;  
  22.     }  
  23.   
  24.     //复写Comparator中的compare方法,自定义比较器  
  25.     public int compareTo(Object obj)  
  26.     {  
  27.         //判断是否属于Student类型,否则抛异常  
  28.         if (!(obj instanceof Student))  
  29.             throw new RuntimeException("NotSuchTypeException");  
  30.         //按年龄大小比较,相同则比较姓名大小,不同返回两年龄之差  
  31.         Student s = (Student)obj;  
  32.         if (this.age > s.age)  
  33.             return this.age-s.age;  
  34.         else if (this.age == s.age)  
  35.         {  
  36.             return this.name.compareTo(s.name);  
  37.         }  
  38.         return this.age-s.age;  
  39.     }  
  40.          
  41. }  
  42.   
  43. //定义比较器,实现Comparator接口  
  44. class MyCompare implements Comparator  
  45. {  
  46.     //重写Comparator中的compare方法,按姓名顺序排序  
  47.     public int compare(Object o1,Object o2)  
  48.     {  
  49.         //判断给定对象是否为Student类,否则抛异常  
  50.         if (!((o1 instanceof Student) && (o2 instanceof Student)))  
  51.             throw new RuntimeException("NotSuchTypeException");  
  52.         //将给定对象强转为Student类  
  53.         Student s1 = (Student)o1;  
  54.         Student s2 = (Student)o2;  
  55.         //比较名字,返回数值,相同则比较年龄  
  56.         int n = s1.getName().compareTo(s2.getName());  
  57.         if (n == 0)  
  58.             return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));  
  59.         return n;  
  60.     }  
  61. }  
  62. //测试  
  63. class TreeSetComDemo   
  64. {  
  65.     public static void main(String[] args)   
  66.     {  
  67.         //TreeSet ts = new TreeSet();  
  68.   
  69.         //创建集合,加入接口类参数,并添加元素  
  70.         TreeSet ts = new TreeSet(new MyCompare());  
  71.         ts.add(new Student("li01",25));  
  72.         ts.add(new Student("li02",20));  
  73.         ts.add(new Student("li01",22));  
  74.         ts.add(new Student("li05",24));  
  75.         ts.add(new Student("li08",40));  
  76.   
  77.         //打印集合中元素  
  78.         printE(ts);  
  79.     }  
  80.       
  81.     //定义打印集合中元素的功能  
  82.     public static void printE(TreeSet ts)  
  83.     {  
  84.         //迭代器方法获取  
  85.         Iterator it = ts.iterator();  
  86.       
  87.         while (it.hasNext())  
  88.         {  
  89.             //将返回的元素(Object类)强转为Student类  
  90.             Student s = (Student)it.next();  
  91.             System.out.println(s.getName() + "---" + s.getAge());  
  92.         }  
  93.     }  
  94. }
复制代码

评分

参与人数 1黑马币 +20 收起 理由
张熙韬 + 20 神马都是浮云

查看全部评分

回复 使用道具 举报
25、集合中的两种取出方式?
keySet()entrySet()方法
1keySet()方法获取元素
原理:将Map集合中的所有键存入到Set集合中,因为Set集合具备迭代器,所以可以用迭代方式取出所有的键,再根据get方法获取每一个键对应的值。简单说就是:Map集合---->Set集合 ---->迭代器取出
  1. import java.util.*;  
  2. class KeySetDemo   
  3. {  
  4.     public static void main(String[] args)   
  5.     {  
  6.         //创建Map集合,并添加元素  
  7.         Map<Integer,String> map = new HashMap<Integer,String>();  
  8.         map.put(2,"zhangsan");  
  9.         map.put(6,"lisi");  
  10.         map.put(3,"wangwu");  
  11.         map.put(4,"heihei");  
  12.         map.put(5,"xixi");  
  13.         //获取map集合中的所有键的Set集合  
  14.         Set<Integer> keySet = map.keySet();  
  15.         //有了Set集合就可以获取其迭代器,取值  
  16.         Iterator<Integer> it = keySet.iterator();  
  17.         while (it.hasNext())  
  18.         {  
  19.             Integer i = it.next();  
  20.             String s = map.get(i);  
  21.             System.out.println(i + " = " + s);  
  22.         }  
  23.     }  
  24. }  
复制代码
2entrySet()方法获取元素:
原理:将Map集合中的映射关系存入到了Set集合中,而这个映射关系的数据类型是Map.Entry,在通过迭代器将映射关系存入到Map.Entry集合中,并通过其中的getKey()getValue()放取出键值。
  1. import java.util.*;  
  2. class EntrySetDemo  
  3. {  
  4.     public static void main(String[] args)   
  5.     {  
  6.         //创建集合,存入元素  
  7.         Map<String,String> map = new HashMap<String,String>();  
  8.         map.put("01","lisi1");  
  9.         map.put("02","lisi2");  
  10.         map.put("03","lisi3");  
  11.         map.put("04","lisi4");  
  12.         //获取map集合中的所有键,存入到Set集合中,  
  13.         Set<Map.Entry<String,String>> entry = map.entrySet();  
  14.         //通过迭代器取出map中的键值关系,迭代器接收的泛型参数应和Set接收的一致  
  15.         Iterator<Map.Entry<String,String>> it = entry.iterator();  
  16.         while (it.hasNext())  
  17.         {  
  18.             //将键值关系取出存入Map.Entry这个映射关系集合接口中  
  19.             Map.Entry<String,String>  me = it.next();  
  20.             //使用Map.Entry中的方法获取键和值  
  21.             String key = me.getKey();  
  22.             String value = me.getValue();  
  23.             System.out.println(key + " : " + value);  
  24.         }  
  25.     }  
  26. }  
复制代码
回复 使用道具 举报
26、FileWriter和File创建文件的区别和联系?
File创建文件是先查看文件是否存在,如果存在则返回true,不存在则创建一个新文件
FileWriter创建对象时,不论文件存不存在,都会覆盖,创建新的文件

回复 使用道具 举报
本帖最后由 黄玉昆 于 2013-3-17 20:41 编辑

27、请将你知道的最简单的几种死循环形式写出来
第一种:for(;;)
第二种:while(){}
第三种:do {}while(1);
第四种:public void show(){show();}

回复 使用道具 举报
预留楼层
回复 使用道具 举报
预留楼层
回复 使用道具 举报
本帖最后由 wangjinyu501 于 2013-3-14 15:58 编辑

java多线程是不是很麻烦啊
回复 使用道具 举报
黄玉昆 发表于 2013-3-14 15:43
17、Outer.Inner in = new Outer(new Inner()),请对这句话解释一下这个是在外部其他类中直接建立内部类对 ...

不是应该这样写吗?Outer.Inner in=new Outer().new Inner();
题目上的那句话,我怎么看着都像是new外部类对象,初始化时传入了内部了对象

评分

参与人数 1黑马币 +15 收起 理由
黄玉昆 + 15 谢谢,你说的没错,是我写错了,不好意思.

查看全部评分

回复 使用道具 举报
很好,这样提高会很快的
回复 使用道具 举报
不错......
回复 使用道具 举报
本帖最后由 张豪杰 于 2013-3-15 10:46 编辑

楼主,第二十五题我有疑惑:
25、集合中的两种取出方式?
问题是问集合中的取出方式,但是你给的答案仅仅只是写出Map的两种取出方式
像List集合中的用迭代器取出,还有高级for取出元素,这应该也是吧?
难道List和Set都不属于集合体系?还是我对问题理解有误?
或者这道题的题目应该指明是“Map集合的两种取出方式”?

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9

查看全部评分

回复 使用道具 举报
张豪杰 发表于 2013-3-15 10:44
楼主,第二十五题我有疑惑:
25、集合中的两种取出方式?
问题是问集合中的取出方式,但是你给的答案仅仅只 ...

你这么说也有道理,说的很准确;我觉得大家应该都理解我说的意思,因为在看视频都知道毕老师讲的这两种方式是说的Map集合,理解就好了。谢谢你
回复 使用道具 举报
顶顶顶 支持了
回复 使用道具 举报
楼主辛苦了{:soso_e113:}
回复 使用道具 举报
黄玉昆 发表于 2013-3-14 15:42
6、是否可以从一个static方法内部发出对非 static方法的调用?不可以,如果其中包含对象的method();不能保 ...

public class A{
public static void main(String[] args){
  A a=new A();
  A.print(a); //这个算不算在静态方法内发出对非静态方法的调用 ?
}
void show(){
  System.out.println("hello");
}
static void print(A a){
  a.show();
}
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 鼓励鼓励

查看全部评分

回复 使用道具 举报
嘿嘿,顶一个
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马