java面试题:

String str="i"与 String str=new String(“i”)一样吗?

String str="i"会将起分配到常量池中,常量池中没有重复的元素,如果常量池中存中i,就将i的地址赋给变量,如果没有就创建一个再赋给变量。

String str=new String(“i”)会将对象分配到堆中,即使内存一样,还是会重新创建一个新的对象。

1.数据结构

1.二叉查找树

又称二叉排序树或者二叉搜索树

特点:

  • 1,每个节点上最多有两个子节点
  • 2,左子树上所有节点的值都小于根节点的值
  • 3,右子树上所有节点的值都大于根节点的值

目的:提高检索数据的性能

2.平衡二叉树

  • 满足查找二叉树的大小规则下,让树尽可能矮小,以此提高数据的性能

要求

  • 任意节点的左右两个子树的高度差不超过1,任意节点的左右两个子树都是一颗平衡二叉树

解决方法:

  • 进行左旋或者右旋,保证平衡

旋转的四种情况

  • 左左
  • 左右
  • 右右
  • 右左

左左:

当根节点左子树的左子树有节点插入,导致二叉树不平衡

右旋

左右:

当根节点左子树的右子树有节点插入,导致二叉树不平衡

先左旋,再右旋

右右:

当根节点右子树的右子树有节点插入,导致二叉树不平衡

左旋

右左:

当根节点右子树的左子树有节点插入,导致二叉树不平衡

先右旋,在左旋

2.红黑树

每一个节点可以是红或者黑,红黑树不是通过高度平衡的,它的平衡是通过“红黑规则”进行实现的

规则:

  • 每一个节点或是红色,或是黑色,根节点必须是黑色
  • 每一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,叶节点是黑色的
  • 如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况)

添加节点

  • 添加的节点颜色,可以是红色的也可以是黑色的
  • 默认用红色效率高

2.list系列集合

list集合的基础用法

    public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("java");list.add("java");list.add("mysql");list.add("mysql");//在某个索引位置插入元素list.add(2,"html");System.out.println(list);//根据索引删除元素,返回被删除的元素list.remove(2);System.out.println(list);//根据索引获取元素System.out.println(list.get(2));//修改索引位置的元素//返回修改前的数据System.out.println(list.set(1, "redis"));System.out.println(list);//清空listlist.clear();}

list遍历的四种方式

  • 迭代器
  • foreach
  • lambda表达式
  • for循环

ArrayList集合的底层原理

  • 底层是基于数组实现的:根据索引定位元素快,增删需要做元素的位移操作
  • 第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组

每次当元素加满时,数组会扩容1.5倍

查询速度快,增删较慢

数组查询方便,添加元素在指定位置时,需要先偏移该位置以及后面的元素,然后将该元素插入到指定位置,删除元素时,需要偏移该位置后面的元素。

LinkedList的特点

底层数据结构是双链表,查询慢,收尾操作的速度极快

LinkedList集合的特有功能

添加和删除

    public static void main(String[] args) {//模拟栈LinkedList<String> stack = new LinkedList<>();stack.addFirst("第1颗子弹");stack.addFirst("第2颗子弹");stack.addFirst("第3颗子弹");stack.addFirst("第4颗子弹");System.out.println(stack);//出栈 弹栈System.out.println(stack.removeFirst());System.out.println(stack.removeFirst());System.out.println(stack);//模拟队列LinkedList<String> queue = new LinkedList<>();//入队queue.addLast("1号");queue.addLast("2号");queue.addLast("3号");queue.addLast("4号");queue.addLast("5号");//出队System.out.println(queue.removeFirst());System.out.println(queue.removeFirst());System.out.println(queue);}

集合的并发修改异常

  • 迭代器遍历集合且直接用集合删除元素的时候可能出现问题
  • 增强for循环遍历集合且直接用集合删除元素的时候可能会出现

以下代码都存在漏删的风险,java会抛出异常

        //使用迭代器删除所有python信息Iterator<String> it = list.iterator();while (it.hasNext()){String next = it.next();if(next.equals("python")){list.remove(next);}}System.out.println(list);//foreach遍历删除(会出现bug)for (String s : list) {if (s.equals("python")){list.remove(s);}}System.out.println(list);//lambda表达式list.forEach(s -> {if (s.equals("python")){list.remove(s);}});

迭代器解决方法,使用迭代器的remove方法

        Iterator<String> it = list.iterator();while (it.hasNext()){if(it.next().equals("python")){//删除当前元素,且不会后移it.remove();}}

for循环不会出现bug,但是会漏删

        //for循环不会出现bug,但是会漏删for(int i = 0 ;i < list.size()-1;i++){String s = list.get(i);if (s.equals("python")){list.remove(s);}}

for循环的解决方法

1.从后面向前删

2.删除是,变量回退

        for(int i = list.size()-1 ;i >=0;i--){String s = list.get(i);if (s.equals("python")){list.remove(s);}}System.out.println(list);for(int i = 0 ;i < list.size()-1;i++){String s = list.get(i);if (s.equals("python")){list.remove(s);i--;}}System.out.println(list);

3.泛型深入

泛型的好处:

  • 统一数据类型
  • 把运行时期的问题提前到编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来
  • 泛型类的格式:修饰符 class 类名<泛型变量>{ }
  • 例如: public class Test<T>{}
  • 此处泛型变量T可以随便写为任意标识符,比如常见的E、T、K、V等。
  • 作用:编译阶段可以指定数据类型,类似于集合作用

泛型类的原理:

  • 把出现泛型变量的地方全部替换成传输的真实数据类型

泛型方法:

  • 泛型方法的格式:修饰符<泛型变量> 方法返回值 方法名称(形参列表){}
  • 例如:public <T> void show(T t)
  • 作用:方法中可以使用泛型接收一切实际参数类型,方法更具备通用性

传入一个任何类型的数组,实现它的Arrays.toString方法

    public static  <T> void ArrayToString(T[] arr){if(arr != null){StringBuilder s = new StringBuilder("[");for (int i = 0; i < arr.length; i++) {s.append(arr[i]).append(i == arr.length-1?"":", ");}s.append("]");System.out.println(s.toString());}else {System.out.println(arr);}}

泛型方法的原理:

  • 把出现泛型变量的地方全部替换成传输的真实数据类型

泛型接口:

  • 使用了泛型定义的接口就是泛型接口
  • 泛型接口的格式:修饰符 interface 接口名称<泛型变量>{}
  • 例如:public interface Data<E>
  • 作用:泛型接口可以让实现类选择当前功能需要操作的数据类型

例子:

public interface Data<E> {E add(E e);int delete(int id);E update(E e);E findById(int id);
}
public class StudentData implements Data<Student>{@Overridepublic Student add(Student student) {return null;}@Overridepublic int delete(int id) {return 0;}@Overridepublic Student update(Student student) {return null;}@Overridepublic Student findById(int id) {return null;}
}

泛型接口的原理:

  • 实现类可以在实现接口的时候传入自己操作的数据类型,这样重写的方法都将是针对于该类型的操作

泛型接口的作用:

  • 泛型接口可以约束实现类,实现类可以在实现接口的时候传入自己操作的数据类型,这样重写的方法都是针对于该类型的操作

泛型通配符:?

  • ?可以在“使用泛型”的时候代表一切类型
  • E T K V是在定义的时候使用

泛型通配符应用:

注意:虽然Cat和Dog都继承自Animal,但是ArrayList<Cat>和ArrayList<Dog>与ArrayList<Animal>没有关系

泛型上下限:

  • ?extends Animal:?必须是Animal或者其子类 泛型上限
  • ?super  Animal: ?必须是Animal或者其父类 泛型下限

你真的了解java吗?java总结十相关推荐

  1. 关于java实习心得总结(十篇)

    关于java实习心得总结(篇一) 初次涉及Java领域,感觉到Java入门是好像没有C,C++入门快,工具也没有什么TurboC,VisualC++好用,什么JA_HOME,CLASSPATH,虚拟机 ...

  2. Java基础学习——第十六章 Java8新特性

    Java基础学习--第十六章 Java8 新特性 Java8(JDK8.0)较 JDK7.0 有很多变化或者说是优化,比如 interface 里可以有静态方法和默认方法,并且可以有方法体,这一点就颠 ...

  3. java程序设计编程题_20165237 2017-2018-2 《Java程序设计》第十周考试补做及编程题...

    20165237 2017-2018-2 <Java程序设计>第十周考试补做及编程题 知识点 1.链表是由若干个称作节点的对象组成的一种数据结构,每个节点含有一个数据和下一个节点的引用 . ...

  4. 201521123038 《Java程序设计》 第十周学习总结

    201521123038 <Java程序设计> 第十周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题 ...

  5. 达拉草201771010105《面向对象程序设计(java)》第十六周学习总结

    达拉草201771010105<面向对象程序设计(java)>第十六周学习总结 第一部分:理论知识 1.程序与进程的概念: (1)程序是一段静态的代码,它是应用程序执行的蓝 本. (2)进 ...

  6. java经典算法四十题

    java经典算法四十题 [程序9]题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 ".例如6=1+2+3.编程找出1000以内的所有完数. public class W ...

  7. 20155317 2016-2017-2 《Java程序设计》第十学习总结

    20155317 2016-2017-2 <Java程序设计>第十学习总结 教材学习内容总结 1.网络编程的概念: 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作 ...

  8. 20155230 2016-2017-2 《Java程序设计》第十周学习总结

    20155230 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 网络编程:就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发 ...

  9. 你真的以为你了解Java的序列化了吗

    转载自 你真的以为你了解Java的序列化了吗 上一篇文章<Java对象的序列化与反序列化>中,简单介绍了Java中对象的序列化和反序列化的一些基础知识.看文那篇文章后,有小伙伴留言说:我终 ...

  10. 高级java开发_适用于高级Java开发人员的十大书籍

    高级java开发 Java是当今最流行的编程语言之一. 有很多适合初学者的书籍. 但是对于那些使用Java进行过一段时间编程的人来说,其中有些人看起来有些简单和多余. 初学者的书没有带来新鲜有趣的想法 ...

最新文章

  1. 基于 OpenCV 的表格文本内容提取
  2. 设置Windows7各种睡眠方式
  3. MapReduce-Combiner规约-原理分析
  4. Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
  5. 520 钻石争霸赛 7-8浪漫侧影(二叉树的遍历)
  6. 创建维护计划时,提示“代理XP”组件已作为此服务器安全配置的一部分被关闭...
  7. sklearn之线性回归和梯度下降
  8. hadoop 传感器数据_晋城大数据培训
  9. 实习踩坑之路:快速失败:使用stream流便利集合的时候删除了对象,导致抛错Null
  10. 单反相机坏点和噪点测试软件,单反相机测试坏点和噪点的软件
  11. java 聊天室源代码_java聊天室源码(含客户端、服务端)
  12. RTMP 两种方式推流:推H.264、ACC和推FLV封装格式
  13. 去哪下载python项目_Python 项目实践二(下载数据)第三篇
  14. 传说中WM手机工程测试命令
  15. 线性分式变换(linear fractional transformation)
  16. python实现12306余票
  17. Response.Flush()的作用
  18. 苹果造车欲用中国电池,前提是在美国建厂?比亚迪、宁德时代正与其谈判
  19. console.log(console.log) = ?
  20. Java中final、finally、finalize的简单区别,中等区别,详细区别(Lawliet 修改+注释版)

热门文章

  1. DataScience:数据处理技术之针对时间序列数据衍变—构造时间滑动窗口数据的简介、代码实现、案例应用之详细攻略
  2. 文件夹无法访问、拒绝访问的解决方法
  3. 计算机控制HMI,工控自动化应用方案:简单HMI系统
  4. OA的新一轮革命——协同管理
  5. 恶意代码分析实战Lab1
  6. 我的助理辞职了!——给不听话的下属看看
  7. 在银河系发现“超级地球” 体积约是地球的13倍
  8. 打开chm文件遇到的问题:文字重叠混乱
  9. 飞流、秀色交易加速 网秦全面专注智能汽车领域
  10. 入门图形学:UI抗锯齿