这里是软件构造Lab中遇到的问题中的笔记,会随时更新,遇到问题就会放上来。所以时间上会有些出入,前期知识点可能也显得简单,但毕竟是从零开始的Java学习和软件构造。一点点慢慢积累吧~
在写twitter这个部分的时候遇到的问题,无论怎么跑都得不出正确结果,显示的都是NULL,肯定是哪里出了错误,找了很久。因为根本没想到会是==判断比较出现了锅,所以根本没有往这个方面想。最后单步调试发现了是这里出来问题,才知道Java中String类是不能使用 = =进行判断的。以下是做一些总结。
String是一个特殊的包装类数据。当测试两个包装类的引用是否指向同一个对象时,用“= =”。
String 类的对象有两种形式创建:
形式1:String str = “abc”;
形式 2:String str = new String(“abc”) ;
两者都为第一种形式创建的对象的比较
String str1 = “abc”;
String str2 = “abc”;
用语句String str1 = “abc”;创建对象java内部将此语句转换为以下几个步骤:
(1) 先定义一个名为str1 的对String类的对象引用变量。
(2) 在栈中查找有没有存放值为“abc”的存储单元,接着创建一个新的Sting类的对象0,并将对象0指向这个存储单元,而且在栈中记下这个引用的对象0.如果已经有了值为“abc”的地址则查找对象0,并返回对象0的地址。
(3) 将str1指向对象0的地址。Str1指向存在栈中的数据的引用。
String str2 =”abc”;在栈中创建了一个对象引用str2.因为栈中已经有一个值为“abc”的对象0,因此jvm创建了两个引用str1和str2,但只创建了一个对象,而且这两个引用都指向了这个对象,所以这里str1 == str2.
同为第二种形式创建的两个对象的比较
如:
String str1 = new String(“abc”);
String str2 = new String(“abc”);
System.out.println(str1 ==str2);
系统在栈内存中分别创建了两个对象引用变量str1和str2,同时在堆内存中创建了两个对象。两个引用变量分别表示两个不同的对象,无论堆内存中是否有相同的数据存在,也不会像栈中的数据共享。因此str1 != str2.
两种不同形式创建对象的比较
String str1 = new String(“abc”);
String str2 = “abc”;
System.out.println(str1 == str2); //false
str1和str2是栈中创建的两个引用,str1 指向了堆中的一个对象,而str2则指向了栈中的一个对象,即两个引用分别指向不同的两个对象,所以str1 != str2.
字符串值的比较
如果要比较两个字符串的值就用equals()方法。如:str1.equals(str2)只要str1和str2的字面值相等结果就为true.
结论
(1) String str = “abc”;指向String类的引用被创建了。至于这个引用是否指向了一个新的对象,根据上下文来考虑。
(2) String str = new String(“abc”);在栈中创建了一个对象的引用srt,str指向在堆中创建的新对象。该对象值为“abc”的String类。
(3) 当比较包装类里面的数值是否相等时,用equals方法,当测试两个包装类的引用是否指向一个对象的时候,用“==”。
如果第一个匹配就的话,分出的字符串数组第一项,也就是下标是0的那一项会是一个空字符串!!
就是因为这样我很多Tweet都匹配不上!又出了很多bug还调不好。。。。
由于之前一直写python比较多,所以用split也比较多。但是印象中python的split就是如果第一个是匹配的,会直接切掉这一段,然后分出的字符串数组第一项,也就是下标是0的那一项不是空串。但是没有想到Java中不是这样的。查阅官方文档后发现,原来和python的不一样!!!
后来我去查了python的文档,发现是我记错了。。。
总之要记住一点,遇到自己把握不准的函数,就去查官方文档!!
https://docs.oracle.com/javase/8/docs/api/
Java8的官方文档,绝对好用,什么都有,有时候比百度,Google都管用。
老师给了仓库加入了一个自动集成的功能,以后如果脱离了IDE的话就要手动集成或者利用这种自动集成工具来帮助集成,建议大家学学配置,这一次配置遇到了很多坑,在这里总结一下。
首先我是在Eclipse中配置的。
首先在百度上查了查,发现要先有.travis.yml,所以就照着网上的来了一遍。
就三行
language: java
jdk:
- oraclejdk8
然后push上去,发现它开始自动集成了,很高兴,但是得到了一个错误的结果:
发现问题是:build.xml does not exist!
所以是缺少了build.xml。所以又去百度查了查,发现Eclipse可以自动生成build.xml!这么方便,赶紧试一下!
首先对准项目,右键,在菜单中找到"导出(O)"
然后选择Ant构建文件
勾选要进行自动生成的项目,点击完成即可。
然后就会发现项目中多了一个build.xml
再来一次!push!结果发现还是失败了
这一次百度也没有结果。很难受,去问已经搞定了大佬们,大佬说是我的.travis.yml有问题!没有指定build的方法。要再加上一行:
language: java
jdk:
- oraclejdk8
script: ant build
加上那一行后,push,果然成功!
大佬还告诉了我一个坑点,就是代码中一定不能有中文,如果中文是UTF-8也行,但是如果是别的,就会build失败。提示是有非UTF-8字符。还好我写的都是傻瓜英语注释,所以没有出现这类问题。
我开始上传GitHub的时候,每次都显示上传失败,没有权限。要么就是每次都要我输入密码,很麻烦,想要简单一点,就直接push就好的那种。
开始找方法,发现如果利用ssh作为加密传输的话,不用每次都验证身份了,而且权限也是开放的,所以就想搞一套。以下是踩完坑后的正确流程:
打开git bash 或者 windows powershell也行。输入以下的代码,用你的GitHub email注册地址。
$ ssh-keygen -t rsa -b 4096 -C "[email protected]"
这会根据你的Email创建一个ssh密钥对
> Generating public/private rsa key pair.
然后它会提示你将ssh存在哪个位置
> Enter a file in which to save the key (/c/Users/you/.ssh/id_rsa):[Press enter]
这个时候直接按回车确认就好了。
然后你需要为这个ssh设置密码
> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]
都设置好了后,新的ssh密钥就建好了!
然后你需要把它加到你的ssh-agent中
首先手动启动ssh-agent
# start the ssh-agent in the background
$ eval $(ssh-agent -s)
然后将你刚刚存在默认位置的ssh密钥加入到ssh-agent中
$ ssh-add ~/.ssh/id_rsa
最后,将你的ssh密钥加入到GitHub中,这样,你每次都是授权的push和clone以及pull了!不用再输入密码了!
首先在GitHub页面的右上角头像中找到Settings
在Settings中找到 SSH and GPG keys项
然后选择 New SSH key
在Title中加上你对这个密钥的命名,然后再Key中把你的Key粘贴进去。
用如下方法在命令行中将ssh加入到你的剪贴板
$ clip < ~/.ssh/id_rsa.pub
# Copies the contents of the id_rsa.pub file to your clipboard
粘贴好后,然后点Add SSH key就可以啦!尽情的享受不用总是输密码的push吧!