java从键盘输入,scanner细节
1 需求当我们需要使用java从键盘输入数据时,使用到Scanner进行输入字符串时,可能会遇到一些小bug,比如:
1234567public class Input { public static void main(String[] args) { int age = scanner.nextInt(); String name = scanner.nextLine(); String sex = scanner.nextLine(); }}
输出:
为什么会这样呢?
2 原因解释因为scanner.nextLine()会接收一行数据,而scanner.next()是接收有效字符(除空格和enter等之外的所有字符)之前的数据,所以当输入完age值后,按下enter键之后,这个enter被scanner.nextLine()给吸收了,也就被其当做一个值给接收了,所以就自动跳过了中间的name,所以会导致出现bug。
不过没关系,解决办法就是在需要真正接收的变量前加一个空的scan ...
底层数据结构链表,以及java代码实现
1 原理介绍链表和数组的区别在于,数组的插入和删除操作需要整个数组一起跟着动,这样的效率很低。举个例子:打麻将时,当有一个麻将子,其大小正好在已经排序好的麻将中间,如果需要插入进原来的麻将序列,那么需要将之前或者之后的麻将全部移动,这样很费时间,所以链表可以弥补这种不足。
1.1 增链表的插入操作包括两种:
直接在末尾追加
在中间的某个位置插入
如下图所示,两种方式需要单独考虑。
1.2 删链表的删除,也包括两种:
直接删除末尾的节点
删除中间的节点
方式1删除:
使用两个指针,一个指针指向当前的节点,一个指针指向当前节点的前驱节点,前驱节点的后驱直接指向点前节点的后驱,即可实现删除功能。
方式2删除:
只使用一个指针,将当前节点的后一个节点的数据赋值到当前节点,并将当前节点的后驱指向后一个节点的后一个节点。
1.3 改修改其实就是先查找是否有需要修改的这个数据,如果没有这个数据返回false,否则就修改数据。
1.4 查查找数据也是一个一个遍历,但是如果链表有重复数据的话,只会返回第一次查找的数据。
2 代码实现2.1 创建链表链表中的节点的定义:
1234567891 ...
腾讯笔试题目
笔试题1
小Q定义了一种数列称为翻转数列:给定整数n和m, 满足n能被2m整除。对于一串连续递增整数数列1, 2, 3, 4…, 每隔m个符号翻转一次, 最初符号为’-‘;。例如n = 8, m = 2, 数列就是: -1, -2, +3, +4, -5, -6, +7, +8.而n = 4, m = 1, 数列就是: -1, +2, -3, + 4.小Q现在希望你能帮他算算前n项和为多少。
输入描述:
输入包括两个整数n和m(2 <= n <= 109, 1 <= m), 并且满足n能被2m整除。
输出描述:
输出一个整数, 表示前n项和。
笔试题1-代码:12345678910111213141516171819202122import java.util.Scanner;public class Test_1 { public static void main(String[] args) { Scanner scanner = new Scann ...
冒泡排序和选择排序过程介绍
1.冒泡排序冒泡排序就是通过对比前一个和后一个数的大小,按照规则进行顺序的调换。每一轮对比之后最大或者最小值都会浮到最上面或者沉到最低下。
如:对这一数组进行冒泡排序:int a[5]{34,12,56,4,7}; 假设为从小到大排序
一共需要比较length-1轮:
第一轮: a.34和12比较,12比34小,那么调换位置,此时为:12,34,56,4,7,然后在对该序列进行排序
b.然后就是34和56进行对比,34比56小,不用调换顺序,此时依旧为:12,34,56,4,7,然后在对该序列进行排序
c.然后再就是56和4鸡西宁对比,4比56小,所以将56和4调换顺序,此时序列就是:12,34,4,56,7
d.再然后就对比56和7,7比56小,所以将二者位置进行调换,此时完成第一轮调换,序列为:12,34,4,7,56
我们可以看到第一轮排序之后,已经将序列中的最大值沉到最底部了。
第二轮:此时的排序此时交第一轮要减1,
a.先是12和34对比,前者比后者小,所以不用调换位置,序列时:12,34,4,7,56
...
java内部类讲解,成员内部类,局部内部类,匿名内部类,静态内部类
1 前言java中的类,除了定义在包(package)中之外,还可以定义在一个类的内部,主要有4种,分别是成员内部类,局部内部类,匿名内部类,静态内部类。接下通过代码分析,了解一下什么是java内部类。
2 java内部类介绍2.1 成员内部类成员内部类,顾名思义,也就是该内部类相当于该外部类的一个成员一样,和该外部类中的成员属性或者成员方法同级。
12345678910111213class Circle { private double radius = 0; public Circle(double radius) { this.radius = radius; } class Draw { //内部类 public void drawSahpe() { System.out.println("drawshape"); } }}
2.1.1 成员内部类访问外部 ...
JVM面试题以及字节码讲解
0 前言关于java字节码指令的含义,可以参考这篇博客:Java字节码指令含义解释与指令查询
1 try..catch..finally1.1 catch1.1.1 catch单个异常查看相应的java代码:
12345678910public class FinallyDemo { public static void main(String[] args) { int i = 10; try{ i = 20; }catch (NegativeArraySizeException e){ i = 30; } }}
接下来通过javap -v xxx.class命令,来查看该段源码的字节码反编译之后的信息:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 ...
Java字节码指令含义解释与指令查询
1 反编译获得java字节码信息首先看一段java源代码,然后编译后产生了一个.class文件,使用命令:javap -v xxx.class将其反编译。
123456789101112public class Code { public static void main(String[] args) { int i = 0; int x = 0; while(i < 10){ x = x++; i++; } System.out.println("x="+x);//x=? System.out.println("i="+i);//i=? }}
执行完反编译命令javap -v Code.class之后的信息:
1234567891011121314151617181920212223242526272829303132333435 ...
Java线程安全的集合
1 线程安全的集合
Vector
为什么Vecter是线程安全的呢?查看源代码:
从上面的代码可以看到,每个方法都加上了synchronized关键字,所以它是线程安全的。但是因为它的所有方式都加上了synchronized关键字,那么无论你是否需要对其进行多线程访问时,它都会对其进行锁定,执行效率会很低。现在已经弃用。
HashTable
HashTable和Vector类似,都是在每个方法上加上synchronized关键字来达到线程安全的目的。我们可以从下面的源代码可以看出:
2 java.util.concurrent下的线程安全集合java.util包下有一个concurrent包,下面的集合都是线程安全的集合,当需要使用线程来操作集合时,就调用该包下面的集合。下面看一段线程不安全的集合代码:
1234567891011121314151617181920212223import java.util.LinkedList;import java.util.List;public class ThreadSafe { public ...
什么是内存泄漏?
1 内存泄漏的定义
内存泄漏(Memory leak)是在计算机科学中,由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。
内存泄漏通常情况下只能由获得程序源代码的程序员才能分析出来。
2 内存泄漏导致的后果内存泄漏会因为减少可用内存的数量从而降低计算机的性能。最终,在最糟糕的情况下,过多的可用内存被分配掉导致全部或部分设备停止正常工作,或者应用程序崩溃。
内存泄漏带来的后果可能是不严重的,有时甚至能够被常规的手段检测出来。在现代操作系统中,一个应用程序使用的常规内存在程序终止时被释放。这表示一个短暂运行的应用程序中的内存泄漏不会导致严重后果。
在以下情况,内存泄漏导致较严重的后果:
程序运行后置之不理,并且随着时间的流逝消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理);
新的内存被频繁地分配,比如当显示电脑游戏或动画视频画面时;
程序能够请求即使在程序终止之后也不会被释放 ...
Java线程内部堆内存溢出,并不会导致主线程退出
1 代码123456789101112public class HeapThread { private static final int _8M = 8 * 1024 * 1024; //vm 参数:-Xmx20m 设置堆内存为20M public static void main(String[] args) throws InterruptedException { new Thread(()->{ List<byte[]> list = new ArrayList<>(); list.add(new byte[_8M]); list.add(new byte[_8M]); }).start(); Thread.sleep(2000L); }}
运行结果:
从运行结果可以看出,线程内部的堆内存溢出,并不会导致主线程结束。
写在最后欢迎大家关注鄙人 ...