关闭

程序猿随想

标签: androidgithub反编译多线程IDEA
288人阅读 评论(0) 收藏 举报
分类:

  • 5.30杂谈
    今天先记录几个关键词吧(Android学习方面),也很迟了zzz: 多线程、反编译(dex2jar和jdgui)、okhttp、retrofit(对okhttp进行封装)、学习网站:CSDN、Github、appxcode、博客园(cnblogs)、极客学院、CSDN学院、Android官网、Segmentfault、cnbeta(资讯类)。

  • 5.31随想

    今天还是主要在学习之前下好安装好的IntelliJ IDEA的使用,上手也不算难,也试了一个web项目和一个用了SSH框架的web项目,很爽 (≧▽≦)/和Eclipse、Myeclipse相比较只能用四个字形容感受:相见恨晚!╮(╯▽╰)╭ 1.8的JDK环境加Tomcat8的本地服务器,不知道是IDE优化了还是各种加成,重新部署项目很快,点一下Run汤姆猫6,7秒就Redeploy好了,这可真是比用Myeclipse+JDK1.6+Tomcat7快的多了。还有一个必须提的就是代码提示很强大,快键键也很多(因为和Android Studio是同平台产品的所以快捷键完全一样)。说说遇到的问题吧,最令我印象深刻的是,这Spring的applicationContext.xml里面配的数据库连接改了之后还是原来那个数据库,很怪,用IDEA自带的Database管理工具改变了连接的数据库参数好像也是没有什么变化,后台的Hibernate的DAO还是会到原来那个数据库那里去访问数据,甚至我把applicationContext.xml数据库的连接信息的

     <property name="url"value="jdbc:mysql://localhost:3306/xyb"></property>

去掉最后的数据库名字(xyb)变成 “jdbc:mysql://localhost:3306/” 这样居然也能对数据访问和操作,而且还是最初的那个数据库(xyb),这真是日了鬼了,确实是没怎么想明白——6月2日补充:是可以在hbm.xml中更改连接的数据库名字的,疏忽了

//Account.hbm.xml
<hibernate-mapping>
    <class name="com.po.Account" table="account" catalog="xyb">
    ……
</hibernate-mapping>

,对了,IDEA里用SQL语句也有代码提示,,挺方便的吧。还有Android Studio里菜单栏下面有一排工具栏,怎么IDEA里一个都没了,嗯,原来是要手动显示菜单栏中的View->Toolbar,打上勾就出来了。
默认不显示工具栏Toolbar
打开了Toolbar
然后今天还更熟悉了foreach遍历集合,发现(对于我算是发现了)当集合中没有元素时(不为NULL)用foreach去遍历并且在遍历中使用遍历的对象并不会报出异常,这就很明显了,当遇到不为NULL的空集合时foreach一次也不会循环,这真是奈斯。


  • 6.1记录

    IDEA关闭重复代码检测:Settings->搜索Duplicated code,把勾取消。
    

    SSH框架下的用JUnit和Spring-test进行单元测试(直接在单元测试类中操作和验证数据库中的数据)。参看文章《SSH框架下用JUnit+spring-test单元测试》。
    今天还熟悉了Map用entrySet遍历的方法,并且将Map对象作为List集合的元素。entry就相当于Map中的一个实体。通过entry.getKey( )和entry.getValue( )方法可以很方便地得到这个实体的键和值。上代码了。

       List<Map<String,String>> list1=new ArrayList<Map<String,String>>();
        Map<String,String> map1=new HashMap<String, String>();
        map1.put("heihei", "heihei");
        map1.put("haha", "haha");
        Map<String,String> map2=new HashMap<String, String>();
        map2.put("lel", "lele");
        map2.put("nunu", "nunu");

        list1.add(map1);
        list1.add(map2);
        String ke;
        String va;
        for(Map.Entry entry2:map2.entrySet()){
            ke=entry2.getKey().toString();
            va=entry2.getValue().toString();
            System.out.println("key:"+ke+", "+"value:"+va);
        }

输出:
key:lel, value:lele
key:nunu, value:nunu

遍历以Map为集合元素的List:

        for(Map<String, String> map3:list1){
            Iterator iterator2=map3.entrySet().iterator();
            while(iterator2.hasNext()){
                Map.Entry entry=(Map.Entry)iterator2.next();
                ke=entry.getKey().toString();
                va=entry.getValue().toString();
                System.out.println("key:"+ke+", "+"value:"+va);
                System.out.println("");
            }

输出:
key:haha, value:haha

key:heihei, value:heihei

key:lel, value:lele

key:nunu, value:nunu


  • 6.4记录
    Java判断字符串内容是否为数字方法之一:利用正则表达式
String str="64738";
boolean result=str.matches("[0-9]+");//result为true或false
//matches方法判断是否匹配所给的正则表达式

判断是否为浮点数:

  public static boolean isDouble(String str) {    
    Pattern pattern = Pattern.compile("^[-\\+]?[.\\d]*$");    
    return pattern.matcher(str).matches();    
  }  

final关键字修饰时该类不能被继承
final关键字修饰方法时该方法不能被其子类方法覆盖(覆盖表示子类方法中参数类型、或参数个数、或参数顺序不同)
final关键字修饰变量时该变量的值不能改变,该变量不能再去指向别的对象,一旦初始化后无法改变。但其指向的对象的值可以改变,如:

static String b="222";
final static String a=b;
System.out.println(a);//输出"222"
b="3333";  
System.out.println(b); //输出"3333"
System.out.println(a);//还是输出"222",因为前面已经初始化赋值了b的值"222",值不再更改

  • 6.9随想
    Java中一个方法中的匿名内部类调用该方法中的局部变量时,该变量必须在方法中声明为final,如
        final TextView tvtopkymn=(TextView)popupView.findViewById(R.id.tvtopktmn);
        tvtopkymn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tvtopkymn.setText("我是调用final变量");
            }
        });

这是为了克服局部变量和内部类之间生命周期的不一致性,内部类的生命周期比方法(等同于局部变量的生命周期)要长。设想一下:方法f被调用,从而在它的调用栈中生成了变量i,此时产生了一个局部内部类对象 inner_object,它访问了该局部变量i .当方法f()运行结束后,局部变量i就已死亡了,不存在了.但:局部内部类对象 inner_object还可能一直存在(只能没有人再引用该对象时,它才会死亡),它不会随着方法f()运行结束死亡.这时:出现了一个”荒唐”结果:局部内部类对象 inner_object要访问一个已不存在的局部变量i!


  • 6.16记录
    java.lang.String中的split方法,实现方法为
    public String[] split(String regex)根据给定正则表达式的匹配拆分此字符串,将所有符合条件的都拆分完全,相当于下面一种的limit参数为0。
    或者
    public String[] split(String regex,int limit)根据匹配给定的正则表达式来拆分此字符串,limit参数限制目标数组中的元素个数,即该模式最多应用(limit-1)次就不再继续往下拆分;如果limit为0,则拆完为止,和不带这个limit参数结果一样。
    举个栗子
public class Test{
   public static void main(String args[]){
      String Str = new String("Welcome-to-cheetahlou-cheetah.com");

      for (String retval: Str.split("-", 2)){
         System.out.println(retval);
      }
      System.out.println("");

      for (String retval: Str.split("-", 3)){
         System.out.println(retval);
      }
      System.out.println("");

//limit参数为0
      for (String retval: Str.split("-", 0)){
         System.out.println(retval);
      }
      System.out.println("");
//无limit参数,其实就是limit参数为0
      for (String retval: Str.split("-")){
         System.out.println(retval);
      }
   }
}

输出结果将是:

Welcome
to-cheetahlou-cheetah.com

Welcome
to
cheetahlou-cheetah.com

Welcome
to
cheetahlou
cheetah.com

Welcome
to
cheetahlou
cheetah.com

另外,
1、如果用“.”作为分隔的话,必须是如下写法:String.split("\\."),这样才能正确的分隔开,不能用String.split(".");
2、如果用“|”作为分隔的话,必须是如下写法:String.split("\|"),这样才能正确的分隔开,不能用String.split("|");
“.”和“|”都是转义字符,必须得加”\”;
3、如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如:“a=1 and b =2 or c=3”,把三个都分隔出来,可以用String.split("and|or"); 再比如:String str="Java string-split#test",可以用Str.split(" |-|#")把每个字符串分开。


  • 6.19记录
    CSS中margin和padding的区别用图表示为
    这里写图片描述

-6.24感想
没什么具体的代码方面的想说,只是想到今天考完了可能是大学最后一门考试,也是有些感慨,感慨里夹杂着一丝丝害怕,一丝丝莫名的害怕,也许是我的内心不够强大,还是会有对未知未来的不确定,有时候还真是会想未来啊你来的慢一点,But,the only thing we can do is KEEP GOING!


  • 7.6记录
    用shiro框架验证登录:根据url过滤用户,设计用户组和权限,密码加密,记住密码登录

  • 8.6记录
    对于 Android 深入的点会问一些自定义组件、性能优化,屏幕适配,IPC、Binder的理解,插件化,常用开源库以及原理等等。

  • 10.6记录
    回调方法,另见摘录的博文《Java中的回调(摘录)》。

  • 11.7记录
    jQuery是一个类数组对象,而DOM对象就是一个单独的DOM元素。

  • 2017.1.2记录
    好的命名相当于给代码加了一段有用的注释

  • 2017.2.13记录
    jQuery的常用功能总结
    • 在 DOM 树中进行查询
    • 修改 DOM 树及 DOM 相关操作
    • 事件处理
    • Ajax
    • Deferred 和 Promise
    • 对象和数组处理
    • 还有一个一直在用却很难在列清单时想到的——跨浏览器

  • 2017.3.5记录
    Java中String的拆箱装箱
    先看个例子:
    String str1 ="abc";
    String str2 ="abc";
    System.out.println(str2==str1);  //输出为 true 
    System.out.println(str2.equals(str1));  //输出为 true 

    String str3 =new String("abc");
    String str4 =new String("abc"); 
    System.out.println(str3==str4);  //输出为 false 
    System.out.println(str3.equals(str4));  //输出为 true

再看个例子:

    String d ="2"; 
    String e ="23";
    e = e.substring(0, 1);
    System.out.println(e.equals(d)); //输出为 true 
    System.out.println(e==d); //输出为 false

第二个例子中,e的初始值与d并不同,因此e与d是各自创建了个对象,(e==d)为false 。
同理可知,第一个例子中的str3与str4也是各自new了个对象,而str1与str2却是引用了同一个对象。
补充:obj1==obj2 判断是obj1,obj2这两个引用变量是否相等,即它们所指向的对象是否为同一个对象。言外之意就是要求两个变量所指内存地址相等的时候,才能返回true,每个对象都有自己的一块内存,因此必须指向同一个对象才返回ture。


  • 2017.3.10记录
    Java跳出多重循环
    在Java中,如何跳出当前的多重嵌套循环?
    答:在最外层循环前加一个标记如A,然后用break A;可以跳出多重循环。(Java中支持带标签的break和continue语句,作用有点类似于C和C++中的goto语句,但是就像要避免使用goto一样,应该避免使用带标签的break和continue,因为它不会让你的程序变得更优雅,很多时候甚至有相反的作用,所以这种语法其实不知道更好)

  • 2017.3.19记录
    类加载器工作机制

    1.装载:将Java二进制代码导入jvm中,生成Class文件。

    2.连接:a)校验:检查载入Class文件数据的正确性 b)准备:给类的静态变量分配存储空间 c)解析:将符号引用转成直接引用

    3:初始化:对类的静态变量,静态方法和静态代码块执行初始化工作。

    双亲委派模型:类加载器收到类加载请求,首先将请求委派给父类加载器完成

    用户自定义加载器->应用程序加载器->扩展类加载器->启动类加载器。


2017.4.20记录
Android Studio 项目push到GitHub报错

Can't finish GitHub sharing process
        Successfully created project 'CareU' on GitHub, but initial push failed:
        unable to access 'https://github.com/cheetahlou/CareU.git/': error setting certificate verify locations:

找了很久没有发现原因,后来发现是CA证书的问题,电脑重装过一次Git没有重新安装过,CA证书没有导入,在Git安装目录中安装证书(有好几个,我装了其中的一两个,举例如下路径),然后再在Android Studiopush一次,会跳出windows证书提示你输入github的账户密码,success后就可以正常使用了。

    "G:\Android\Git\mingw64\ssl\certs\ca-bundle.crt"

  • 2017.5.4一点记录
    GroupId、ArtifactId

    Maven项目的GroupId相当于公司和部门名,ArtifactId相当于项目名
    

  • 2017.6.17记录
    Socket连接建立流程
    1. 服务端实例化ServerSocket
    2. 服务端执行accept()监听指定端口
    3. 客户端实例化Socket尝试连接服务器(IP,port)
    4. TCP三次握手成功,服务端的accept()返回Socket实例,同时客户端的Socket实例创建成功。

  • 2017.6.20记录
    不同变量默认值
    · 对基本数据类型来说,对于类变量(static)和全局变量,如果不显式地对其赋值而直接使用,则系统会为其赋予默认的零值,而对于局部变量来说,在使用前必须显式地为其赋值,否则编译时不通过。
    · 对于同时被static和final修饰的常量,必须在声明的时候就为其显式地赋值,否则编译时不通过;而只被final修饰的常量则既可以在声明时显式地为其赋值,也可以在类初始化时显式地为其赋值,总之,在使用前必须为其显式地赋值,系统不会为其赋予默认零值。
    · 对于引用数据类型reference来说,如数组引用、对象引用等,如果没有对其进行显式地赋值而直接使用,系统都会为其赋予默认的零值,即null。
    · 如果在数组初始化时没有对数组中的各元素赋值,那么其中的元素将根据对应的数据类型而被赋予默认的零值。


  • 2017.6.30记录
    Java取模运算
    Java中取模运算%的结果的正负符号和被除数一致。
    如:

    17 % 10 = 7;
    -17 % 10 = -7;
    -17 % (-10) = -7;
    

  • 2017.8.4记录
    count(1),count(*)和count(column)
    如果你的数据表没有主键,那么count(1)比count(*)快
    如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快
    如果你的表只有一个字段的话那count(*)就是最快的啦
    count(*) count(1) 两者比较。主要还是要count(1)所相对应的数据字段。
    如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。
    因为count(),自动会优化指定到那一个字段。所以没必要去count(1),用count(),sql会帮你完成优化的
    因此:count(1)和count(*)基本没有差别!
    count(*)和count(column)比较时,和选取的column有关,越靠后越慢,column有索引时,如果索引可以为null则count(column)较快,如果索引要求不为null则两者一样快。
    综合来看,大多数场景可以大胆地使用count(*)。


  • 2017.8.7记录
    Mybatis中如果使用ResultType而不是ResultMap的话,以实体类为接收对象举例,默认实体类中的属性名要和数据库中的字段名相同才能得到数据,也可以和别名相同。如属性名是userName,则select t.user_name as userName,也能接收成功。

    SpringMVC中如果要接收多个参数可以用(HttpServletRequest request)获取,然后用request.getParameter(“参数名”)获取参数值。

    @RestController注解

    A convenience annotation that is itself annotated with @Controller and @ResponseBody. Types that carry this annotation are treated as controllers where @RequestMapping methods assume @ResponseBody semantics by default.
    注解本身使用@Controller和@ResponseBody注解。使用了这个注解的类会被看作一个controller-使用@RequestMapping的方法有一个默认的@ResponseBody注解。
    @ResponseBody – As of version 4.0 this annotation can also be added on the type level in which case is inherited and does not need to be added on the method level.
    @ResponseBody也可以加到类一级,通过继承方法一级不需要添加。


  • 2017.8.10记录
    sql中用union all或in代替or

应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。而改用union之后,性能就大大提高了。
使用”union all”的性能比”union”更高一些。因为当SQL 语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序。 如果用UNION ALL替代UNION, 这样排序就不是必要了,效率就会因此得到提高。

select * from Member where MemberName = '张三' 
union all
select * from Member where MemberName = '李四'select * from Member where MemberName in ('张三','李四')

来代替or
select * from Member where MemberName = '张三' or MemberName = '李四'
相关链接:避免全表扫描,提高sql查询效率

  • MySQl的全表扫描情况
 在以下几种条件下,MySQL就会做全表扫描: 
1)  数据表是在太小了,做一次全表扫描比做索引键的查找来得快多了。当表的记录总数小于10且记录长度比较短时通常这么做。 
2)  没有合适用于 ONWHERE 分句的索引字段。 
3)  让索引字段和常量值比较,MySQL已经计算(基于索引树)到常量覆盖了数据表的很大部分,因此做全表扫描应该会来得更快。 
4)  通过其他字段使用了一个基数很小(很多记录匹配索引键值)的索引键。这种情况下,MySQL认为使用索引键需要大量查找,还不如全表扫描来得更快。

 对于小表来说,全表扫描通常更合适。但是对大表来说,尝试使用以下技术来避免让优化程序错误地选择全表扫描: 
 1)  执行 ANALYZE TABLE tbl_name 更新要扫描的表的索引键分布。 
 2)  使用 FORCE INDEX 告诉MySQL,做全表扫描的话会比利用给定的索引更浪费资源。 
 SELECT * FROM t1, t2 FORCE INDEX (index_for_column) 
 WHERE t1.col_name=t2.col_name; 
 3)  启动 mysqld 时使用参数 --max-seeks-for-key=1000 或者执行 SET max_seeks_for_key=1000 来告诉优化程序,所有的索引都不会导致超过1000次的索引搜索

  • 2017.8.11记录
    ajax跨域处理

1.在response的头文件添加

httpServletResponse.setHeader("Access-Control-Allow-Origin","*");

2.SpringMVC解决跨域问题的注解

@CrossOrigin("http://test.com")
@CrossOrigin(origins="http://test.com",maxAge=3600)

Ajax请求SpringMVC返回到浏览器中文乱码
原因:Spring在处理@ResponseBody这个annotation的时候,org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter使用了org.springframework.http.converter.StringHttpMessageConverter进行处理,而StringHttpMessageConverter默认了字符编码为ISO-8859-1(如下):

 public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
  • 解决办法一
    使用SpringMVC提供的在@RequestMapping中加入produces注解
@RequestMapping(value = "/xxx", method = RequestMethod.GET,produces = "text/plain;charset=UTF-8")

  • 2017.9.23记录 linux服务器能ping通ip不能ping通域名
    做的电商项目调用物流网站的API时服务器一直请求不到,而本地电脑可以,还以为时json解析的问题,排查了好久发现是服务器解析域名的问题
    问题:ping: unknown host www.kuaidi100.com
    先查看
    # cat /etc/resolv.conf
    修改DNS服务
    # vi /etc/resolv.conf
    添加nameserver(公共DNS服务器),如

nameserver 8.8.8.8
nameserver 223.5.5.5


  • 2017.9.26记录 Java中Date加一天,和Calendar转化
     Calendar curCal= Calendar.getInstance();
     curCal.setTime(new Date());
     curCal.add(Calendar.DATE,-1);
     Date newDate=curCal.getTime();

转自老D博客
一、添加鼠标点击特效:
添加鼠标点击特效,(“富强”, “民主”, “文明”, “和谐”, “自由”, “平等”, “公正” ,”法治”, “爱国”, “敬业”, “诚信”, “友善”)等。

<script type="text/javascript">
/* 鼠标点击特效 */
var a_idx = 0;
jQuery(document).ready(function($) {
    $("body").click(function(e) {
var a = new Array("富强", "民主", "文明", "和谐", "自由", "平等", "公正" ,"法治", "爱国", "敬业", "诚信", "友善");
var $i = $("<span/>").text(a[a_idx]);
        a_idx = (a_idx + 1) % a.length;
var x = e.pageX,
        y = e.pageY;
        $i.css({
"z-index": 999999999999999999999999999999999999999999999999999999999999999999999,
"top": y - 20,
"left": x,
"position": "absolute",
"font-weight": "bold",
"color": "#ff6651"
        });
        $("body").append($i);
        $i.animate({
"top": y - 180,
"opacity": 0
        },
        1500,
function() {
            $i.remove();
        });
    });
});
</script>

效果如图:
点击特效
二、添加评论框输入特效:
添加以下代码到主题尾部调用即可

<script src="activate-power-mode.js"></script>
<script>
POWERMODE.colorful = true; // 控制开启/开启礼花特效  
POWERMODE.shake = false; // 控制开启/关闭屏幕震动特效  
document.body.addEventListener('input', POWERMODE);
</script>

在输入框打字时跟随光标弹出烟花很是炫酷(还可以开启屏幕震动哦!)
true 为开启
false 为关闭
效果如图:
评论特效


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7969次
    • 积分:231
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类