• java常见问题 2018-10-01 16:41:00
    1 值传递与引用传递 1.1 值传递 是指对象被值传递,意味着传递了对象的一个副本,即使副本被改变,也不会影响源对象。(因为值传递的时候,实际上是将实参的值复制一份给形参。) public static void main(String[] ...
    @[toc]
    ####  1	值传递与引用传递
    #####  1.1	值传递
    是指对象被值传递,意味着传递了对象的一个副本,即使副本被改变,也不会影响源对象。(因为值传递的时候,实际上是将实参的值复制一份给形参。)
    
    ```java
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 20;
        swap(num1, num2);
        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2);
    }
    public static void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
    
    ```
    结果:
    a = 20
    b = 10
    num1 = 10
    num2 = 20
    
    #####  1.2	引用传递
    传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象的改变会反映到实际的对象上。(因为引用传递的时候,实际上是将实参的地址值复制一份给形参。)
    
    ```java
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        change(arr);
        System.out.println(arr[0]);
    }
    public static void change(int[] array) {
    //将数组的第一个元素变为0
        array[0] = 0;
    }
    
    ```
    结果:
    0
    
    #####  1.3	一些特殊的例子
    ######  1.3.1	StringBuffer类型传递
    
    ```java
    public void method1() {
            StringBuffer str = new StringBuffer("1234");
            System.out.println(str);
            change1(str);
            System.out.println(str);
        }
    
        public static void change1(StringBuffer str) {
            str = new StringBuffer("abc");
    	  
    //str.append("欢迎大家关注");//输出:1234欢迎大家关注
    //str.insert(3, "(编程)");//输出:123(编程)4
        }
    
    ```
    结果:
    1234
    1234
    分析:因为在 change1方法内部我们是新建了一个StringBuffer对象,所以 str指向了另外一个地址,相应的操作也同样是指向另外的地址的。
    例题
    
    ```java
    public class Demo {
        public static void main(String[] args) {
            Person p = new Person("张三");
            change(p);
            System.out.println(p.name);
        }
    
        public static void change(Person p) {
            Person person = new Person("李四");
            p = person;
        }
    }
    class Person {
        String name;
        public Person(String name) {
            this.name = name;
        }
    }
    
    ```
    输出 张三 因为change方法中重新创建了一个 Person对象。
    ######  1.3.2	String类型传递
    
    ```java
    public void method2() {
            String str = new String("1234");
            System.out.println(str);
            change2(str);
            System.out.println(str);
        }
    
        public static void change2(String str) {
            // str="abc"; //输出:1234
            str = new String("abc"); //输出:1234
        }
    
    ```
    ####  2	==与equals
      基本数据类型\==比较的是值,引用数据类型\==比较的是内存地址
      
    equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
    
    情况1:类没有重写equals()方法。则通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象。
    
    情况2:类覆盖了equals()方法。一般,我们都覆盖equals()方法来两个对象的内容相等;若它们的内容相等,则返回true(即,认为这两个对象相等)。
    例子:
    
    ```java
    public class test1 {
        public static void main(String[] args) {
            String a = new String("ab"); // a 为一个引用
            String b = new String("ab"); // b为另一个引用,对象的内容一样
            String aa = "ab"; // 放在常量池中
            String bb = "ab"; // 从常量池中查找
            if (aa == bb) // true
                System.out.println("aa==bb");
            if (a == b) // false 
                System.out.println("a==b");
            if (a.equals(b)) // true
                System.out.println("aEQb");
            if (42 == 42.0) { // true
                System.out.println("true");
            }
        }
    }
    
    ```
    当创建String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个String对象。
    
    
    ####  3	 hashCode()与equals()
    hashSet比较重复
    当你把对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他已经加入的对象的hashcode值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同。如果两者相同,HashSet就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。
    如果两个对象相等,则hashcode一定也是相同的
    两个对象相等,对两个对象分别调用equals方法都返回true
    两个对象有相同的hashcode值,它们也不一定是相等的
    ####  4.	Java文件运行过程
    #####  4.1	处理过程
    Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm---->jvm中解释器----->机器可执行的二进制机器码---->程序运行。
    #####  4.2	对象的创建过程
    ![在这里插入图片描述](https://img-blog.csdn.net/20181001163157625?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODMyMzY0NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
    #####  4.3	内存分析
    ![在这里插入图片描述](https://img-blog.csdn.net/20181001163420669?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODMyMzY0NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
    JDK1.7及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池
    Java 基本类型的包装类的大部分都实现了常量池技术,即Byte,Short,Integer,Long,Character,Boolean;这5种包装类默认创建了数值[-128,127]的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。
    两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。
    ####  5	Java集合
    ![在这里插入图片描述](https://img-blog.csdn.net/20181001163532300?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODMyMzY0NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
    **List接口**下:
    Arraylist :底层使用的是Object数组;
    LinkedList :底层使用的是双向循环链表数据结构;
    从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
    
    ![在这里插入图片描述](https://img-blog.csdn.net/20181001163610880?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODMyMzY0NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
    Vector:底层使用的是Object数组;所有方法都是同步的
    
    **Map接口**下:
    HashMap : JDK1.8 之前 HashMap 由 数组+链表 组成的(“链表散列” 即数组和链表的结合体),数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(HashMap 采用 “拉链法也就是链地址法” 解决冲突)
    jdk1.8 数组+链表/红黑二叉树
    TreeMap: 红黑二叉树
    红黑树就是为了解决二叉查找树的缺陷,因为二叉查找树在某些情况下会退化成一个线性结构。
    HashTable:数组+链表组成的
    
    HashMap和HashTable的区别
    线程是否安全: HashMap 是非线程安全的,HashTable 是线程安全的;HashTable 内部的方法基本都经过 synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!);
    效率: 因为线程安全的问题,HashMap 要比 HashTable 效率高一点。另外,HashTable 基本被淘汰,不要在代码中使用它;
    对Null key 和Null value的支持: HashMap 中,null 可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为 null。。但是在 HashTable 中 put 进的键值只要有一个 null,直接抛出 NullPointerException。
    初始容量大小和每次扩充容量大小的不同 : ①创建时如果不指定容量初始值,Hashtable 默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。②创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大小。也就是说 HashMap 总是使用2的幂次方作为哈希表的大小,后面会介绍到为什么是2的幂次方。
    底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。
    
    **Set接口**:
    TreeSet :红黑二叉树
    HashSet:基于 HashMap 实现的,底层采用 HashMap 来保存元素
    
    
    展开全文
  • 本文回答了30个JAVA入门级初学者的常见问题。如我可以用%除以一个小数吗? a += b 和 a = a + b 的效果有区别吗? 声明一个数组为什么需要花费大量时间? 为什么Java库不用随机pivot方式的快速排序? 1.2 基本数据...
  • 超详细的Java面试题总结(三)之Java集合篇常见问题 超详细的Java面试题总结(四 )之JavaWeb基础知识总结 List,Set,Map三者的区别及总结 List:对付顺序的好帮手 List接口存储一组不唯一(可以有多个元素...
  • Java学习的正确打开方式 2020-01-08 21:56:48
    在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是...
  • 这份面试清单是从我 2015 年做了 TeamLeader 之后开始收集的,一方面是给公司招聘用,另一方面是想用它来挖掘在 Java 技术栈,还有那些知识点是我不知道的,我想找到这些技术盲点,然后修复它,以此来提高自己的...
  • Java初学者的30个常见问题 2017-02-28 17:28:37
    本文回答了30个JAVA入门级初学者的常见问题。 我可以用%除以一个小数吗? a += b 和 a = a + b 的效果有区别吗? 声明一个数组为什么需要花费大量时间? 为什么JAVA库不用随机pivot方式的快速排序?
  • 本文将告诉你学习Java需要达到的30个目标,学习过程可能遇到的问题,及学习路线。希望能够对你的学习有所帮助。对比一下自己,你已经掌握了这30条的多少条了呢? 路线 Java发展到现在,按应用来分主要分为三大...
  • 最近需要面试Java开发,自己学习丢西瓜捡芝麻,学了的都忘了,所以有机会自己做个总结,摘录自各个博文以及总结。   1、JAVA的跨平台原理 JVA源码被编译会生成字节码文件,通过不同平台上下载的不同版本的JVM,...
  • Exception in thread "main" java.lang.Array Index Out Of Bounds Exception: 5  at Bub_Sort.sort(Bub_Sort.java:40)  at Bub_Sort.main(Bub_Sort.java:24)
  • java开发常见问题总结 2016-03-30 14:13:48
    Java编程的一些常见问题汇总 ..本文列举了我在周围同事的Java代码看到的一些比较典型的错误。显然,静态代码分析(我们团队用的是qulice)不可能发现所有的问题,这也是为什么我要在这里列出它们的原因。 ...
  • Java面试常见问题总结 2017-04-19 21:17:23
    Java 面试随着时间的改变而改变。在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来越高级,面试官问的问题也更深入。 在我初入职场的时候,类似于 Vector...
  • Java经典算法讲解 2019-06-24 11:57:47
    在面试,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计...算法是学习所有编程语言的基础,在Java学习过程首先也会选择以算法起步,本次课程重点讲解Java开发常用的基本算法。
  • 一门永不过时的编程语言——Java 软件开发。...而在以Java编程为核心的开发领域,javaEE程序员的需求量10年来一直居于首位! Java工程师就业: 1.通过各大招聘网站统计,全国海量公司都在招聘J...
  • Java Web中常见乱码问题的分析与解决 get请求参数乱码 post请求参数乱码 同时处理Get和Post两种提交方式的编码问题 服务器发送给浏览器的乱码问题 在jsp页面,中文显示乱码
  • 春节在家刷知乎,看到了一个知乎的问题:《学习Java可以干什么呢?》 我是一个Java的初学者,大概学了四天,对Java到底能做什么还是一头雾水,每天对着黑屏(DOS系统)除了编译还是编译,那么Java对于一个初学者来...
  • java中常见的异常类型 2018-09-20 21:21:33
    1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用...
  • 第一,谈谈final, finally, finalize的区别。...将变量或方法声明为final,可以保证它们在使用不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用只能读取,不可修改。被声明为fi...
  • 这是『Java学习指南系列』的第16篇教程 ,是Java开发的高级课程,介绍实际工程里常见的各种专项技术。 二、主要内容  (每章内容独立,各自独立成章) * 视频和音频的播放 ( libVLC...
  • Java学习网站,有了这些,成为大牛不在话下
  • 可以说,Java是现阶段中国互联网公司,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地。 有不少朋友问,除了掌握Java语法,还要系统学习...
1 2 3 4 5 ... 20
收藏数 213,960
精华内容 85,584