<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Squirrellsf</title>
    <description>个人博客空间</description>
    <link>https://squirrellsf.github.io/</link>
    <atom:link href="nathanrooy.github.io/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Sat, 29 Feb 2020 12:09:54 +0000</pubDate>
    <lastBuildDate>Sat, 29 Feb 2020 12:09:54 +0000</lastBuildDate>
    <generator>Jekyll v3.8.5</generator>
      
    
    <item>
        <title>2020.2.28 字节跳动笔试</title>
        <description>&lt;h1 id=&quot;2020228-字节跳动笔试&quot;&gt;2020.2.28 字节跳动笔试&lt;/h1&gt;
&lt;p&gt;       2.27号下午收到了实习生笔试（部门：效率工程EE）通知，临时准备了一下，了解了笔试的流程，看了看之前字节跳动的笔试真题，本来准备晚上做的，但是感觉题看得差不多了，就提前到了下午做，没想到直接凉凉。。。&lt;br /&gt;
            看的过往的面试题都是以情景题居多，但这次90min两道题，没有任何情境，完全是数据结构硬上，最后一道都没有ac，还是挺沮丧的。所以认真把笔试面试的内容记录一下，慢慢积累经验吧。&lt;/p&gt;

&lt;h2 id=&quot;第一题无向无环图的直径给定节点数量和边求直径&quot;&gt;第一题（无向无环图的直径）：给定节点数量和边，求直径。&lt;/h2&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;输入数据：
1
9
1 2
2 3
3 4
2 5
4 6
5 7
8 5
8 9
输出：
6
最远的边为节点6和9，距离为6.
说明：输入数据第一行为测试用例的个数N；第二行为该测试用例中的节点数M；剩下的表示节点间有边。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;       因为自己在数据结构方面比较薄弱，没有复习到，所以看到题的时候很懵逼，一路做下来也很懵逼，想了各种数据结构都没找到最好的进行处理的结构,感觉最合适的是用矩阵，但是没有找到规律。&lt;br /&gt;
   总结一下什么是无向无环图的直径：&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;在无向还通图中，最长的通路称作其直径（diameter)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;       在网上找了一圈这道题的解法，没有找到真正有用的，我感觉可能可以从邻接表或者图的广度优先搜索出发？先在这里给自己抛个砖，这段时间补一下图论的相关知识，找到解法之后再来更新。&lt;br /&gt;
   ***&lt;/p&gt;

&lt;h2 id=&quot;第二题二叉树的左视图以数组形式输入一个二叉树求二叉树的左视图&quot;&gt;第二题（二叉树的左视图）：以数组形式输入一个二叉树，求二叉树的左视图。&lt;/h2&gt;
&lt;p&gt;       最开始不知道二叉树的左视图是什么意思，题目说明里边给了一个链接，还不能复制，傻乎乎地手写进地址栏，结果打不开。。。只好根据说明自己推理了一下，大概觉得就是输出二叉树每一行的第一个非空节点（广度优先）。&lt;br /&gt;
   &lt;img src=&quot;/images/15828918516925/15828952038773.jpg&quot; alt=&quot;&quot; /&gt;
          到网上找了一张图，左视图的直观解释就是：“从二叉树左边看这棵树，你能看到的结点”。和我之前理解的应该差不多。&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;   输入：数组形式的二叉树，“#”表示空节点，如果只输入“#”的话，代表输入了一个根节点为空的树。
   1 2 3 # # 4 6 # # # # # # # 8
   输出：[1 2 4 8]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;       这道题最开始没有什么思路，因为不是典型的TreeNode形式的输入，而是直接给了数组，所以也没想到怎么从队列及广度优先去入手。看着数组想了半天，没辙，只好尝试用暴力法去解了：&lt;br /&gt;
          因为所有的空节点都用“#”代替了，不存在二叉树上的空节点在数组中不表示出来的情况，所以可以按层次，以2的n次幂来做：&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;   public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        if(line.equals(&quot;#&quot;)){
            System.out.print(&quot;#&quot;);
            return ;
        }
        String[] nodes = line.split(&quot; &quot;);
        //存储结果
        ArrayList&amp;lt;String&amp;gt; result = new ArrayList&amp;lt;&amp;gt;();
        //遍历数组
        for(int i = 0;i&amp;lt;nodes.length;i++){
            //每一层在数组中的开始下标
            int sum = 0;
            //第i层的节点个数为2的i次方。
            int pow = (int)Math.pow(2,i);
            //遍历一层，找到第一个非空节点
            for(int j = sum;j&amp;lt;sum+pow;j++){
                if(!nodes[j].equals(&quot;#&quot;)){
                    result.add(nodes[j]);
                    break;
                }
            }
            sum+=pow;
            //当sum等于数组长度时，遍历完毕，跳出循环。
            if(sum==nodes.length){
                break;
            }
        }
        for(String num:result){
            System.out.print(num+&quot; &quot;);
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;       但是不知道为什么，题目提供的测试案例和我自己写的测试案例都能够自测通过，但是提交之后一个case都没有通过。我在想是不是第一个case是处理根节点为空的情况，但是题目没有说明根节点为空这种情况下的输出，所以我输出空字符串和“#”都不能通过。不知道是不是我的代码的确是有问题的？&lt;br /&gt;
          &lt;a href=&quot;https://blog.csdn.net/weixin_43019282/article/details/88729731&quot;&gt;参考链接&lt;/a&gt;里边给了用两个队列去实现左视图的方法，这应该是比较常规的解法，但是要求的是树是比较传统的构造，这样才能实现从队列取出后，将子节点再加到另一个队列中去。&lt;/p&gt;

&lt;p&gt;参考链接：&lt;a href=&quot;https://blog.csdn.net/weixin_43019282/article/details/88729731&quot;&gt;https://blog.csdn.net/weixin_43019282/article/details/88729731&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Fri, 28 Feb 2020 00:00:00 +0000</pubDate>
        
        <link>/java/2020-02-28/%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8%E7%AC%94%E8%AF%95.html</link>
          
        
            <category>Java</category>
        
            <category>面经</category>
        
          
        
            <category>Java</category>
        
          
      </item>
    
    <item>
        <title>记录一次Java域名请求问题</title>
        <description>&lt;h1 id=&quot;java域名请求&quot;&gt;Java域名请求&lt;/h1&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;   这两天重新看了一下刚进实验室时用python写的一个小程序，当时用flask包装成了一个web服务器，给另一个Java项目提供服务，服务的域名就是localhost。把java项目部署到服务器上的时候，在服务器上也启动了python的程序，域名和接口配置也是正确的，但是在前端发送请求之后，python服务一直没办法接收到请求。后来误打误撞在本地启动了python的服务，用服务器上部署的web发送同样的请求，居然能够接收到请求了，而且是本地启动的python服务接收到了请求。  
   仔细检查了一下发现，在发送请求的javascript中直接定义了python服务的域名（localhost）和端口，而js是通过本地的浏览器解析的，在发送请求的时候也就直接请求了本地的localhost而不是服务器的localhost，导致请求没办法发送到服务器上。这也解释了为什么在用Java进行web开发的时候，如果要访问别的域名，都是通过Java提供的HttpServlet来进行数据的包装和请求的发送，避免了直接通过js来发送跨域的请求。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

</description>
        <pubDate>Wed, 18 Sep 2019 00:00:00 +0000</pubDate>
        
        <link>/java/2019-09-18/Java%E5%9F%9F%E5%90%8D%E8%AF%B7%E6%B1%82%E9%97%AE%E9%A2%98.html</link>
          
        
            <category>Java</category>
        
            <category>日常积累</category>
        
          
        
            <category>Java</category>
        
          
      </item>
    
    <item>
        <title>MyBatis 踩坑记录</title>
        <description>&lt;h1 id=&quot;mybatis-日常踩坑&quot;&gt;MyBatis 日常踩坑&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;注解版MyBatis获取自增主键&lt;/em&gt;
在使用MyBatis注解版，往数据库里边Insert文档的时候，一般都不设置id，而是使用自增主键。这时候自增主键在之后的代码中会有更大的作用，所以需要在插入之后获得这个自增主键。
方法有两种：&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;select last_insert_id()&lt;/code&gt;
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; @Insert(&quot;insert into table(content,questionid,active,submit,createtime) values(#{content},#{questionid},  
          1,#{submit},#{createtime})&quot;)
 @SelectKey(statement=&quot;select last_insert_id()&quot;
,before=false,keyProperty=&quot;_id&quot;,resultType=Integer.class,keyColumn=&quot;_id&quot;)
 int insertQuestionItem(QuestionItemInfo questionItemInfo);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;p&gt;其中，keyProperty是对象中想要的数据名（不一定是id，可以是别的字段，但返回的一定是最后插入的内容），keyColumn是对应的数据库字段名.&lt;/p&gt;
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;@InsertProvider(type=OperateSqlProvider.class,method=&quot;insertQuestion&quot;)
@SelectKey(statement=&quot;select last_insert_id()&quot;,
before=false,keyProperty=&quot;bean._id&quot;,resultType=Integer.class,keyColumn=&quot;_id&quot;)
int insertQuestion(@Param(&quot;bean&quot;)QuestionInfo questionInfo);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;p&gt;这是使用Provider代理处理，使用了注解(@Param)，这时keyProperty发生了变化，变为了 【Param名称.属性名称】
在使用provider之后，要在provider方法中进行响应的设置：&lt;/p&gt;
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;@Override
public int insertQuestion(QuestionInfo bean){
 mapper.insertQuestion(bean);//MyBatis操纵数据库，返回的信息已经封装到了bean内。
 return bean.getId();
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;使用options注解
这种方法较为简洁，即：
    &lt;ol&gt;
      &lt;li&gt;写SQL，但不要自己插入主键值&lt;/li&gt;
      &lt;li&gt;配置&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@Options(useGeneratedKeys=true, keyProperty=&quot;对象.属性&quot;)&lt;/code&gt; 这个的作用是设置是否使用JDBC的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;getGenereatedKeys()&lt;/code&gt;方法获取主键并赋值到keyProperty设置的对象的属性中，说白了就是把自增长的主键值赋值给对象相应的属性&lt;/li&gt;
      &lt;li&gt;在插入后，使用对象.主键属性的getXXId()方法 获取主键值
        &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; @InsertProvider(type=OperateSqlProvider.class,method=&quot;insertQuestion&quot;)
 @Options(useGeneratedKeys = true, keyProperty = &quot;bean._id&quot;)
 int insertQuestion(@Param(&quot;bean&quot;)QuestionInfo questionInfo);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;        &lt;/div&gt;
      &lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ol&gt;

</description>
        <pubDate>Tue, 03 Sep 2019 00:00:00 +0000</pubDate>
        
        <link>/java/2019-09-03/Mybatis%E6%97%A5%E5%B8%B8%E8%B8%A9%E5%9D%91.html</link>
          
        
            <category>Java</category>
        
            <category>MyBatis</category>
        
          
        
            <category>Java</category>
        
          
      </item>
    
    <item>
        <title>MyBatis几种Provider的使用</title>
        <description>&lt;h1 id=&quot;mybatis-几种provider的使用&quot;&gt;Mybatis 几种Provider的使用&lt;/h1&gt;

&lt;p&gt;之前在Mybatis踩坑的文章中提到了使用provider的方法， 那里边使用的是通过&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Map&amp;lt;String,Object&amp;gt;&lt;/code&gt;传递bean，在provider中再取出bean,接着设置value的方法。这种方法不能很好地防止sql注入的问题，比如：&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; if(paper.getAuthor()!=null){
     sql.VALUES(&quot;authors&quot;,&quot;'&quot;+paper.getAuthor()+&quot;'&quot;);
 }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;这条语句如果不在paper.getAuthor前后加单引号的话，就可能出现sql注入，导致出现sql语句的语法错误。
其实在使用provider时可以不通过&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Map&amp;lt;String,Object&amp;gt;&lt;/code&gt;传递参数，直接传bean，既可以不用在provider中再去取出bean，也能避免注入的问题。这样在provider中，可以直接用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#{}&lt;/code&gt;取出bean对应的属性。&lt;/p&gt;

&lt;p&gt;参考链接：https://www.cnblogs.com/JoeyWong/p/9457118.html&lt;/p&gt;

</description>
        <pubDate>Mon, 02 Sep 2019 00:00:00 +0000</pubDate>
        
        <link>/java/2019-09-02/Mybatis-%E5%87%A0%E7%A7%8DProvider%E7%9A%84%E4%BD%BF%E7%94%A8.html</link>
          
        
            <category>MyBatis</category>
        
          
        
            <category>Java</category>
        
          
      </item>
    
    <item>
        <title>注解方式使用MyBatis</title>
        <description>&lt;h1 id=&quot;用注解形式使用mybatis非springboot框架&quot;&gt;用注解形式使用MyBatis（非springboot框架）&lt;/h1&gt;
&lt;p&gt;之前用MyBatis一直都是用的mapper.xml文件，在文件里边写sql语句来进行使用的。这样的方式很繁琐，sql语句也不够直观。之前和师兄交流的时候他提到过在公司基本都用的注解的形式配置，所以想尝试用注解方式来使用MyBatis。当然也遇到了很多坑，在此把流程和坑给记录一下，以后遇到相似问题也可以有个参考。&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;配置MyBatis-config.xml 
  使用MyBatis，首先需要配置MyBatis-config.xml。
  文件的内容如下:
  &lt;img src=&quot;/images/15621270135396/15621299218077.jpg&quot; alt=&quot;&quot; /&gt;
  需要注意的是，在configuration标签下的子节点是有顺序的。比如，如果将&lt;environment&gt;放到&lt;properties&gt;之前，则会报错：
&lt;/properties&gt;&lt;/environment&gt;    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; org.xml.sax.SAXParseException; lineNumber: 30; columnNumber: 17; 元素类型为 &quot;configuration&quot; 的内容必须匹配&quot;(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,databaseIdProvider?,mappers?)&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;p&gt;从报错可以看出，MyBatis的配置文件是有顺序且个数是有限定的，’?’表示可以没有但最多只能有一个。
  在配置文件中，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;mappers class=&quot;&quot;&amp;gt;&lt;/code&gt;指定映射接口，即对映射接口的注册。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;mappers resource=&quot;&quot;&amp;gt;&lt;/code&gt;指定mapper.xml文件，即用mapper.xml进行操作。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;mappers class=&quot;&quot;&amp;gt;&lt;/code&gt;也可以在后续的sqlsession中进行注册，之后会提到。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;编写dao类
  在接口类里边，直接用注解的方式写sql语句，该接口类也通过配置文件或者sqlsession进行注册。
  &lt;img src=&quot;/images/15621270135396/15621317206469.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;测试类 
在测试类里边用sqlsession的方式来执行sql语句&lt;br /&gt;
&lt;img src=&quot;/images/15621270135396/15621318349182.jpg&quot; alt=&quot;&quot; /&gt;
注释掉的那行即在sqlsessionfactory中对dao类进行注册。&lt;br /&gt;
在配置sqlsession的时候遇到了一个坑，即在getResourceAsReader方法中，总是会报找不到源文件的错误。因为是maven项目，所以解决这个错误，需要在pom.xml文件中指定项目的源文件路径，指定之后，java.io就知道在哪里去找源文件了。
&lt;img src=&quot;/images/15621270135396/15621319730426.jpg&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
        <pubDate>Wed, 03 Jul 2019 00:00:00 +0000</pubDate>
        
        <link>/java/2019-07-03/%E7%94%A8%E6%B3%A8%E8%A7%A3%E5%BD%A2%E5%BC%8F%E4%BD%BF%E7%94%A8mybatis-%E9%9D%9Espringboot%E6%A1%86%E6%9E%B6.html</link>
          
        
            <category>Java</category>
        
            <category>MyBatis</category>
        
          
        
            <category>Java</category>
        
          
      </item>
    
    <item>
        <title>IDEA单个文件打包</title>
        <description>&lt;h1 id=&quot;idea-将项目中的单个文件进行打包并添加依赖&quot;&gt;IDEA 将项目中的单个文件进行打包并添加依赖&lt;/h1&gt;
&lt;p&gt;Java对类进行打包使其变成可执行的jar包是完成一个项目最基本的操作。
平时需要打jar包的时候，更多的都是对整个项目打包，并且利用maven的插件可以自动添加依赖。
但有些时候需要对一个包含main方法的类进行打包，并且添加相关的依赖。之前查了很久该怎么操作，但网上大部分都是对整个项目进行打包的教程，几乎没有对单个类打包的教程。摸索了大半天偶然发现了maven项目对单个类打包的操作。&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;点击 File-&amp;gt;Project Structure,选择Artifacts
&lt;img src=&quot;/images/15555583396653/15555625554312.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;点击“+”按钮，选择jar，选择empty
&lt;img src=&quot;/images/15555583396653/15555626402467.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/images/15555583396653/15555626534187.jpg&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;对将要打包的jar包进行命名。由于打包的类有package，所以在jar包中也要添加响应的文件层次。建立好文件夹层次之后，再添加类文件的时候，一定要添加编译过后的.class文件而不是.java文件。
&lt;img src=&quot;/images/15555583396653/15555629132034.jpg&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;最重要的一步，在添加好.class文件之后，还没有把用到的相关依赖添加进去。这时候要选中界面右侧的项目，会出现很多依赖包。右键点击你需要的依赖，选择”Extract Into Output Root”.
&lt;img src=&quot;/images/15555583396653/15555630562662.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/images/15555583396653/15555630392125.jpg&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;接下来，点击apply之后，提示需要选择manifest.mf文件，此时可以自行选择将要创建MANIFEST.MF文件的文件夹，会自动创建出一个META-INF文件夹和MANIFEST.MF文件。打开MF文件，在其中添加主类名称：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Main-class:com.database.flight.waterMark&lt;/code&gt;。（也可以在创建文件的时候，在Main Class选项里选择主类。
&lt;img src=&quot;/images/15555583396653/15555633391187.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/images/15555583396653/15555633607826.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/images/15555583396653/15555633054907.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;最后，点击apply、ok之后，点击IDEA的Build选项，选中你要build的artifacts，build就ok了。&lt;/li&gt;
&lt;/ol&gt;

</description>
        <pubDate>Thu, 18 Apr 2019 00:00:00 +0000</pubDate>
        
        <link>/java/2019-04-18/IDEA-%E5%B0%86%E9%A1%B9%E7%9B%AE%E4%B8%AD%E7%9A%84%E5%8D%95%E4%B8%AA%E6%96%87%E4%BB%B6%E8%BF%9B%E8%A1%8C%E6%89%93%E5%8C%85%E5%B9%B6%E6%B7%BB%E5%8A%A0%E4%BE%9D%E8%B5%96.html</link>
          
        
            <category>Java</category>
        
            <category>日常积累</category>
        
          
        
            <category>Java</category>
        
          
      </item>
    
    <item>
        <title>一些小TIPS</title>
        <description>&lt;h1 id=&quot;一些小tips&quot;&gt;一些小TIPS&lt;/h1&gt;
&lt;p&gt;在平时的学习和写代码过程中，经常有些特别小的点，虽然很简单，但是容易忘记或者弄错，在这里记录一下，随时备案。&lt;/p&gt;
&lt;h3 id=&quot;字符串匹配&quot;&gt;字符串匹配&lt;/h3&gt;
&lt;p&gt;Java中，字符串是一种引用数据类型，因此不能直接用”==”来做字符串是否相等的匹配，而应该用”.equals”来做相等的比较。&lt;/p&gt;

&lt;h3 id=&quot;可变参数类型&quot;&gt;可变参数类型&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; public class TestVarArgus {  
     public static void dealArray(int... intArray){            
     }        
     public static void main(String args[]){            
     }  
 }  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;如上所述代码所示，在定义方法的时候，参数类型int后出现了&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;...&lt;/code&gt;，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;int...&lt;/code&gt;就是可变的参数类型，也称为不定参数类型。通过它的名字可以很直接地看出来，这个方法在接收参数的时候，个数是不定的。&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; public class TestVarArgus {  
     public static void dealArray(int... intArray){  
         for (int i : intArray)  
             System.out.print(i +&quot; &quot;);            
         System.out.println();  
     }  
     public static void main(String args[]){  
         dealArray();  
         dealArray(1);  
         dealArray(1, 2, 3);  
     }  
 }  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;参考链接：https://blog.csdn.net/gaojinshan/article/details/32327011&lt;/p&gt;

&lt;h3 id=&quot;转义字符&quot;&gt;转义字符&lt;/h3&gt;
&lt;p&gt;1、如果用“.”作为分隔的话,必须是如下写法,String.split(“\.”),这样才能正确的分隔开,不能用String.split(“.”);&lt;br /&gt;
2、如果用“|”作为分隔的话,必须是如下写法,String.split(“\|”),这样才能正确的分隔开,不能用String.split(“|”);“.”和“|”都是转义字符,必须得加”\”;&lt;br /&gt;
3、如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如,“acount=? and uu =? or n=?”,把三个都分隔出来,可以用String.split(“and|or”);&lt;/p&gt;

</description>
        <pubDate>Wed, 27 Mar 2019 00:00:00 +0000</pubDate>
        
        <link>/java/2019-03-27/%E4%B8%80%E4%BA%9B%E5%B0%8FTIPS.html</link>
          
        
            <category>Java</category>
        
            <category>日常积累</category>
        
          
        
            <category>Java</category>
        
          
      </item>
    
    <item>
        <title>Map的遍历方法总结</title>
        <description>&lt;h1 id=&quot;遍历map&quot;&gt;遍历Map&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;方法一 使用Entry进行键值都需要时的遍历&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; Map&amp;lt;Integer,Integer map = new Hashmap&amp;lt;Integer,Integer();
 for(Map.Entry&amp;lt;Integer,Integer entry:map.entrySet()){
   //获取键
     entry.getKey();
   //获取值
     entry.getValue();
 }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;方法二 在for-each循环中遍历keys或values&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; Map&amp;lt;Integer, Integer map = new HashMap&amp;lt;Integer, Integer(); 
 //遍历map中的键 
 for (Integer key : map.keySet()) { 
   System.out.println(&quot;Key = &quot; + key); 
 } 
 //遍历map中的值 
 for (Integer value : map.values()) { 
   System.out.println(&quot;Value = &quot; + value); 
 }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;方法三 使用Iterator进行遍历&lt;/em&gt;
使用泛型：&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; Map&amp;lt;Integer, Integer map = new HashMap&amp;lt;Integer, Integer(); 
 Iterator&amp;lt;Map.Entry&amp;lt;Integer, Integer entries = map.entrySet().iterator(); 
 while (entries.hasNext()) { 
   Map.Entry&amp;lt;Integer, Integer entry = entries.next(); 
   System.out.println(&quot;Key = &quot; + entry.getKey() + &quot;, Value = &quot; + entry.getValue()); 
 }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;不使用泛型：&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; Map map = new HashMap(); 
 Iterator entries = map.entrySet().iterator(); 
 while (entries.hasNext()) { 
   Map.Entry entry = (Map.Entry) entries.next(); 
   Integer key = (Integer)entry.getKey(); 
   Integer value = (Integer)entry.getValue(); 
   System.out.println(&quot;Key = &quot; + key + &quot;, Value = &quot; + value); 
 }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;参考链接：https://www.cnblogs.com/fqfanqi/p/6187085.html&lt;/p&gt;

</description>
        <pubDate>Tue, 12 Mar 2019 00:00:00 +0000</pubDate>
        
        <link>/java/2019-03-12/%E9%81%8D%E5%8E%86Map.html</link>
          
        
            <category>Java</category>
        
            <category>日常积累</category>
        
          
        
            <category>Java</category>
        
          
      </item>
    
    <item>
        <title>相对路径与绝对路径</title>
        <description>&lt;h1 id=&quot;相对路径与绝对路径&quot;&gt;相对路径与绝对路径&lt;/h1&gt;
&lt;h3 id=&quot;绝对路径&quot;&gt;绝对路径&lt;/h3&gt;
&lt;p&gt;获得本类的位置：&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; URL base = this.getClass().getResource(&quot;&quot;);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;如：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/home/popeye/testjava/build/classes/net/&lt;/code&gt;
根据本类位置获取别的文件的位置&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;String path = new File(base.getFile(),&quot;../../../&quot;+name).getCanonicalPath();
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;得到：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/home/popeye/testjava/name&lt;/code&gt;&lt;/p&gt;

&lt;h3 id=&quot;相对路径&quot;&gt;相对路径&lt;/h3&gt;
&lt;p&gt;结构目录–  &lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DecisionTree/src/com/decisiontree/SamplesReader.java&lt;/code&gt;   &lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DecisionTree/resource/train.txt,test.txt&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;SamplesReader.java:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;String filepath=&quot;resource/train.txt&quot;;//注意filepath的内容；
File file=new File(filepath);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;java.io默认定位到当前用户目录(“user.dir”)下，即：工程根目录”D:\DecisionTree”下，因此，此时的相对路径(以user.dir为基路径的路径)为&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;resource/train.txt&lt;/code&gt;。这样，JVM就可以根据”user.dir”与”resource/train.txt”得到完整的路径（即绝对路径）&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;D：\DecisionTree\resource\train.txt&lt;/code&gt;，从而找到train.txt文件。&lt;br /&gt;
&lt;strong&gt;注意：相对路径的起始处无斜杆”/”;例如：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;filepath=&quot;resource/train.txt&quot;&lt;/code&gt;;而不是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;filepath=&quot;/resource/train.txt&quot;&lt;/code&gt;; //error!&lt;/strong&gt;&lt;/p&gt;

&lt;h5 id=&quot;获取userdir&quot;&gt;获取”user.dir”:&lt;/h5&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;String rootPath = System.getProperty(&quot;user.dir&quot;);//rootPath=运行类的根目录
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

</description>
        <pubDate>Wed, 21 Nov 2018 00:00:00 +0000</pubDate>
        
        <link>/java/2018-11-21/%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84%E4%B8%8E%E7%BB%9D%E5%AF%B9%E8%B7%AF%E5%BE%84.html</link>
          
        
            <category>Java</category>
        
          
        
            <category>Java</category>
        
          
      </item>
    
    <item>
        <title>MongoDB在Java中的简单使用</title>
        <description>&lt;h1 id=&quot;mongodb&quot;&gt;MongoDB&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;JAVA使用MongoDB&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; MongoClient mongoClient = new MongoClient(&quot;localhost&quot;,27017);//连接客户端
 MongoDatabase mongoDatabase = mongoClient.getDatabase(&quot;&quot;);//连接某一数据库
 MongoCollection&amp;lt;DBObject collection = mongoDatabase.getCollection(&quot;&quot;,DBObject.class);//连接某一个集合
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;集合的遍历&lt;/strong&gt;
① collection.find():返回集合中的所有文档（DBObject）&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; MongoCollection&amp;lt;DBObject collection = mongoDatabase.getCollection(&quot;&quot;,DBObject.class);
 for(DBObject dbObject:colletion.find()){
 String str = dbObject.toString();
 }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;从MongoDB中获取文档内容，并进行接下来的一系列操作的基本思路是：&lt;br /&gt;
①取出DBObject对象；&lt;br /&gt;
②对DBObject对象进行操作。&lt;br /&gt;
！！！如果json中有list，转换成BasicDBList进行操作&lt;/p&gt;

</description>
        <pubDate>Wed, 21 Nov 2018 00:00:00 +0000</pubDate>
        
        <link>/java/2018-11-21/MongoDB.html</link>
          
        
            <category>Java</category>
        
            <category>MongoDB</category>
        
          
        
            <category>Java</category>
        
          
      </item>
    
  </channel>
</rss>
