亲自Debug的一些收获

Debug 1

创建两个都是直接赋值的Integer,在对这两个对象进行比较;

//Integer b = 127;
//Integer c = 127;
if (b == c){
    System.out.println("true");
}else{
    System.out.println("false");
}
//Integer d = 128;
//Integer e = 128;
if (d == e){
    System.out.println("true");
}else{
    System.out.println("false");
}

返回结果:
true
false
得出结论:两个都是直接赋值的Integer,如果数在-128到127之间,则是true,否则为false
原因: java在编译Integer i2 = 128的时候,被翻译成-> Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存

看一下源码会明白,对于-128到127之间的数,会进行缓存,Integer b = 127时,会将127进行缓存,下次再写Integer c = 127时,就会直接从缓存中取,就不会new了。
而 == 等于等于比较会比较两个对象的地址,超过128,Integer就会new对象,这样地址就不同了,所以Integer不能 用于超过128的对象的等于等于比较 ==

Debug 2

基础从定义运算开始:
bite:1位。可表示0 1;
byte:8位。可表示0000 0000 ~ 1111 1111。即-127 ~128
short int:16位。可表示 0x0000~0xffff
int 32位。可表示0x00000000 ~ 0xffff ffff
long int:64位。
一般不说明是unsigned。就是有符号的。那么最高位就是符号位。
移位操作分为左移<<,带符号右移>>,和无符号右移>>>
左移统一对右侧空缺位补0.
带符号右移:符号位不变。右移后左侧空缺位补符号位。即对0xffff>>任何位始终是0xffff。
无符号右移:只针对负数而言,连同符号位一起右移,左侧空缺位补0。即对0xffff ffff(-1)>>>0x0f位循环8次后为0.

Debug 3

对于位运算有了更深的理解。一般题目中整数转整数的类型不需要使用StringBuilder。因为即使需要位操作也是可以直接用基础数据类型,不用分解每一位存储到StringBuilder。原因是:在回转整数的过程中,可能出现问题。对于StringBuilder类型需要先转换成string(toString()方法)。然后用Integer.parseInt()方法转换为int型。但是需要注意当拼接的每一位是0或1时。需要将该二进制先转化为十进制再转化为Int。即Integer.parstInt(str,2);<特别注意这里的str在表示负数时仅代表负数的源码>
在转化时如果出现报错NumberFormatException.说明是输入数据有问题。可能值过大。
最大的十进制数为 2147483647 = 0111 1111 1111 1111 1111 1111 1111 1111。是十位数。
且对于二进制的负数需要加‘-’才可以。-2147483648 = -1000 0000 0000 0000 0000 0000 0000 0000
现在看来对负数用补码存储是为了得到1+(-1) = 0的结果。也就是为了能把0错开。。让0只有一个表示。

Debug 4

关于使用牛客编译器的一些注意事项。在返回字符串时如果有\u0000即 空 的话。就会停止输出。并且返回的字符串无后字符引用符号” 但是这样的问题在idea中不会出现。预测是牛客编译器做了返回值的优化。
为了应对上述问题。首先要明确返回字符数组的位数,并在处理过程中严格遵守。使返回字符串不会出现\u0000。
还有就是对于基础知识的掌握不到位:在默认初始化是空值(\u0000)而你要的应该是空格字符(‘ ’)。这两个存在本质差别。不能漏掉考虑。
几个Java函数:
Arrays.fill(charnum,' ' );//对字符数组赋统一值.扩展:Collections.fill(List,"TP")可以对集合类中的list数据结构填充值

对字符数组或字符串数组赋值的两种方法:
//静态赋值
char[] a = {'a','d','s','f'};
char[] b = new char[]{'q','e','w','r'};
//动态赋值
char[] c = new char[5];
c[0] = 'a';
c[1] = 'b';
c[2] = 'c';
c[3] = 'd';
c[4] = 'e';
对字符串数组同样的
//静态赋值
String[] a = {"a","s","d","f";
String[] b = new String[]{"q","w","e","r"};
//动态赋值
String[] s = new String[5];
s[0] = "a":
s[1] = "b":
s[2] = "c":
s[3] = "d":
s[4] = "e":


Debug 5

随着经典题目的重做,我对数据结构的认识进一步加深了,现在Debug也更加有方向。今天发现一个很重要的问题,算是架构方面的事吧:对于参数传递的理解:当传递值的时候,是传递了数值的副本到子函数,在返回后不改变原来的值。而对于传递引用的问题,把引用当成参数传递到子函数的时候,在子函数中如果new一个对象全盘复制原来的对象做操作,那么新复制的对象对原来引用不产生影响。相当于数据包的传递。这时需要主函数接收返回值。
另外一种方法是直接利用传递到子函数的引用。所有的引用都指向同一块存储区域,也就是对于传递了数组名即数组地址的函数,在操作数组名锁对应的形参时也在操作主函数中的数组结构。子函数不需要返回值也可以改变主函数的数组结构。但这种方式存在内存泄漏和越界访问的风险。
涉及到了Java内存模型和运行机制的核心问题。传递引用类型和传递值类型两种都是传递的值的副本。
在传递引用类型中是地址值的副本,这将直接修改数组对应地址的值。对于包装类如String来说,其在堆上创建了空间。传递了对应堆内存的地址值,当包装类如String被更改后,将在常量池中添加新的字符串。这些改变就改变了传入引用类型的地址值副本也就无法在主函数中追溯到子函数的地址引用。那么就不会在主函数中体现改变。
对于new的对象,需要讨论它是否在子函数中也被创建了副本,如果在子函数中有副本那么和考虑String相同,无法传回主函数。因为指向了新的堆内存空间。 如果该对象只在主函数中new过,传递到子函数中传递了地址值的副本,在子函数中并未new该对象,而是使用了构造方法set(),那么是对原来的内存空间的对象做了改变,在主函数中将得到体现。如果没有显性地使用构造方法,那么会隐性使用默认构造器来判断是否对原来的对象做出了改变,如果做出了改变就会在主函数体现,从而说明这时的引用地址仍然是原来堆中内存的地址。

Arrays,copyofRange(int[],start,end);
这个函数将原数组从start到end的数据(左闭右开)拷贝到一块新的内存中。这将极大的方便数组的参数传递。且不改变原数组结构

Debug 6

通过昨天的笔试发现了自己的很多问题,首先做题应该先挑自己会做的。。没想到最后一题会简单、
然后还是对api不熟悉。最基本的数字转字符的库函数还没用好。。自己造轮子肯定不行啊。还有输入输出还是不够熟悉。多行输入多行输出怎么能只用一个nextInt()呢,应该用hasNext().保证形式和要求的输出格式一样即可。。。可以有多种写法。
数字转字符串的库函数:String.valueOf(double d);
字符串转数字库函数:Integer.parseInt(String s):或者Integer,valueOf(String s);

Debug 7

关于输入输出的问题。这个问题虽然不算是算法问题但是在笔试中也非常重要,接收数据的形式是我总结的重点。
普通的就不必说了:int接收,用sc.nextInt()。接收double用nextdouble().
经调试。对于连续输入也可以用nextInt接收如“1 2 3 4 5 6 7 8”;但数字中间不能有‘,’如“1,2,3,4,5,6,7,8”
通常连续输入用nextLine接收再做字符分隔。如sc.nextLine().split(",").这里涉及到split的使用不能分隔转义字符如‘.’ ‘|’ ‘*’ ‘+’ 需要在前面加“\”.
对于数组的输入形式:可采用对每个数组的结果换行显示再循环的方式。一般也不会告知数组的长度。此时不能用nextInt接收。会存在很大的问题,包括数据覆盖错位和下标溢出。
给定[1,2,3,4,5]表明测试是多个整型数组,这是其中一个。
给定[[1,2],[3,4]]表明测试是多个二维矩阵,这是其中一个二维矩阵。接收时按行接收使用nextInt()即可。
给定[“sada”] 表明测试是多个字符串,一次测试输入一个字符串。
给定[“sdas”,“sdffg”]表明一次输入多个字符数组。测试是字符串数组。处理时要分个处理。在处理输入时直接用nextLine接收数据不需要处理双引号“”

Debug 8

多记几遍:>>表示带符号位右移。>>>表示不带符号位右移。
对负数进行>>结果为负数。相当于除法
对负数进行>>>结果为正数

对于负数最大值Integer.MIN_VALUE。取相反数还是得到本身。取Math.abs()还是得到本身。
最简单的方式就是 long x = -(long) Integer.MIN_VALUE;得到绝对值Integer.MIN_VALUE。

Debug 9

关于比较器的几种写法与说明。
写法1:新建一个类实现(implement)Comparable接口,然后重写compareTo()方法。然后new 这个类的对象。调用Collection.sort(class)方法。达到重排序的目的。
写法2:匿名内部类**Collections提供的第二种排序方法sort(List list, new Comparator<? super T> c)**在sort方法中加入一个参数。重写compare方法。
写法3:与2类似:直接声明参数不需要new Comparator<> Arrays.sort(Arrays,(s1,s2)->s1.compareTo(s2));

重点关注compareTo方法的两个参数,如上所示的是比较数组Arrays中各个字符串的字典序大小。
如Arrays.sort(Arrays,(s1,s2)->(s1+s2).compareTo(s2+s1));比较的是数组Arrays中任意取两个字符串,将其拼接后,得到字符串字典序正序的原来字符串的排序。
具体解析见:https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/collection/Java%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98.md#ArraylistLinkedList

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。1

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. 注脚的解释 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值