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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lwj123 金牌黑马   /  2015-2-6 09:49  /  3912 人查看  /  67 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 lwj123 于 2015-2-8 00:03 编辑

答题送分活动一
我们在学习Java基础时,有些知识点是我们没有注意到的,例如:
举例一:
FileInputStream(String filePath)
FileInputStream(File file)
第一个构造的源码其实也是将filePath封装成File对象

举例二:
ByteArrayStream这个流中的close()方法写不写都是无所谓了,源码中这个方法也是没有方法体的

举例三:
有个集合中存储的数据类型是字符串,我们一般都写一个比较器去对这些字符串进行比较字符串长度之类的,但是有些人想为什么不去重写String中compareTo方法?
在API中我发现String是final修饰的,根本就无法去继承,更谈不上重写了。

举例四:
观察集合中contains方法源码,其实底层调用的equals方法


举例五:
Properties是Map体系的,但是Properties却不是泛型类。

其他的,等你们来写...

这些细枝末节的东西我们可能没去注意到,但是理解了这些东西,有助于我们的学习更加深入。

答题规则:
       写出你在学习中观察源码或者API之后发现的一些跟上面举例类似有趣东西,分享给我们,回帖比较好的有技术分送哦!
       还有强调一点不要有水贴,否则"关小屋"。


本人技术有限,以上例子若是有错误,你们可以向我提出qq:2905090240
活动还会继续,敬请期待...


67 个回复

倒序浏览
我感觉现在已经沦陷了,完全是水军的天下,问问题的没人回答,只有一堆复制粘贴和一些问题不过脑子混黑马币的,我都不想来了..

点评

嗯嗯,你反映的问题,我知道了,我以后多加关注的这些水军。  发表于 2015-2-6 10:45
回复 使用道具 举报
感觉好深奥的样子啊,楼楼厉害啊
回复 使用道具 举报
还是说说==和equals,因为今天我才明白。
【==是比较对象的时候比较内存,equals底层也是用==实现】这句话,相信大家都看过,对于后半句话,说的不全,今天就给大家说说我的理解。
还是先看例子:
  1.         String str1 = "abc";
  2.                 String str2 = "abc";
  3.                 System.out.println("str1-->" + str1.hashCode());
  4.                 System.out.println("str2-->" + str2.hashCode());
  5.                 System.out.println(str1 == str2);
  6.                 System.out.println(str1.equals(str2));
  7.                 ---------- 运行 ----------
  8.                 str1-->96354
  9.                 str2-->96354
  10.                 true
  11.                 true
  12.                 输出完成 (耗时 0 秒) - 正常终止
复制代码
不难理解,二者内存比较都相同,所以equals自然返回true。
  1. String str1 = new String("abc");
  2.                 String str2 = new String("abc");
  3.                 System.out.println("str1-->" + str1.hashCode());
  4.                 System.out.println("str2-->" + str2.hashCode());
  5.                 System.out.println(str1 == str2);
  6.                 System.out.println(str1.equals(str2));
  7.                 ---------- 运行 ----------
  8.                 str1-->96354
  9.                 str2-->96354
  10.                 false
  11.                 true
  12.                 输出完成 (耗时 0 秒) - 正常终止
复制代码
这个例子,内存都不相同,equals咋还返回true了呢?
我们看看String类的equals源码:
  1. public boolean equals(Object anObject) {
  2.         if (this == anObject) {
  3.             return true;
  4.         }
  5.         if (anObject instanceof String) {
  6.             String anotherString = (String)anObject;
  7.             int n = count;
  8.             if (n == anotherString.count) {
  9.                 char v1[] = value;
  10.                 char v2[] = anotherString.value;
  11.                 int i = offset;
  12.                 int j = anotherString.offset;
  13.                 while (n-- != 0) {
  14.                     if (v1[i++] != v2[j++])
  15.                         return false;
  16.                 }
  17.                 return true;
  18.             }
  19.         }
  20.         return false;
  21.     }
复制代码
源码解析:
1、先进行地址比较==(针对任何对象),如果地址相同返回true,如果地址不同,则继续向下
2、判断是否是String 类对象,不是返回false。
3、是String 类对象,则比较它们的值,值相同还是会返回true。
这就是为什么第二例子返回true的原因了,不看源码以前还真不知道,今天才晓得啊!我也是看别人说equals底层就是==实现,今天一看,还是有点区别的。高手勿喷啊!


评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

回复 使用道具 举报
浮点类型的数可以被0除,
运行结果是  Infinity无限大

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

回复 使用道具 举报
来个简单的把
分析源码  set集合的底层是采用map集合实现的,在实现过程中将所有value值设置为Object对象
对于TreeSet的排序就是在TreeMap的基础上排序然后封装起来。

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

回复 使用道具 举报
观察源代码:增强for,底层其实就是通过迭代器来实现的。
通过迭代器来实现hasNext(),next(),rmove()等方法。

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

回复 使用道具 举报
q243539594 来自手机 初级黑马 2015-2-6 19:22:15
8#
Java是跨平台的
回复 使用道具 举报

补充:Java跨平台的原理就是JVM不跨平台!Java依赖的是不同操作系统里面的不同JVM来调用操作系统资源的!(JVM:Java 虚拟机)

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

回复 使用道具 举报
实现集合类线程安全的方法如下:
List<String> list = Collections
                                .synchronizedList(new ArrayList<String>());:这样可以使用List集合编程线程安全的

Map<String, String> map  = Collections.synchronizedMap(new HashMap<String,String>());
将Map集合编程线程安全的。

这就是我们不会去使用线程安全的Vector集合类的原因了。

自个顶一下!!!

评分

参与人数 1黑马币 +5 收起 理由
万合天宜 + 5 赞一个!

查看全部评分

回复 使用道具 举报
注意:collectionXxx.java使用了未经检查或不安全的操作.
注意:要了解详细信息,请使用 -Xlint:unchecked重新编译.
java编译器认为该程序存在安全隐患


温馨提示:这不是编译失败,所以先不用理会,等学了泛型你就知道这是怎么一回事

有人遇到过以为是报错的吗???

点评

哈哈哈,使用eclipse就不会啦,只是警告线而已,不过老毕讲过了啦,所以我们知道了  发表于 2015-2-6 23:05

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

回复 使用道具 举报
Java 中的参数传递 值传递?or 引用传递?
回复 使用道具 举报
  1. Integer i = new Integer(127);
  2. 源代码:
  3. public static Integer valueOf(int i) {
  4.         if (i >= IntegerCache.low && i <= IntegerCache.high)//如果i>-128&&i<=127
  5.             return IntegerCache.cache[i + (-IntegerCache.low)];
  6.         return new Integer(i);//超过了127或者小于-128

  7.         /*
  8.         ntegerCache.low:-128
  9.         IntegerCache.high:127       
  10.        
  11.         //是一个数组,静态修饰
  12.         static final Integer cache[];
  13.        
  14.         //给这个数组赋值
  15.         int j = low;
  16.         for(int k = 0; k < cache.length; k++)
  17.             cache[k] = new Integer(j++);
  18.         //该数组在类加载时就已经对每一个值赋值了,范围是-128,127,因为cache是由static修饰所以在这个范围内都是同一个对象
  19.         //超过了127或者小于-128,返回new Integer(i);这是新的对象了,所以才有


  20. Integer i1 = 127;
  21. Integer i2 = 127;
  22. System.out.println(i1.equals(i2));//true
  23. System.out.println(i1==i2);//true
  24. 以上是对这两个结果的源码解释
  25.         */
  26. }
复制代码
回复 使用道具 举报
Java 中的参数传递 值传递?or 引用传递?
以前接触过C/C++,所以总感觉Java中的参数传递理解起来总感觉有点怪怪的,没有C家族语言来的方便,但是其实只要掌握好三个点就可以了:
1、基本数据类型,如int、boolean、double等在参数传递时都是值传递,也就是说,在外部函数修改传入的值对原变量是没影响的。
2、如果传递的是对象引用,如果Object、Person、Integer等等,那么在外部函数类对其的修改是能修改原对象的。
3、特殊情况,那就是String了,按理说它是引用类型,不是基本数据类型,但是它在参数传递时的的确确表现出来的是基本数据类型的特征。
好了,大家若不深究,记住这三条就可以了,至于更深层次的理解限于篇幅我也就不献丑了,传送门已经为你们准备好,自行加深理解吧:http://blog.sina.com.cn/s/blog_59ca2c2a0100qhjx.html

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

回复 使用道具 举报
好复杂(⊙o⊙)…
回复 使用道具 举报
创建UIPageViewController时指定了页面书脊位置位于屏幕的中间,
那么该控制器初始就需要显示2个页面,所以必须为该方法传入2个UIViewController作为初始的显示页面!
回复 使用道具 举报
                Collection li = new HashSet();
                ReflectPoint rp1 = new ReflectPoint(3,3);
                ReflectPoint rp2 = new ReflectPoint(5,5);
                ReflectPoint rp3 = new ReflectPoint(3,3);
               
                li.add(rp1);
                li.add(rp2);
                li.add(rp3);
                li.add(rp1);
               
                rp1.y = 8;
               
                li.remove(rp1);
               
                System.out.println(li.size());

HashSeyt集合中存在 内存泄露问题。

原因:更改元素的值时 元素相对应的哈希值也会改变,导致删除时找不到元素。

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

回复 使用道具 举报
好深奥,我还没有学到这里哦,加油吧!
回复 使用道具 举报
love$$-IT 发表于 2015-2-6 18:58
观察源代码:增强for,底层其实就是通过迭代器来实现的。
通过迭代器来实现hasNext(),next(),rmove()等方法 ...

哥们请问增强for的源码可以在哪里看
回复 使用道具 举报 1 0
doomsday 发表于 2015-2-7 00:24
哥们请问增强for的源码可以在哪里看

这个问题问的好!
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马